

.include	"m128def.inc"

.cseg
.org $0000
		jmp main



.org OC1Aaddr ;Init Output compare A interrupt vector
	jmp	step_





.equ c_value=19000            // задаем именв переменным
.def temp2=r24
.def temp=r16
.def cnt=r17

.def sugX=r18
.def X1=r19
.def X2=r20

.def sugY=r23
.def Y1=r21
.def Y2=r22

;---------------**-***-****-------***-----******---**----**-----------
;---------------************-----*****----******---***---**-----------
;---------------***--**---**----**---**-----**-----****--**-----------
;---------------**---**---**----*******-----**-----**-**-**-----------
;---------------**---**---**----*******-----**-----**--****-----------
;---------------**---**---**----**---**---******---**---***-----------
;---------------**---**---**----**---**---******---**----**-----------

main:  
	ldi		r16,low(RAMEND)		;*
	out		spl,r16				;*это что бы ret работал
	ldi		r16,high(RAMEND)	;*
	out		sph,r16				;*

	ldi		temp,0xff			;*
	out		DDRD,temp			;* выключаю    движки
	ldi		temp,0xff			;*
	out		PORTD, r16			;*
	
	ldi		temp,$f0
	out		PORTE,temp
	
	ldi		temp,$0f
	out		PORTC,temp

	
	ldi		temp,high(c_value)	;*  загружаем в компаратор значение 0xff
	out		OCR1AH,temp			;*
	ldi		temp,low(c_value)	;*
	out		OCR1AL,temp			;*


	clr		r16					;*
	out		TCNT1H,temp			;*обнуляю счетчик, настраиваем таймер\счетчик
	out		TCNT1L,temp			;*

	ldi		temp,(1<<4)			//  устанавливаем 4 бит  temp в единицу. ( ? )
	clr		temp
	out		TIMSK,temp			// Разрешаем прерывание от таймера 

	ldi		ZH,high(data*2)
	ldi		ZL,low(data*2)
	ldi		XH,high(0x0100)
	ldi		YH,high(0x0100)
	ldi		XL,low(0x0100)
	ldi		temp,0x0c

load:
	lpm							// загружаем байт памяти
	st		X+,R0  				// записываем в СОЗУ с использованием индекса Х	
	adiw	ZL,0x01			 	//  сложить первы байт регистра Z с 0x01
	dec		temp
	brne 	load				// перейти если не равно на load --- условие флаг регистра z = 0 тогда выполнять
	ldi		XH,high(0x0100)
	ldi		XL,low(0x0100)
	ldi		temp,0x09			// 00001001
	out		TCCR1B,temp			// инициализация сторожевоо таймера




Init:

	clr	 r16   			          // задали скорость 19200
	;out UBRR0H,R16;----------------------------------------------
	ldi r16,47						
	out UBRR0L,r16				

	ldi r16, (1<<4)|(1<<3)        // разрешили прием/передачу ( ??? )
	out UCSR0B,r16


	; Set frame format: 8data, 2stop bit
	ldi r16,(1<<3)|(3<<1) // ???
	;out UCSR0C,r16;-----------------------------------------------


sei
begin:  
f: 	ldi		temp2,'X'			// код отвечащий за выключение двигателей
	out		UDR0,temp2			// отправка по UART символов X и Y
	ldi		temp2,'Y'
	out		UDR0,temp2
	rcall timer_OFF				// вызов подпорграммы  запрещающей преывания по переполнению таймера
	clr cnt

	ldi		temp,0xff			;* выключаю движки 
	out		PORTD, temp			;* 
	



	rcall 	usart 		;читаем усарт
	
e:	rcall	timer_ON		;разрешаю прерывание от таймера
	clr cnt
loop:
	cpi  cnt,1
	breq f
	rjmp   loop	        ; повторение цикла

;-------*******-----***-----**---------**-----------------------------
;-------*******----*****----**---------**-----------------------------
;-------**--------**---**---**---------**-----------------------------
;-------**--------*******---**---------**-----------------------------
;-------**--------*******---**----**---**----**-----------------------
;-------*******---**---**---********---********-----------------------
;-------*******---**---**---********---********-----------------------



