.include "m8def.inc" ; секция двигателей .EQU go_b= 0b00110101 ; оба вперед .EQU go_r= 0b00111000 ; правый вперед .EQU go_l= 0b00110010 ; левый вперед .EQU go_f= 0b00111010 ; оба назад .EQU go_lr=0b00111001 ; левый правый .EQU go_rl=0b00110110 ; правый левый .EQU MOTORDDR=DDRB .EQU MOTORPORT=PORTB .EQU MOTORPIN=PINB .EQU wait_motor=2 .EQU motor_bcount=30 .EQU PWM01=10 .EQU PWM02=7 .DEF reg_motor=R24 .DEF reg_count=R25 ; секция Кнопка старт/стоп .EQU buttonstart=6 .EQU buttonstartpin=PINB .EQU buttonstartddr=DDRB .EQU buttonstartport=PORTB ; временные регистры .DEF temp=R20 .DEF temp1=R19 .DEF temp2=r18 ; константы для задержек .EQU wait_init=$15 .EQU wait_back=30 ; scan .equ scan1=6 .equ pinscan1=PIND .equ scan2=7 .equ pinscan2=PIND .equ scan3=0 .equ pinscan3=PIND .equ scan4=1 .equ pinscan4=PIND .equ scan5=4 .equ pinscan5=PIND .equ scan6=5 .equ pinscan6=PIND .equ rs=7 ;.equ rw=1 .equ en=6 .EQU LCDPORT=PORTD .EQU LCDCTRL=PORTB ;==================================== ; I N I T ;==================================== ; готовим порт В - ldi r30,$FF ; motor and LCD ctrl out MOTORDDR,r30 ; LCD 8bit out out DDRD,r30 ; sensor ldi r30,$00 out DDRC,r30 ; инициализация стека ldi r30,HIGH(RAMEND) out SPH,r30 ldi r30,LOW(RAMEND) out SPL,r30 ; button ; cbi buttonstartddr, buttonstart ; sbi buttonstartport, buttonstart ;==================================== ; ожидание начатия кнопки старт ; кнопка нажата- начало init1: ; небольшая задержка перед началом движения ; ldi r28,200 ; wait ; rcall f_wait ; ======================================= ; LCD init ldi temp, 0b00110000 rcall f_init1 ldi temp, 0b00110000 rcall f_init1 ldi temp, 0b00110000 rcall f_init1 ; режим ldi temp, 0b00111000 rcall f_init1 ; выкл ldi temp, 0b00001000 rcall f_init1 ; очистка ldi temp, 0b00000001 rcall f_init1 ; направление ldi temp, 0b00000110 rcall f_init1 ; включение ldi temp, 0b00001100 rcall f_init1 ; СМЕЩЕНИЕ И СДВИГ ldi temp, 0b00011100 rcall f_init1 ;============================== ; READY l_001: ldi temp, 0b00000001 rcall f_init1 ldi temp, 0b00000010 rcall f_init1 l_0002: ldi ZH,high(data15*2) ldi ZL,low(data15*2) ; inc r30 l_0001: lpm mov temp, R0 cpi temp,0 breq l_002 rcall f_print inc R30 rjmp l_0001 l_002: ; cbi buttonstartddr, buttonstart ; sbi buttonstartport, buttonstart buttonstart0: ; sbic buttonstartpin, buttonstart ; rjmp buttonstart0 ; sbi buttonstartddr, buttonstart ; cbi buttonstartport, buttonstart ;============================== ; движение вперед ldi temp,go_f out MOTORPORT,temp ;init2: ;in r30, PIND ;out PORTB, r30 ;rjmp init2 start: ;rjmp start ldi reg_count, pwm01 wait_pwm1: dec reg_count brne wait_pwm1 in temp1, MOTORPIN ldi temp, 0 out MOTORPORT, temp ldi reg_count, pwm02 wait_pwm2: dec reg_count brne wait_pwm2 out MOTORPORT, temp1 ; sbis buttonstartpin, buttonstart ; rjmp l_cycle start0: ; если 4 или 1 есть 0, то нужно поворачивать, если нет, ; проверка на наличие линии. sbis pinscan1, scan1 rjmp l_01 sbis pinscan2, scan2 rjmp l_01 sbis pinscan6, scan6 rjmp l_02 sbis pinscan5, scan5 rjmp l_02 sbis pinscan2, scan2 rjmp l_03 sbis pinscan5, scan5 rjmp l_03 sbis pinscan3, scan3 rjmp l_03 sbis pinscan4, scan4 rjmp l_03 ; stop rjmp start ldi temp,0 out MOTORPORT,temp rjmp l_cycle l_03: ldi temp,go_f out MOTORPORT,temp rjmp start ; если 1 и 2 или просто 1 - движение вправо l_01: ldi temp,go_r out MOTORPORT,temp rjmp start ; если 3 и 4 или просто 4 - движение влево l_02: ldi temp,go_l out MOTORPORT,temp rjmp start rjmp start l_cycle: ; sbis buttonstartpin, buttonstart ; rjmp l_cycle rjmp start ;rjmp l_cycle ; .exit ;===================================================================== ;===================================================================== ;;;;;;;; подпрограмма задержки f_wait: ;ret loop71: ldi r27,40 loop72: ldi r26,100 loop73: dec r26 brne loop73 ;--------------- dec r27 cpi r27,0 brne loop72 ;---------------- dec r28 cpi r28,0 brne loop71 ;---------------- ret ; ========================== ; FUNCTION init1 ; R20- init string ; 5 ms wait f_init1: ;ret cbi LCDCTRL, rs ; cbi LCDCTRL, rw cbi LCDCTRL, en ldi r28, 10 rcall af_wait ; data ; ldi temp, 0b00110000 out LCDPORT, temp ; enable sbi LCDCTRL, en ;wait ldi r28, 10 rcall f_wait ;ena off cbi LCDCTRL, en ;data off ldi temp, 0 out LCDPORT, temp ret f_print: cbi LCDCTRL, en sbi LCDCTRL, rs ; cbi LCDCTRL, rw ldi r28, 10 rcall af_wait ; data out LCDPORT, temp ; enable sbi LCDCTRL, en ;wait ldi r28, 250 rcall af_wait ;ena off cbi LCDCTRL, en ;data off ldi temp, 0 out LCDPORT, temp ret ;=== f_wait f_lwait: ;ret lloop71: ldi r27,$FF lloop72: ldi r26,$FF lloop73: dec r26 brne lloop73 ;--------------- dec r27 cpi r27,0 brne lloop72 ;---------------- dec r28 cpi r28,0 brne lloop71 ;---------------- ret af_wait: ;ret aloop71: ldi r26,4 aloop73: dec r26 brne aloop73 ;--------------- dec r28 cpi r28,0 brne aloop71 ;---------------- ret data11: .db $50,$4F .db $A0,$4F .db $54,$20 .db $43,$A9 .db $4D,$4F .db 0,0 data14: .db "Ready!" .db 0,0 data15: .db 0b10100001,0b01101111 .db 0b10111111, 0b01101111 .db 0b10110011, 0b00100001 .db 0,0 .exit