Die Aufgabe der PIC-Software besteht bei der RC5-Dekodierung aus mehreren Teilaufgaben:
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.
Register:
Für die RC5-Dekodierung sind neben einigen internen Register (SFR, Spezielle
Funktions-Register) noch einige eigene Register notwendig:
Bit Flagname Funktion
0 RC5START Hilfsflag zur Erkennung eines Telegrammstarts
1 RC5STARTFLANKE Hilfsflag zur Erkennung eines Telegrammstarts
2 RC5CHECKTEL gesetzt, wenn ein vollständiges RC5-Telegramm dekodiert wurde
3 RC5TELGUELTIG gesetzt, wenn mehrmals das selbe Telegramm empfangen wurde
4 RC5TOGGLEALT Toggle-Bit des "alten" Telegramms
5 RC5TOGGLENEU Toggle-Bit
6 RC5NEUETASTE gesetzt, wenn eine neue Taste gedrückt wurde und mehrmals
das selbe Telegramm empfangen wurde
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
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.
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.
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.
Aufgaben und Vorgehensweise:
Das im Abschnitt 5. Download downloadbare Flussdiagramm soll das soeben beschriebene und umfangreiche Unterprogramm verdeutlichen.
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