;---------------------------------------
;=======================================
step_:
rcall step
reti

step:
	rcall	timer_OFF		;запрещаю прерывание от таймера


	sbis 	PINC,0
	rcall	stopXL
	sbis 	PINC,1
	rcall	stopXR
	sbis 	PINC,2
	rcall	stopYL
	sbis 	PINC,3
	rcall	stopYR

	ldi r25,0xf0
	ldi     temp,0x0f

	cpi		X1,0
	brne	XX
	cpi 	X2,0
	breq	Y_
	dec		X2
XX:
	ld		temp,X
	mov		XL,temp
	andi	temp,0x0f
	swap	temp
	mov		r25,temp
	ldi     temp,0x0f
	swap	XL
	andi	XL,0x0f
	
	cpi		X1,0
	brne 	Xinc
	ldi		X1,255
	rjmp	Y_
Xinc:cp		sugX,XL
	brne 	Y_              
	dec 	X1

	
Y_:	cpi		Y1,0
	brne	YY
	cpi 	Y2,0
	breq	pp
	dec		Y2
YY:
	ld		temp,Y
	mov		YL,temp
	andi	temp,0x0f
	swap	YL
	andi	YL,0x0f
	
	cpi		Y1,0
	brne 	Yinc
	ldi		Y1,255
	rjmp	pp
Yinc:cp		sugY,YL
	brne 	pp
	dec 	Y1
	
pp:	or 		temp,r25
	out		PORTD,temp
	
	cpi		X1,0
	brne	go
	cpi		X2,0
	brne 	go
	cpi		Y1,0
	brne	go
	cpi		Y2,0
	brne	go
	ldi		cnt,1

go:	rcall	timer_ON
ret ;step
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
timer_ON:
	ldi		temp,(1<<4)  	// разрешаем поп переполнению
	out		TIMSK,temp
ret

timer_OFF:
	ldi		temp,0   // запрещаем прерывания
	out		TIMSK,temp
ret
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
read:
	rcall	read_		;*  // получение по юарту
	cpi 	temp,'#'	;*
	brne	read		;*
	rcall	read_		;*
	cpi 	temp,'K'	;*
	brne	read		;*
	rcall	read_		;*
	cpi 	temp,'S'	;*
	brne	read		;*
	rcall	read_		;*
	cpi 	temp,'U'	;*
	brne	read		;*

	rcall	read_		;*
	cpi 	temp,'t'	;*
	brne	rid			;*
	rcall	read_		;*
	cpi 	temp,'i'	;*
	brne	read		;*
	rcall	read_		;*
	cpi 	temp,'k'	;*
	brne	read		;*
	rcall	read_		;*
	cpi 	temp,'t'	;*
	brne	read		;*
	rcall	read_		;*
	cpi 	temp,'o'	;*
	brne	read		;*

	ldi		temp2,'#'
	out		UDR0,temp2
	ldi		temp2,'1'
	out		UDR0,temp2
	rjmp	read



rid:rcall	read_	
ret ;read
read_:
	sbis PINE,4  		// проверка нажаты ли кнопки
	rjmp X_left

	sbis PINE,5
	rjmp X_right
	
	sbis PINE,6
	rjmp Y_left

	sbis PINE,7
	rjmp Y_right

	sbis UCSR0A,RXC0   	// если есть приеи по юарту записать в temp 
	rjmp read_
	in temp,UDR0		// загрузить даные из регистра i/o
	
	
ret
;=======================================
;---------------------------------------


;---------------------------------------
;=======================================
usart:
c:
clr r16
clr r18
clr r19
clr r20
clr r21
clr r22
clr r23


	rcall 	read
	cpi 	temp,'X' 		;
	brne 	a				;
	call 	read			;
	mov 	sugX,temp		;в r18 хранится направление X. если 0, то вперед, если 4, но тазад
	mov		XL,sugX
	rcall 	read			;
	mov 	X1,temp			;в r19 хранится X1
	rcall 	read			;
	mov 	X2,temp			;в r20 хранится X2

