Der RC5-Code wird in Infrarot-Ferndedienungen von Philips verwendet und
ist sehr gut dokumentiert. Daher wird er sehr gerne in eigenen Projekten
verwendet
Ich möchte hier nicht weiter auf den Aufbau eingehen, da es dazu
bereits eine Menge guter Seiten gibt.
Oftmals sieht man die Verwendung zweier Interrupts, eines externen Interrupts, um die Startflanke zu erkennen und eines Timerinterupts, um danach die einzelnen Bits abzutasten. Diese Lösung hat aber mehrere gravierende Nachteile:
Beim RC5-Signal beträgt die Bitzeit 1,778ms. Das ist aus der Sicht des AVR schon eine elendlange Zeitdauer, d.h. solche langen Zeiten pollt man daher besser im Timerinterrupt: Dadurch ergeben sich folgende Vorteile:
Wenn man sich den Aufbau des RC5-Signals ansieht, besteht jedes Bit aus einer Flanke in der Mitte der Bitzeit, wobei der Pegel nach der Flanke dem Bitwert entspricht. Da die IR-Empfänger einen invertierten Ausgang haben, muß man also den Wert nach der Flanke invertieren. Jedes RC5-Paket beginnt also mit einer 1->0 Flanke und entspricht damit dem Startbit !0 = 1.
Die Flankenerkennung erfolgt dadurch, daß sich der letzte Zustand des
Eingangs gemerkt wird und mittels EXOR mit dem neuen Zustand verglichen wird.
Die EXOR-Verknüpfung ist also war, wenn die beiden Eingangswerte
unterschiedlich sind, d.h. nach jeder Flanke.
Danach muß man nur im Bitabstand weiter abtasten und voila, nach 14
Bitzeiten hat man alle Bits.
Damit es nun dabei nicht zu Zeitverschiebungen aufgrund zu hoher Toleranzen
kommt, wird bei jeder Flanke neu synchronisiert. Um die Hilfsflanken
auszublenden, werden nur Flanken, die nach 0,8 ... 1,2 Bitzeiten kommen
ausgewertet.
Zur Vermeidung der Reaktion auf fremde Codes werden Pulse, die kürzer
als 0,4 Bitzeiten sind, als Fehler erkannt und die Empfangsroutine
rückgesetzt.
Wird nun nach dem letzten Impuls für 1,2 Bitzeiten keine weitere Flanke
erkannt, wird geprüft, ob auch genau 14 Bits empfangen wurden (wird
an der Position des Startbits erkannt) und dann diese in das Datenregister
ausgegeben. Ansonsten werden die Empfangsdaten verworfen.
Der Timerinerrupt wurde so eingestellt, daß er alle 512 Zyklen aufgerufen wird. Damit ergeben sich bei 4MHz je Bitzeit 4e6/512*1.778e-3=14 Aufrufe des Timerinterrupts. Das ist ausreichend fein gestaffelt, um die verschiedenen Zeitbedingungen testen zu können. Bei höheren Quarzfrequenzen kann man die Zyklenzahl entsprechend erhöhen.
Hier die komplette Interruptroutine:
Zu dem Testprogramm gibt es nichts besonderes zu sagen. Sobald ein kompletter
RC5-Code empfangen wuirde, wird dieser über die UART ausgegeben, getrennt
nach Toggle-Bit, Geräte-Adresse und Tastenkode.
Zusätzlich werden die untersten 8 Bits auf LEDs an PORTB ausgegeben.
.