RC5 - Dekoder

Einleitung:

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.

Nachteile üblicher Lösungen:

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:

Vorteile meiner Lösung:

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:

Funktionsbeschreibung:

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:

Testprogramm:

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.

.