;=======================================================
; Проект 48. Энкодер: чтение вращения
; ATmega8, 8 МГц. Выводы энкодера A — PD2, B — PD3
; Значение счётчика (0..255) выводится на светодиоды PORTB
;=======================================================
.include "m8def.inc"

.def tmp   = r16
.def value = r17
.def prev  = r18
.def cur   = r19

.cseg
.org 0x0000
        rjmp    RESET

RESET:
        ldi     tmp, low(RAMEND)
        out     SPL, tmp
        ldi     tmp, high(RAMEND)
        out     SPH, tmp

        ldi     tmp, 0xFF
        out     DDRB, tmp
        cbi     DDRD, 2                 ; A — вход
        cbi     DDRD, 3                 ; B — вход
        sbi     PORTD, 2                ; подтяжки
        sbi     PORTD, 3
        clr     value
        in      prev, PIND
        andi    prev, 0b00000100

MAIN:
        in      cur, PIND
        andi    cur, 0b00000100         ; следим за каналом A
        cp      cur, prev
        breq    MAIN                    ; состояние не изменилось
        mov     prev, cur

        cpi     cur, 0                  ; интересует только спад на A
        brne    MAIN

        rcall   Delay2ms                ; подавление дребезга контактов
        sbic    PIND, 3                 ; смотрим канал B
        rjmp    TURN_LEFT
        inc     value                   ; B в нуле — вращение вправо
        rjmp    SHOW
TURN_LEFT:
        dec     value                   ; B в единице — вращение влево
SHOW:
        out     PORTB, value
        rjmp    MAIN

Delay2ms:
        ldi     r20, 26
V1:     ldi     r21, 255
V2:     dec     r21
        brne    V2
        dec     r20
        brne    V1
        ret
