.include "m8def.inc"   ; ATMega8
; внутренний RC генератор 1 МГц

.def	new_state_enc=R18
.def	old_state_enc=R19

;    R24, R25    - счетчик энкодера
.org	0x0000
	CLR	ZH
	SER	ZL
	OUT	SPH,ZH
	OUT	SPL,ZL

	LDI	R16,1<<SE
	OUT	MCUCR,R16

	RJMP	START

.org	0x0009
;--- прерывание по Таймеру0 ---
;timer0:
	RET
;*****************************
START:
	LDI	R16,3
	OUT	DDRD,R16
	OUT	PORTD,R16
	CLR	R16
	OUT	DDRD,R16

	IN	old_state_enc,PIND
	ANDI old_state_enc,0b00000011
;------ настройка Таймера0 ------
	LDI	R16,1<<TOIE0
	OUT	TIMSK,R16
	OUT	TIFR,R16

	ldi R16,2         ; предделитель = 8, интервал срабатывания Таймера0 2048 мкс
	out TCCR0, R16

	SEI
WAIT:
	SLEEP
	NOP
;    R24, R25    - счетчик энкодера
; канал A энкодера - порт D0
; канал B энкодера - порт D1
in new_state_enc, PinD
andi new_state_enc, 3

cp old_state_enc, new_state_enc   ; если состояние не поменялось, то выходим
breq nothing

cpi new_state_enc, 0   ; если состояние поменялось, выбираем подходящий вариант
breq case0
cpi new_state_enc, 1
breq case1
cpi new_state_enc, 2
breq case2
cpi new_state_enc, 3
breq case3
rjmp nothing         ; блокировка на всякий случай, хотя до этой команды никогда не должно дойти

case0:
cpi old_state_enc, 1
breq Iref_plus
cpi old_state_enc, 2
breq Iref_minus
rjmp nothing         ; блокировка на случай ошибочной комбинации состояний энкодера

case1:
cpi old_state_enc, 3
breq Iref_plus
cpi old_state_enc, 0
breq Iref_minus
rjmp nothing         ; блокировка на случай ошибочной комбинации состояний энкодера

case2:
cpi old_state_enc, 0
breq Iref_plus
cpi old_state_enc, 3
breq Iref_minus
rjmp nothing         ; блокировка на случай ошибочной комбинации состояний энкодера

case3:
cpi old_state_enc, 2
breq Iref_plus
cpi old_state_enc, 1
breq Iref_minus
rjmp nothing         ; блокировка на случай ошибочной комбинации состояний энкодера

Iref_plus:
	ADIW	R24,1
rjmp nothing

Iref_minus:
	SBIW	R24,1
nothing:
	mov old_state_enc, new_state_enc   ; копируем в темп1 новое состояние выводов
	RJMP	WAIT-1
.EXIT
