Drehimpulsgeber (Dekodierung mit PIC-Mikrocontroller, Elektronik)


zurück zu Elektronik, Homepage


3. Software

Auf die Taster-Funktion wird bei der folgende Software und der Softwarebeschreibung nicht eingegangen, da dieser wie ein ganz normaler Taster funktioniert.

nach oben

3.1. Das Dekodierverfahren

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.

nach oben

3.2. Benötigte Register und Maske

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.

nach oben

3.3. Initialisierung (Unterprogramm "INIT")

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.

nach oben

3.4. Unterprogramm "INKRROUTINE"

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):

Allgemeines:

Vorgehensweise: Flussdiagramm INKRROUTINE

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.

nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 30. September 2003
Letzte Änderung: 10. Oktober 2004