;************************************************************************ ;* Pollin Panasonic 16348 Encoder mit 2ms Timerinterruptabfrage ;* Autor: Hannes Lux (hannes) abgeändert von (rulixa) ;*http://www.mikrocontroller.net/topic/172127#1650592 ;* OLD NEW Drehrichtung ;* 11 10 rechts ;* 10 00 rechts ;* 00 01 rechts ;* 01 11 rechts ;* ;* 00 10 links ;* 10 11 links ;* 11 01 links ;* 01 00 links = gegen Uhr ;* neu, old, flag, B, C ,A schon im Hauptprogramm definiert ;************************************************************************* Timer0: push C ;Timer0 ISR ändert nur Register flag push B ; "B" ist auch als "neu" definiert push A push ZL push ZH sbi pinD,6 ;toggle zum abhören ob Interrupt läuft, bzw wie ;genau die Clockfrequenz ist, z.B.bei RC_oscillator in C,sreg ;save Statusreg in neu,PinD;Drehgeber-Port holen PD2 und PD3, Phase A, B andi neu,0b00001100 ;maskieren neu =PinD [3:2] lsr old ;old[3:2] wird old[1:0], "urold" wird Nirvana lsr old ;von links kommt nur 0 nach or old,neu ;neue Drehgeberbits neu[3:2] nach old[3:2] ;Drehrichtung lt. old aus Tabelle holen clr A ldi ZL,low (enctab*2) ;Tabelle mit Drehgeber-Increment-Werten ldi ZH,high (enctab*2) add ZL,old ;Index aufaddieren adc ZH,A lpm A,Z ;Wert bei mir 0,1 oder 2 tst flag ;ist flag von main schon abgeholt worden ? brne nnab mov flag,A ;neuen Wert speichern, egal welcher Wert nnab: out sreg,C ;restore Statusreg pop ZH pop ZL pop A pop B pop C reti ;wenn nicht gedreht wird, so ist neu = old, das kann sein 00 01 10 11 ;bei jeder Kombi 0000 0101 1010 1111 steht 0 in der Tabelle = kein Auftrag ;flag 1 oder 2 : Auftrag liegt vor ;wird der Auftrag in main ausgeführt, so werden die Bits dort gelöscht. ;Tabelle mit Drehgeber-Werten (neuneu-oldold als Index) enctab: ;nn oo, nn oo .db 0, 0 ;00 00, 00 01 ;2 bytes je Zeile .db 2, 0 ;00 10, 00 11 ;weil Assembler sowieso .db 0, 0 ;01 00, 01 01 ;auf word auffüllen würde .db 0, 1 ;01 10, 01 11 ;bisher verwendete Tabelle .db 1, 0 ;10 00, 10 01 ; Adr_1=1 Adr_2=2 .db 0, 0 ;10 10, 10 11 ; Adr13=2 Adr14=1 .db 0, 2 ;11 00, 11 01 ;hatte bei "rechts" Hänger bzw. 2fach .db 0, 0 ;11 10, 11 11