RC5 (Dekodierung mit PIC-Mikrocontroller, Elektronik)


zurück zu Elektronik, Homepage


3. Software:

3.1. Das Dekodierverfahren

Die Aufgabe der PIC-Software besteht bei der RC5-Dekodierung aus mehreren Teilaufgaben:

  1. In kurzen Zeitabständen (alle 250µs) das vom IR-Empfangsmodul erzeugte Signal abtasten. Aus diesen Abtastungen den Telegrammbeginn und die im Abschnitts 1 beschriebenen Low- und High-Bits ermitteln
    (Anmerkung: Die 250µs-Zeitabstände müssen für die RC5-Dekodierung sehr exakt sein, so dass als Taktquelle für den PIC-Mikrocontroller nur ein Quarz mit einer entsprechenden Quarzfrequenz verwendet werden kann (z.B. ein 4,096MHz-Quarz). Mit einem geeigneten Vorteiler (im PIC) lässt sich so eine einfache und relativ genaue 250µs-Zeitbasis erzeugen.)
  2. Die empfangenen Low- und High-Bits zwischenspeichern.
  3. Nachdem alle zu einem Telegramm gehörenden Bits eingelesen wurden, dieses empfangene Telegramm mit dem zuvor empfangenen Telegramm vergleichen.
    Nur wenn nacheinender mehrere gleiche Telegramme empfangen wurden, wird das soeben empfangene Telegramm als gültig angesehen. Durch diese Maßnahme, dass mehrere gleiche Telegramme empfangen werden müssen, werden andere IR-Protokolle ignoriert. D.h. die Software "reagiert" nur auf Fernbedienungen welche das RC5-Protokoll aussenden.
  4. Aus einem als gültig erkannten Telegramm die Adresse und den Befehl ermitteln und in die Register RC5ADRESSE bzw. RC5BEFEHL sichern. Weiters das Toggle-Bit auslesen und im Register RC5STATUS sichern, und ein Flag namens RC5TELGUELTIG ebenfalls im Register RC5STATUS setzen. Das gesetzte Flag RC5TELGUELTIG zeigt an, dass ein gültiges RC5-Telegramm empfangen und dekodiert wurde, und dieses nun für die anderen Unterprogramme zur Verfügung steht.
  5. Je nach empfangenem Befehl oder empfangener Adresse z.B. einen Zähler erhöhen oder vermindern, oder einen Schaltausgang setzen oder rücksetzen, etc. Diese Aufgabe richtet sich nach der Aufgabenstellung bzw. Anwendung.

Die Aufgaben 1. und 2. werden von einem Unterprogramm namens RC5ROUTINE (siehe Abschnitt 3.4.1. Unterprogramm RC5ROUTINE) zyklisch alle 250µs ausgeführt. Als Zeitbasis für den 250µs-Takt dient das Timer-0-Interrupt. Der Aufruf des Unterprogramms RC5ROUTINE erfolgt hier aber nicht von der ISR (Interrupt-Service-Routine), sondern vom Hauptprogramm. Die ISR setzt nur alle 250µs ein Flag zur Kennzeichnung, dass das Hauptprogramm das Unterprogramm RC5ROUTINE aufrufen soll.

Für die Aufgaben 3. und 4. ist das Unterprogramm RC5CHECKTELEGRAMM (siehe Abschnitt 3.4.2. Unterprogramm RC5CHECKTELEGRAMM) zuständig. Dieses Unterprogramm wird erst dann ausgeführt, wenn das Unterprogramm RC5ROUTINE das Flag RC5CHECKTEL im Register RC5STATUS setzt, also wenn ein komplettes RC5-Telegramm vom Unterprogramm RC5ROUTINE dekodiert wurde.

Die 5. Aufgabe kann von einem beliebigen Unterprogramm ausgeführt werden. Hier, bei der Demo lautet dieses Unterprogramm RC5AKTION.

Diese drei Unterprogramme (RC5ROUTINE, RC5CHECKTELEGRAMM und RC5AKTION) werden vom Hauptprogramm aufgerufen, wenn die jeweiligen Bits (= Botschaftsflags) gesetzt sind. Das Hauptprogramm prüft dazu ständig nacheinander die Flags FLAG250USEK, RC5CHECKTEL und RC5NEUETASTE. Ist das Flag FLAG250USEK gesetzt ruft das Hauptprogramm das Unterprogramm RC5ROUTINE auf. Das (Botschafts)-Flag FLAG250USEK wird von einer Timer-ISR alle 250µs gesetzt. Ist das Flag RC5CHECKTEL gesetzt, ruft das Hauptprogramm das Unterprogramm RC5CHECKTELEGRAMM auf. Ist das Flag RC5NEUETASTE gesetzt, ruft das Hauptprogramm das Unterprogramm RC5AKTION auf. Der Name dieses Unterprogramms (RC5AKTION) kann beliebig gewählt werden.

nach oben

3.2. Benötigte Register, Konstanten und Portdefinition

Register:
Für die RC5-Dekodierung sind neben einigen internen Register (SFR, Spezielle Funktions-Register) noch einige eigene Register notwendig:

Konstanten:

