; ;Drehgeberauswertung mit Pollen für AVR ; ;Codebeispiel für eine vollständige Auswertung von Drehgebersinalen. ;vollständig bedeutet hier vier Positionen pro Signalperiode ;Das heisst, ein Drehgeber mit nominal 100 Impulsen pro Umdrehung liefert ;dann 400 POsitionen pro Umdrehung. ;Die Routine hat immer die gleiche Laufzeit, und keine Probleme mit Prellen o.ä. ;Sie basiert auf einer 4x4 Tabelle, die die Positionsänderungen ;in Bezug auf die Zustandsänderungen der Drehgebersignale enthält. ; ;Die Signale A und B des Drehgebers sind in diesem Beispiel ;an PortD Bit0 und Bit1 angeschlossen ;in dgpos (R17) steht die aktuelle Drehgeberposition (8-Bit weit) ; ;Die Routine muss regelmässig, am Besten per Timer-Int aufgerufen werden. ;Natürlich mindestens so häufig wie POstionsaenderungen zu erwarten sind. ;Dies Beispiel setzt voraus, das Ports und Timer schon initialisiert sind. .DEF temp = r16 .DEF dgpos = r17 ;Drehgeberposition .DEF ast = r18 ;alter Zustand Drehgeber timer_int: ;aktuellen Portzustand einlesen in temp,pind ;aktuellen Portzustand holen andi temp, 0b00000011 ;Drehgeber-Bits maskieren ;Position in der Tabelle dgtab errechnen lsl ast ;*2 lsl ast ;*2 add ast,temp ;alter Zustand mal 4 plus akt.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 ;neue Position errechnen mov ast,temp ;aktueller Zustand wird alter Zustand lpm temp ;Tabelleneintrag holen add dgpos,temp ;auf Position draufaddieren reti ;fertig ;Diese Tabelle enthält die Positionsänderungen ;des Drehgebers entsprechend der Zustandsänderungen ;der Drehgebersignale. dgtab: .db 0,1,-1,0 .db -1,0,0,1 .db 1,0,0,-1 .db 0,-1,1,0 ;Ende