Hi Hanno,
ich bin nicht sicher, ob ich richtig verstanden habe,
was du eigentlich machen willst, aber ich gebe dir hier
mal ein Beispiel für eine Drehgeber-Abfrage.
Kern dieser Methode ist die Tabelle dgtab.
Jede der vier Zeilen steht für einen "alten" Drehgehber-Zustand.
In jeder Zeile stehen die Additionswerte für den Zähler
für jede der vier möglichen "neuen" Zustände.
Vieleicht hilft dir das weiter.
Gruß Jan
Code:
;Codebeispiel zur Auswertung eins Drehgebers
;für Atmel ATTiny15L
;Signale A und B sind an PortB Bit0 und Bit1 angeschlossen
;Es wird 8 Bit weit gezählt mit dem Zähler cnt
;Jan Baare 12/2004
.NOLIST
.INCLUDE "C:\Programme\Atmel\Avr Tools\AvrAssembler\appnotes\tn15def.inc"
.LIST
.DEF temp = r16
.DEF cnt = r17 ;der Zähler
.DEF ast = r18 ;alter Zustand Drehgeber
dgstart: ldi temp,0
out ddrb,temp ;Portb 0-7 auf Input setzen
in ast,portb ;einmal den aktuellen PortZustand holen
andi ast,3 ;Drehgeber-Bits maskieren
dgloop: in temp,portb ;aktuellen PortZustand holen
andi temp,3 ;Drehgeber-Bits maskieren
cp temp,ast ;mit altem Zustand vergleichen
breq dgloop ;Keine Änderung -> nix machen
lsl ast ;*2
lsl ast ;*2
add ast,temp ;alter Zustand mal 4 plus neuer Zustand
ldi ZL,low(dgtab<<1) ;Zeiger Z auf Tabellenanfang setzen
ldi ZH,high(dgtab<<1)
add ZL,ast ;zum Zeiger Addieren
clr ast
adc ZH,ast
lpm ;Tabelleneintrag holen
add cnt,r0 ;auf Zähler draufaddieren
mov ast,temp ;neuer Zustand wird alter Zustand
rjmp dgloop ;fertig
dgtab: .db 0,1,-1,0
.db -1,0,0,1
.db 1,0,0,-1
.db 0,-1,1,0
;Ende
Lesezeichen