.include "m8def.inc"   ; ATMega8
; внутренний RC генератор 1 МГц

.def	R_UP=R0
.def	R_DOWN=R1

;    R4, R5    - счетчик энкодера
.org	0x0000
	CLR	ZH
	SER	ZL
	OUT	SPH,ZH
	OUT	SPL,ZL
	RJMP	START

.org	0x0009
;--- прерывание по Таймеру0 ---
;timer0:
	RET
;*************************
TB_ENCODER_D:
	.DB	0b00000001,0b00000000,0b00000010,0b00000011,0b00000001,0b00000000,0b00000010,0b00000011
TB_ENCODER_D_END:
;*************************

START:
	LDI	R16,3
	MOV	R3,R16
	OUT	DDRD,R16
	OUT	PORTD,R16
	OUT	DDRD,ZH

	CLR	R4
	CLR	R5
GO:
	IN	R8,PIND
	AND R8,R3

	LDI	ZL,(TB_ENCODER_D*2)
POISK:
	LPM	R16,Z+
	CP	R8,R16
	BREQ	SET_UP_DOWN
	RJMP	POISK
SET_UP_DOWN:
	LPM	R_UP,Z
	ADIW	ZL,2
	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
	LDI	R16,1

;    R4, R5    - счетчик энкодера
; канал A энкодера - порт D0
; канал B энкодера - порт D1

	IN	R8,PIND
	AND R8,R3
COMPARE_PERIOD:
	CP	R_UP,R8
	BREQ	UP_
	CP	R_DOWN,R8
	BREQ	DOWN_
	RJMP	GO	; ошибка 
UP_:
	ADD	R4,R16
	ADC	R5,ZH
	RJMP	GO
DOWN_:
	SUB	R4,R16
	SBC	R5,ZH
	RJMP	GO
.EXIT
