.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=DDRC
.EQU 	MOTORPORT=PORTC
.EQU 	MOTORPIN=PINC
.EQU 	wait_motor=2
.EQU 	motor_bcount=30

.EQU	PWM01=10
.EQU	PWM02=7

.DEF 	reg_motor=R24
.DEF 	reg_count=R25



; секция Кнопка старт/стоп
.EQU	buttonstart=7
.EQU	buttonstartpin=PINB
.EQU	buttonstartddr=DDRB
.EQU	buttonstartport=PORTB

; временные регистры
.DEF	temp=R30
.DEF	temp1=R29

; константы для задержек
.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



;====================================
;	I N I T 
;====================================
; готовим порт В -  
	ldi r30,0b00001111
	out MOTORDDR,r30

; готовим порт D ввода
	ldi r30,0
	out DDRD,r30

; готовим порт D ввода
	ldi r30,0
	out DDRB,r30

; инициализация стека
	ldi	r30,HIGH(RAMEND) 
	out	SPH,r30	         
	ldi	r30,LOW(RAMEND)	 
	out	SPL,r30


; ИК-бампер
;	cbi   dsddr, dspinin	;TSOP
;	sbi   dsddr, dspinout	
; сенсор края
;	cbi   botsensorreg, botsensor1
;	cbi   botsensorreg, botsensor2
	    
; button
	cbi   buttonstartddr, buttonstart
	sbi   buttonstartport, buttonstart

;====================================

; ожидание начатия кнопки старт
buttonstart0:
	sbic	buttonstartpin, buttonstart
	rjmp buttonstart0
; кнопка нажата- начало

init1:
; небольшая задержка перед началом движения
;	ldi r28,wait_init*2	; wait
;	rcall f_wait


	ldi r28,200	; wait
	rcall f_wait

; запишем в регистры начальные значения
;	ldi reg_count,motor_bcount
;	ldi reg_motor,4		; поиск

; движение вперед
	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:

	ldi r27,$1f
f_wait2:	
	
	ldi r26,$ff

f_wait3:	dec r26
	nop
	nop
	nop
	cpi r26,0
	brne f_wait3	

	dec r27
	cpi r27,0
	brne f_wait2	

	dec r28
	cpi r28,0
	brne f_wait	
	ret

	.exit	

