RC5 Empfang, Details

    no english page available

Hardware

    RC5 wird im infraroten Lichtbereich (darum auch IR-Fernbedienung) bei Wellenlänge 940 ...950 nm zum Empfänger übertragen. Das Licht wird mit 36kHz getaktet, Puls-Pausen-Verhältnis 1:3. Es gibt integrierte preiswerte Empfänger (z.B. SFH506-36 oder TSOP1136 bzw. TSOP1736), welche die Demodulation erledigen und die rohen Bitdaten (aktiv low) ausgeben.

Software

    Dieses Signal wird nun vom Atmel ausgewertet. Hierzu gibt es bereits verschiedene veröffentlichte Ansätze, welche unterschiedliche Güten der Störunterdrückung und Übertragungssicherheit erreichen. So richtig gefallen hat mir kein Ansatz, deshalb gibt es folgendes Vorgehen:
  • Das Eingangssignal wird mit einem festen Zeitraster abgetastet. Bei der Wahl der Taktrate muß man die verursachte Prozessorlast und die Sicherheit der Erfassung abwägen. Hier gewählt: 10kHz
  • Zur Vermeidung von Fehlreaktionen auf Grund von Störungen wird ein Tiefpaß über das Eingangssignal gerechnet. Dieser sollte maximal die Länge einer Phase haben. Hier gewählt: L(Tiefpass) = 7, damit eine Integrationszeit bei 10kHz von 700us.
  • Das Ausgangssignal des Tiefpasses wird einem Trace-Algorithmus zugeführt, welcher die Augenöffnung und korrekten Bi-Phase Code kontrolliert. Damit werden falsch empfangene Pakete aussortiert und zugleich ein kontinuierlicher Resnyc mit den Eingangsignal durchgeführt.

Details

  • Filteralgorithmus:
    Es wird ein einfacher Tiefpass gerechnet. Die Eingangsdaten werden in ein Byte einschoben, dann wird die Quersumme berechnet. Startet man die Berechnung mit einem Offset von -4, dann ist das Vorzeichenbit der Quersumme zugleich das gefilterte Eingangsbit.
    Filteralgorithmus
    unsigned char temp; signed char filter_val = 0;
    
    temp = rc5.filter_data << 1;
    if (PIND & (1<<RC5_n))  temp |= 1;      // shift incoming data to filter
    rc5.filter_data = temp;
    
    if (temp & (1<<0)) filter_val++;        // lowpass over 7 samples
    if (temp & (1<<1)) filter_val++;
    if (temp & (1<<2)) filter_val++;
    if (temp & (1<<3)) filter_val++;
    if (temp & (1<<4)) filter_val++;
    if (temp & (1<<5)) filter_val++;
    if (temp & (1<<6)) filter_val++;
    
    filter_val -= 4;                               // filter_val now: [-4...3]
                                                   // sign bit is input state (already inverted)
  • Signalverfolger:
    Nun werden die gefilterten Daten auf Flankenwechsel zum jeweils richtigen Zeitpunkt geprüft. Hierfür wird für jeden Sample die bisher abgelaufene Zeit incrementiert und gegen Grenzen verglichen: Die Grenzen ergeben sich aus dem RC5-Code: 'HALFBIT' ist die Zeit für ein halbes Bit, und mit 'EPS' wird jeweils ein Toleranzschlauf für die Zustandsübergänge vorgegeben.
    Es gibt im Prinzip 4 Zustände:
     - '0' in der ersten oder zweiten Phase.
     - '1' in der ersten oder zweiten Phase.

    Sollte ein unerwarteter Zustandsübergang auftreten, so wird der Signalverfolger zurückgesetzt und wartet wieder auf eine längere Sendepause.
  • Übergabe ans Hauptprogramm:
    Wenn nach genau 14 Bits ein Kodierfehler auftritt, so ist eine gültige Nachricht empfangen. Diese wird in rc5.data übergeben.

Einstellen der Fernbedienung

    Die Fernbedienung habe ich auf Marantz, Code 027 eingestellt.

Weiter zu: