.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	





