Auf die Taster-Funktion wird bei der folgende Software und der Softwarebeschreibung nicht eingegangen, da dieser wie ein ganz normaler Taster funktioniert.
Die beiden Eingänge des Drehimpulsgeber werden zyklisch (ca. alle 4 ms) vom
Unterprogramm INKRROUTINE abgefragt. Als Zeitbasis für den 4-ms-Takt dient der
Timer-0-Interrupt. Dieser kann je nach Anwendung entweder so eingestellt werden,
dass er alle 4 ms einen Interrupt auslöst, oder er wird so eingestellt dass er z.B.
alle 500µs oder alle 1ms einen Interrupt erzeugt und ein Zählregister zählt die
notwendige Anzahl an Interruptaufrufen bis zu einer Zeitbasis von 4 ms. Hier in
dieser Dokumentation wird der Einfachheit halber die erstere Variante verwendet.
Die Aufgabe des Unterprogramms INKRROUTINE besteht darin eine Drehung des
Drehimpulsgebers aufgrund der im Abschnitt 1 (Grundlegendes zum Drehimpulsgeber)
gewonnen Erkenntnisse zu dekodieren und je nach Richtung entweder das Flag INKRLINKS
oder INKRRECHTS im Register INKRSTATUS zu setzen. Weiters beinhaltet das Register
INKRSTATUS noch den Zustand der Eingänge des Drehimpulsgebers 4 ms vor dem Aufruf des
Unterprogramms INKRROUTINE. Mit Hilfe des aktuellen Zustands und des Zustands vor 4
ms kann nun erkannt werden, ob der Drehimpulsgeber gedreht wurde und in welche
Richtung diese Drehung erfolgte.
Beim 4. Demonstrationsbeispiel erfolgt der Aufruf des
Unterprogramms INKRROUTINE in der ISR. Man kann sagen dass diese zyklische Tätigkeit
im Hintergrund abläuft. Das Hauptprogramm prüft nun ständig die beiden Flags
INKRLINKS und INKRRECHTS des Register INKRSTATUS. Ist eines der beiden Flags
gesetzt, so wurde eine Drehung in diese Richtung erkannt und die gewünschten
Aktionen können entweder mit einem Unterprogramm oder direkt im Hauptprogramm
eingeleitet werden. Logischerweise können die Flags INKRLINKS und INKRRECHTS
nie gleichzeitig gesetzt sein. Im Demonstrationsbeispiel (siehe Abschnitt 4) wandert
eine LED einer LED-Reihe beim Drehen abhängig von der Drehrichtung entweder nach
links oder nach rechts.
Für die Dekodierung einer Drehung des Drehimpulsgebers werden neben einigen internen Register (SFR, Spezielle Funktions-Register) noch folgende Register benötigt:
Die Maske MASKEINKR wird zum Ausmaskieren der beiden Eingänge des Drehimpulsgebers am Port A benötigt.
Die Portpins an die der Drehimpulsgeber angeschlossen ist müssen als Eingang definiert werden. Welcher Port (A, B, C, D...) verwendet wird ist nicht von Bedeutung. Wichtig ist nur, dass die beiden Eingänge am selben Port angeschlossen sind. Es ist auch möglich dass sich die Eingänge an einem Port nicht "nebeneinander" befinden. (Eingang A kann zum Beispiel am Portpin RA2 angeschlossen werden, während der Eingang B am Portpin RA5) angeschlossen ist.
In der Initialisierungsroutine muss für den erste Aufruf des Unterprogramms INKRROUTINE der aktuelle Zustand des Ports (an dem der Drehimpulsgeber angeschlossen ist) gelesen, die relevanten Bits ausmaskiert und in das Register INKRSTATUS kopiert werden.
Das Unterprogramm "INKRROUTINE" ist für die Dekodierung die wichtigste Komponente.
Diese Routine wird ca. alle 4 ms aufgerufen
Aufgabe:
Ermittelt ob und in welche Richtung der Drehimpulsgeber (= Inkrementalgeber)
gedreht wurde. Das Ergebnis befindet sich dann im Register INKRSTATUS. Dieses
Register besitzt die folgenden Bits (Flags):
Vorgehensweise:
Anmerkung:
Die temporären Register TEMP1 und TEMP2 werden hier nur zum Zwischenspeichern
(TEMP1) bzw. als Hilfsregister (TEMP2) benötigt. Sie können daher auch woanders
verwendet werden.