maltepöggel.de

Infrarot Library für Fernbedienungen nach dem NEC Protokoll

BSD lizensierte Empfangs-Bibliothek für ATMega und ATTiny / AVR-GCC

Da ich leider im Internet keinen Code mit entsprechender Lizensierung finden konnte habe ich mir kurzerhand meine eigene Funktionsbibliothek geschrieben. Die Implementierung benötigt einen Interrupt sowie einen 8-Bit Timer und funktioniert auf einem ATMega48, ATMega88, ATMega168, ATMega328 sowie ATTiny2313 und ATTiny4313.

Foto: Verschiedene passende Fernbedienungen

Im Interrupt wird mit einer Statemachine gearbeitet um das Signal zu decodieren. Das Signal wird komplett ausgewertet und auf Fehler überprüft. Außerdem kann ausgelesen werden, ob der Benutzer die Taste gedrückt hält. Die Bibliothek kommt bei verschiedenen von mir entwickelten Bausätzen und Projekten zum Einsatz.

Benutzung der Bibliothek

Die entsprechenden Timer- und Interrupteinstellungen werden mit folgendem Aufruf initialisiert:

// Initialize IR lib
ir_init();

Nun liegt das zuletzt empfangene Paket in einer struct ir_struct bereit, welche in der globalen Variable ir abrufbar ist. Diese beinhaltet Adresse, Kommando sowie ein Status Flag. Das Bit IR_RECIEVED des Flags wird gesetzt wenn ein gültiges Paket empfangen wurde und muss im Hauptprogramm nach erfolgter Verarbeitung zurückgesetzt werden. Solange die Taste gehalten wird, ist das Bit IR_KEYHOLD gesetzt.

Die Verarbeitung könnte etwa so aussehen:

// Check if new code is received
if(ir.status & (1<<IR_RECEIVED)) {
 // Remote address ok?
 if(ir.address==42) {
  switch(ir.command) {
   case 64:
    // Do something useful
    break;
    // [...]
  }      
 }
 // Reset state
 ir.status &= ~(1<<IR_RECEIVED);
}

Sollte kein Empfang mehr gewünscht sein, so können die Interrupts durch folgenden Aufruf wieder angehalten werden:

// Stop IR lib
ir_stop();
Video
Download
Weiterführende Links
Lizenz