Es kann erforderlich sein, dass bei einer Anwendung die PIC-Taktfrequenz erhöht werden muss. In diesem Fall kann es notwendig sein, die Konstanten KONSTRC5ZAEHLERSTART und KONSTRC5ZAEHLER anzupassen.

Portdefinition:
Im Allgemeinen wird bei jeder Anwendung der Eingangspin für die RC5-Dekodierung an einem anderen Portpin verwendet. Damit dies in der Software nur an einer Stelle berücksichtigt werden muss befindet sich in der Software eine Portdefinition für den RC5-Eingang. Diese besteht aus den folgenden 3 Parametern:

Achtung: Wird für RC5INPORT der Port B verwendet, so muss für RC5INTRIS das zum Port B zugehörige TRIS-Register definiert werden. Eine mögliche Portdefinition für einen PIC-Mikrocontroller der PIC16Fxx-Familie ist:

RC5INPORT        equ        PORTB
RC5INTRIS        equ        TRISB
RC5IN            equ        0
    

Bei Verwendung eines PIC-Mikrocontrollers aus der PIC12Fxx-Familie lautet diese Portdefinition wie folgt:

RC5INPORT        equ        GPIO
RC5INTRIS        equ        TRISIO
RC5IN            equ        3    
nach oben

3.3. Initialisierung (Unterprogramm "INIT")

Dieses Unterprogramm dient zur Initialisierung des Mikrocontrollers. Der Portpin an dem der RC5-Empfänger angeschlossen ist muss als Eingang definiert werden.

Da das Unterprogramm RC5ROUTINE zyklisch (alle 250µs) aufgerufen wird, ist eine entsprechende Zeitbasis notwendig. Diese wird mit Hilfe eines Timer-Interrupt erzeugt. Für die Definition der Zeitbasis ist hier das mikrocontrollerinterne Funktions-Register OPTREG (in der Registerbank 1) zuständig. Damit bei einer PIC-Taktfrequenz von 4,096MHz eine Zeitbasis von 250µs erzeugt wird, muss das Register OPTREG mit dem binären Wert b‘00001000‘ geladen werden. Das Zählregister für diese Zeitbasis (Funktions-Register TMR0, in Registerseite 0) muss gelöscht werden.

Weiters müssen für die RC5-Dekodierung einige Register vorbelegt (initialisiert) werden.

nach oben

3.4. Unterprogramme für die RC5-Dekodierung

Wie schon beschrieben sind für die RC5-Dekodierung die folgenden 3 Unterprogramme notwendig:

Anmerkung:
Das Unterprogramm RC5AKTION ist für die eigentliche Dekodierung nicht von Bedeutung. Hier erfolgen nur die Aktionen, welche z.B. beim drücken der Taste "0", oder "Lautstärke +" etc. erfolgen sollen. Der Name dieses Unterprogramms kann daher auch beliebig geändert werden, oder sogar entfallen, wenn diese Tätigkeiten in einem anderen Unterprogramm ausgeführt werden.

nach oben

3.4.1. Unterprogramm RC5ROUTINE

Das Unterprogramm RC5ROUTINE ist für die RC5-Dekodierung die wichtigste Komponente.

Diese Routine wird ca. alle 250µs aufgerufen

Aufgabe:
Die Aufgabe des Unterprogramms RC5ROUTINE besteht darin, den am RC5-Eingangspin (RC5IN) anstehenden Datenstrom zyklisch (alle 250µs) abzutasten. Aus diesen Abtastungen den Telegrammbeginn und die laut RC5-Protokoll definierten Low- und High-Bits ermitteln. Die so ermittelten Low- und High-Bits in den Registern RC5TELEGRAMM1 und RC5TELEGRAMM2 zwischenspeichern, so dass daraus der übertragene Befehl und die übertragene Systemadresse ermittelt werden kann. (Anm. Das Ermitteln der Systemadresse und des Befehls ist nicht die Aufgabe diese Unterprogramms. Diese Tätigkeit wird u.a. vom Unterprogramm RC5CHECKTELEGRAMM übernommen. Siehe auch Abschnitt 3.4.2. Unterprogramm RC5CHECKTELEGRAMM)

