.include "m8def.inc"   ; ATMega8
; внутренний RC генератор 1 МГц

.def	R_UP=R0
.def	R_DOWN=R1

;    R24, R25    - счетчик энкодера
.org	0x0000
	CLR	ZH
	SER	ZL
	OUT	SPH,ZH
	OUT	SPL,ZL
	RJMP	START
;*************************
.org	0x0009
;--- прерывание по Таймеру0 ---
;timer0:
	RET
;*************************
TB_ENCODER_D:
; канал A энкодера - порт D0
; канал B энкодера - порт D1
	.DB	0b00000010,0b00000001	; 00
	.DB	0b00000000,0b00000011	; 01
	.DB	0b00000011,0b00000000	; 10
	.DB	0b00000001,0b00000010	; 11
TB_ENCODER_D_END:
;*************************

START:
	LDI	R16,3
	OUT	PORTD,R16

	CLR	R24
	CLR	R25
GO:
	IN	R22,PIND
	ANDI R22,3
	LSL	R22

	LDI	ZL,(TB_ENCODER_D*2)
	ADD	ZL,R22
	LPM	R_UP,Z+
	LPM	R_DOWN,Z

	LDI	R16,1<<SE
	OUT	MCUCR,R16

;------ настройка Таймера0 ------
	LDI	R16,1<<TOIE0
	OUT	TIMSK,R16
	OUT	TIFR,R16

	ldi R16,2         ; предделитель = 8, интервал срабатывания Таймера0 2048 мкс
	out TCCR0, R16

	SEI
WAIT:
	SLEEP
;	NOP

	IN	R22,PIND
	ANDI R22,3
	CP	R_UP,R22
	BREQ	UP_
	CP	R_DOWN,R22
	BREQ	DOWN_
	RJMP	GO	; состояние энкодера не менялось или ошибка 
UP_:
	ADIW	R24,1
	RJMP	GO
DOWN_:
	SBIW	R24,1
	RJMP	GO
.EXIT