b:	rcall 	read			;
	cpi 	temp,'Y' 
	brne 	b				;
	call 	read			;
	mov 	sugY,temp		;в r23 хранится направление Y. если 0, то вперед, если 4, но тазад
	mov		YL,sugY
	rcall 	read			;
	mov 	Y1,temp			;в r21 хранится Y1
	rcall 	read			;в r22 хранится Y2
	mov 	Y2,temp			;

	ldi		temp2,'O'
	out		UDR0,temp2
	ldi		temp2,'K'
	out		UDR0,temp2
	ret	


a:	cpi 	temp,'n'		;
	brne 	c				;
c1:	rcall 	read			;
	cpi 	temp,'u'		;
	brne 	c				;
c2:	rcall 	read			;
	cpi 	temp,'l'		;
	brne 	c				;
c3:	rcall 	read			;
	cpi 	temp,'l'		;
	brne 	c				;
	rcall 	null	
 	
ret  ;usart
;=======================================
;---------------------------------------


;---------------------------------------
;=======================================
null:

ret  ;null
;=======================================
;---------------------------------------


;---------------------------------------
;=======================================
X_left:
clr cnt
ldi	X1,1
ldi	X2,0
ldi sugX,0
mov XL,sugX
rcall timer_ON
X_l:

sbrs cnt,0
rjmp X_l
rcall timer_OFF

	sbis PINE,4
	rjmp X_left


ldi		r16,0xff			;* выключаю движки
out		PORTD, r16			;*
ldi r25,0xf0
rjmp read_ ;X_left
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
Y_left:
clr cnt
ldi	Y1,1
ldi	Y2,0
ldi sugY,0
mov YL,sugY
rcall timer_ON
Y_l:

sbrs cnt,0
rjmp Y_l
rcall timer_OFF

	sbis PINE,6
	rjmp Y_left

ldi		temp,0xff			;* выключаю движки
out		PORTD, r16			;*
rjmp read_ ;Y_left
;=======================================
;---------------------------------------


;=======================================
;---------------------------------------
X_right:
clr cnt
ldi	X1,1
ldi	X2,0
ldi sugX,6
mov XL,sugX
rcall timer_ON
X_r:

sbrs cnt,0
rjmp X_r
rcall timer_OFF

	sbis PINE,5
	rjmp X_right


ldi		r16,0xff			;* выключаю движки
out		PORTD, r16			;*
ldi r25,0xf0
rjmp read_ ;X_right
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
Y_right:
clr cnt
ldi	Y1,1
ldi	Y2,0
ldi sugY,6
mov YL,sugY
rcall timer_ON
Y_r:

sbrs cnt,0
rjmp Y_r
rcall timer_OFF

	sbis PINE,7
	rjmp Y_right

ldi		temp,0xff			;* выключаю движки
out		PORTD, r16			;*
rjmp read_ ;Y_right
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
stopXL:
cpi sugX,0
brne sxl
clr X2
clr X1
ldi temp2,'$'
out UDR0,temp2
ldi temp2,'0'
out UDR0,temp2
sxl:ret    ;stopXL
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
stopXR:
cpi sugX,6
brne sxr
clr X2
clr X1
ldi temp2,'$'
out UDR0,temp2
ldi temp2,'1'
out UDR0,temp2
sxr:ret    ;stopXR
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
stopYL:
cpi sugY,0
brne syl
clr Y2
clr Y1
ldi temp2,'$'
out UDR0,temp2
ldi temp2,'3'
out UDR0,temp2
syl:ret    ;stopYL
;=======================================
;---------------------------------------

;---------------------------------------
;=======================================
stopYR:
cpi sugY,6
brne syr
clr Y2
clr Y1
ldi temp2,'$'
out UDR0,temp2
ldi temp2,'4'
out UDR0,temp2
syr:ret    ;stopYR
;=======================================
;---------------------------------------


data:
.db 0x15,0x24,0x36,0x42,0x53,0x01,0x71,0x83,0x92,0xA6,0xB4,0x65