Vorgehensweise:
Zuerst muss auf einen Telegrammbeginn gewartet werden. Für diesen Zweck dienen die beiden Flags RC5START und RC5STARTFLANKE im Register RC5STATUS. Diese Flags werden bei der Initialisierung des Mikrocontrollers gelöscht, sind also zu Beginn gelöscht.
Ein Telegrammbeginn wird folgendermaßen erkannt: solange das Flag RC5START nicht gesetzt ist wird der abgetastete RC5-Eingang an die niederwertigste Stelle des Registers RC5TELEGRAMM0A geschoben. Alle anderen Bits dieses Registers werden um je eine Position weiter geschoben. Das höchstwerige Bit vom Register RC5TELEGRAMM0A wird an die niederwertigste Stelle des Registers RC5TELEGRAMM0B geschoben. Alle anderen Bits dieses Registers werden auch hier um je eine Position weiter geschoben. Anschließend wird geprüft, ob beide Register den Wert FFh beinhalten. Beinhalten beide Register (RC5TELEGRAMM0A und RC5TELEGRAMM0B) den Wert FFh, so wird zurzeit kein RC5-Code übertragen und es kann auf einen Telegrammbeginn gewartet werden. Das Flag RC5START wird gesetzt, das Flag RC5STARTFLANKE wird gelöscht, und die Register RC5TELEGRAMM0A und RC5TELEGRAMM0B werden ebenfalls gelöscht. Und nun wird solange gewartet bis am RC5-Eingang ein Low anliegt. Ist dies der Fall so erfolgt ein Telegrammbeginn. Das Flag RC5STARTFLANKE wird zu diesem Zweck gesetzt und die beiden Zählregister RC5ZAEHLER1 und RC5ZAEHLER2 geladen.
Da das RC5-Telegramm aus 14 Bits besteht und das erste Startbit soeben erkannt wurde muss die Software nur mehr 13 Bits dekodieren. Daher wird das Register RC5ZAEHLER2 mit dem Wert 13 geladen. Dieses Zählregister gibt somit an wie viele Bits des RC5-Telegramms noch zu dekodieren sind.

Der Telegrammbeginn wurde nun erkannt. Nun müssen die einzelnen Bits dekodiert werden. Ein Bit nach dem RC5-Protokoll besteht aus einer 889µs langen Low-Phase und einer 889µs langen High-Phase (bei einer "0", bei einer "1" umgekehrt). Bei jedem weiteren Aufruf dieses Unterprogramms wird nun das Zählregister RC5ZAEHLER1 um 1 vermindert. Beinhaltet es danach den Wert 0, so wird der abgetastete RC5-Eingang an die niederwertigste Stelle des Registers RC5TELEGRAMM1 geschoben. Alle anderen Bits dieses Registers werden um je eine Position weiter geschoben. Das höchstwerige Bit vom Register RC5TELEGRAMM1 wird an die niederwertigste Stelle des Registers RC5TELEGRAMM2 geschoben. Alle anderen Bits dieses Registers werden auch hier um je eine Position weiter geschoben. (Anders ausgedrückt: der Zustand an RC5-Eingang wird dem RC5-Telegramm hinzugefügt). Anschließend wird der Zähler RC5ZAEHLER1 mit der Konstanten KONSTRC5ZAEHLER neu geladen und der Zähler RC5ZAEHLER2 um 1 vermindert. Besitzt der Zähler RC5ZAEHLER2 nun den Wert 0, so wurde ein komplettes RC5-Telegramm eingelesen und in den Registern RC5TELEGRAMM1 und RC5TELEGRAMM2 gesichert. Zur Kennzeichnung, dass ein komplettes RC5-Telegramm empfangen wurde, muss das Botschaftsflag RC5TELFERIG im Register RC5STATUS gesetzt werden, während das Flag RC5START (ebenfalls im Register RC5STATUS) zurückgesetzt werden muss, da ja nun auf einen neuen Telegrammbeginn gewartet werden muss.

Das im Abschnitt 5. Download downloadbare Flussdiagramm soll das soeben beschriebene und umfangreiche Unterprogramm verdeutlichen.

nach oben

3.4.2. Unterprogramm RC5CHECKTELEGRAMM

Aufgaben und Vorgehensweise:

Das im Abschnitt 5. Download downloadbare Flussdiagramm soll das soeben beschriebene und umfangreiche Unterprogramm verdeutlichen.

nach oben

3.4.3. Unterprogramm RC5AKTION

Hier erfolgen nun die für die Aufgabenstellung gewünschten Aktionen auf einen dekodierten RC5-Code. In diesem Unterprogramm kann z.B. abhängig von einem bestimmten RC5-Code (also von einer bestimmten gedrückten Taste auf einer Fernbedienung welche den RC5-Code ausstrahlt) ein Zählregister erhöht oder vermindert werden, oder ein bestimmtes Flag oder eine I/O-Pin kann nun gesetzt oder rückgesetzt werden.

Hier, zur Erläuterung das Unterprogramm RC5AKTION des Demonstrationsbeispiels von Abschnitt 4:

Aufgabe und Vorgehensweise des Unterprogramms "RC5AKTION" im Demobeispiels:
Entspricht der empfangene RC5-Befehl der Konstanten KONSTRC5DEMOPLUS, (die Konstante KONSTRC5DEMOPLUS entspricht der Taste "Lautstärke erhöhen"), den Zähler RC5DEMOZAEHLER um 1 erhöhen. Entspricht der empfangene RC5-Befehl der Konstanten KONSTRC5DEMOMINUS, (die Konstante KONSTRC5DEMOMINUS entspricht der Taste "Lautstärke vermindern"), den Zähler RC5DEMOZAEHLER um 1 vermindern. Anschließend nur die 3 niederwertigsten Bits vom Zähler RC5DEMOZAEHLER am Port GPIO ausgeben.
Zum Schluss das Anforderungsflag RC5NEUETASTE wieder löschen

nach oben


zurück zu Elektronik, Homepage

Autor: Buchgeher Stefan
Erstellt: 5. Juli 2004
Letzte Änderung: 10. Oktober 2004