'-------------------------- Описание проекта --------------------------------- 'Проект : XY_Brain 'Автор : ' 'Версия : 1.0.0 от 22.07.2013 ' '-------------------------- Опции компилятора -------------------------------- Declare SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR Declare Reminders = OFF ' Выключить напоминания компилятора Declare Warnings = OFF ' Выключить предупреждения компилятора Declare Optimiser_Level 0 ' Выключить оптимизацию программы ;-------------------------- Общие настройки------------------------------------ Device = 16F73 ' Используемый микроконтроллер Xtal = 20 ' Частота осциллятора 20 МГц '-------------------------- Конфигурация программирования -------------------- Config BODEN_OFF, CP_OFF, PWRTE_OFF, WDT_OFF, HS_OSC '-------------------------- Настройки портов --------------------------------- PortB_Pullups = On ' Выключить подтягивающие резисторы на PORTB Declare All_Digital = OFF ' Установить все порты цифровыми входами/выходами '-------------------------- Регистры специального назначения------------------- '-------------------------- OPTION_REG ---------------------------------------- Symbol PS0 = OPTION_REG.0 ' Бит установки предделителя TMR0 Symbol PS1 = OPTION_REG.1 ' Бит установки предделителя TMR0 Symbol PS2 = OPTION_REG.2 ' Бит установки предделителя TMR0 Symbol PSA = OPTION_REG.3 ' Выбор включения предделителя Symbol T0SE = OPTION_REG.4 ' Выбор фронта приращения TMR0 при внешнем тактовом сигнале Symbol T0CS = OPTION_REG.5 ' Выбор тактового сигнала для TMR0 Symbol INTEDG = OPTION_REG.6 ' Выбор активного фронта сигнала на входе внешнего прерывания INT Symbol NOT_RBPU = OPTION_REG.7 ' Включение подтягивающих резисторов на PORTB '-------------------------- INTCON -------------------------------------------- Symbol RBIF = INTCON.0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7 Symbol INTF = INTCON.1 ' Флаг внешнего прерывания по PORTB.0(INT) Symbol T0IF = INTCON.2 ' Флаг переполнения TMR0 Symbol RBIE = INTCON.3 ' Бит разрешения прерывания по PORTB.4-PORTB.7 Symbol INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT) Symbol T0IE = INTCON.5 ' Бит разрешения прерывания по переполнению TMR0 Symbol PEIE = INTCON.6 ' Бит разрешения прерывания от периферийных устройств Symbol GIE = INTCON.7 ' Бит глобального разрешения прерываний '-------------------------- Начало ------------------------------------------- '-------------------------- Настройка TMR0 для прерываний -------------------- RBIE=0 GIE =0 ' Разрешение глобального прерывания '-------------------------- Начало ------------------------------------------- TRISB=%11111111 TRISC=%00000000 TRISA=%110000 Dim A, B, Delay, T1B, T2B, Math, Temp As Byte Dim X, N, T As Byte Dim T1B_F As Bit Dim ADIR, BDIR As Byte ADIR=1 BDIR=1 Symbol M1V=PORTC.1 Symbol M2V=PORTC.2 Symbol PC=PORTA 'symbol ADIR=portb.2 'symbol BDIR=portb.3 M1V=1 M2V=1 Delay=100 A=1 B=1 T=0 '------------------------------------------------------------ On_Interrupt GoTo Int_Label GoTo MainProgram '-------------------------- Прерывания-------------------------- Int_Label: Context Save ' Context Restore ' Возврат из обработчика прерывания '-------------------------- Главная программа ------------------------- '-------------------------- Главная программа ------------------------- MainProgram: 'portc.7=0 'delayms 2000 'portc.7=1 'delayms 1000 'portc.7=0 Nop While T < 8 GoSub Feed_microstep Inc T Wend B=1 BDIR=0 T=0 While T < 8 GoSub Feed_microstep Inc T Wend Stop 'repeat 'nop 'until porta.4=0 'gosub carriadge 'delayms delay 'x=1 'GoSub Carriadge_microstep 't1b=portb 't1b=t1b & %00000011 'delayus 2 'if t1b=0 then t1b_F=1 'if t1b <> 0 then gosub Control GoTo MainProgram ' Возврат на начало основной программы Control: Select Math Case 1 GoSub Carriadge Case 2 GoSub Feed Case 3 GoSub Carriadge GoSub Feed EndSelect Return Carriadge: If ADIR=1 Then 'If PORTB.1=1 Then ' 1 CW, 0 CCW Select A Case 1 'DelayMS 5 Set PORTA.0 DelayMS Delay Clear PORTA.0 Case 2 'DelayMS 5 Set PORTA.1 DelayMS Delay Clear PORTA.1 Case 3 Set PORTA.2 DelayMS Delay Clear PORTA.2 Case 4 Set PORTA.3 DelayMS Delay Clear PORTA.3 EndSelect Inc A If A=5 Then A=1 Else Select A Case 4 'DelayMS 5 Set PORTA.0 DelayMS Delay Clear PORTA.0 Case 2 'DelayMS 5 Set PORTA.2 DelayMS Delay Clear PORTA.2 Case 3 'DelayMS 5 Set PORTA.1 DelayMS Delay Clear PORTA.1 Case 1 Set PORTA.3 DelayMS Delay Clear PORTA.3 EndSelect Inc A If A=5 Then A=1 EndIf Return Feed: If BDIR=1 Then 'If PORTB.2=1 Then ' за годинниковою або проти Select B Case 1 'DelayMS 5 Set PORTC.3 PORTC= PORTC & %10001111 DelayMS Delay Case 2 'DelayMS 5 Set PORTC.4 PORTC= PORTC & %10010111 DelayMS Delay Case 3 'DelayMS 5 Set PORTC.5 PORTC= PORTC & %10100111 DelayMS Delay Case 4 'DelayMS 5 Set PORTC.6 PORTC= PORTC & %11000111 DelayMS Delay EndSelect Inc B If B=5 Then B=1 Else Select B Case 4 'DelayMS 5 Set PORTC.3 PORTC= PORTC & %10001111 DelayMS Delay Case 3 'DelayMS 5 Set PORTC.4 PORTC= PORTC & %10010111 DelayMS Delay Case 2 'DelayMS 5 Set PORTC.5 PORTC= PORTC & %10100111 DelayMS Delay Case 1 'DelayMS 5 Set PORTC.6 PORTC= PORTC & %11000111 DelayMS Delay EndSelect Inc B If B=5 Then B=1 EndIf Return Carriadge_microstep: If ADIR=1 Then 'If PORTB.1=1 Then ' 1 за годинниковою, 0 проти Select A Case 1 'DelayMS 5 PORTA=%00000001 DelayMS Delay Case 2 'DelayMS 5 PORTA=%00000011 DelayMS Delay Case 3 'DelayMS 5 PORTA=%00000010 DelayMS Delay Case 4 'DelayMS 5 PORTA=%00000110 DelayMS Delay Case 5 PORTA=%00000100 DelayMS Delay Case 6 PORTA=%00001100 DelayMS Delay Case 7 PORTA=%00001000 Case 8 PORTA=%00001001 DelayMS Delay EndSelect Inc A If A=9 Then A=1 Else Select A Case 1 'DelayMS 5 PORTA=%00001001 DelayMS Delay Case 2 'DelayMS 5 PORTA=%00001000 DelayMS Delay Case 3 'DelayMS 5 PORTA=%00001100 DelayMS Delay Case 4 'DelayMS 5 PORTA=%00000100 DelayMS Delay Case 5 PORTA=%00000110 DelayMS Delay Case 6 PORTA=%00000010 DelayMS Delay Case 7 PORTA=%00000011 Case 8 PORTA=%00000001 DelayMS Delay EndSelect Inc A If A=9 Then A=1 EndIf Return Feed_microstep: If BDIR=1 Then Select B Case 7 'DelayMS 5 PORTC=PORTC & %10000111 Set PORTC.3 DelayMS Delay Case 8 PORTC=PORTC & %10000111 Set PORTC.3 Set PORTC.4 DelayMS Delay Case 1 PORTC=PORTC & %10000111 Set PORTC.4 DelayMS Delay Case 2 PORTC=PORTC & %10000111 Set PORTC.4 Set PORTC.5 DelayMS Delay Case 3 PORTC=PORTC & %10000111 Set PORTC.5 DelayMS Delay Case 4 PORTC=PORTC & %10000111 Set PORTC.5 Set PORTC.6 DelayMS Delay Case 5 PORTC=PORTC & %10000111 Set PORTC.6 DelayMS Delay Case 6 PORTC=PORTC & %10000111 Set PORTC.6 Set PORTC.3 DelayMS Delay EndSelect Inc B If B=9 Then B=1 Else Select B Case 8 PORTC=PORTC & %10000111 Set PORTC.6 Set PORTC.3 DelayMS Delay Case 7 PORTC=PORTC & %10000111 Set PORTC.6 DelayMS Delay Case 2 PORTC=PORTC & %10000111 Set PORTC.5 Set PORTC.6 DelayMS Delay Case 3 PORTC=PORTC & %10000111 Set PORTC.5 DelayMS Delay Case 4 PORTC=PORTC & %10000111 Set PORTC.4 Set PORTC.5 DelayMS Delay Case 5 PORTC=PORTC & %10000111 Set PORTC.4 DelayMS Delay Case 6 PORTC=PORTC & %10000111 Set PORTC.3 Set PORTC.4 DelayMS Delay Case 1 PORTC=PORTC & %10000111 Set PORTC.3 DelayMS Delay EndSelect Inc B If B=9 Then B=1 EndIf Return