Oje, mit Sony-Code kenne ich mich überhaupt nicht aus. Ich mag mich auch grad nicht einlesen. Wenn du eine Fernbedienung mit RC5 verwenden würdest, könnte eine Funktion etwas so aussehen:
Code:
// RC5 dekodieren mit invertierendem 36kHz-TSOP und Zaehlschleifen (ungetestet!) 14.05.2011 mic
// https://www.roboternetz.de/community/showthread.php?53211-Arduino-mit-Infrarot-Receiver-Auswertung
#include <avr/io.h>
#define digitalRead(IRpin) !(PINA && (1<<0)) // Dummydefine für einen invertierenden TSOP-Eingang an PA0
#define LOW (0==1) // LOW ist false und...
#define HIGH !LOW // HIGH ist true ;)
int get_rc5_bitmuster(void) // RC5-Bitmuster einlesen mit Zaehlschleife
{
char bit=12; // 14Datenbits-12Startbits einlesen
int bitmuster=0; // Speicher für 14 RC5-Datenbits
int bitlaenge=0, count=0, dummy=0; // Bitlaenge, Zaehler für die Bitlaengen, Dummy
while(digitalRead(IRpin)==LOW) {} // warten auf Startbits
while(digitalRead(IRpin)==HIGH) {bitlaenge++;} // Dauer von zwei Startbits messen
bitlaenge/=2; // Bitlaenge berechnen
bitmuster=(1<<13)|(1<<12); // die Bits 13 und 12 im Bitmuster speichern (Startbits)
count=bitlaenge/4*3; // erster Lesezeitpunktdatenbits nach 3/4 der Bitlaenge
while(bit--) // weitere 12 Datenbits einlesen
{
while(count){count--; dummy++;}; // stimmt das Timeing???
if(digitalRead(IRpin)) // IR-Pegel einlesen...
bitmuster|=(1<<bit); // ...und abspeichern
count=bitlaenge; // naechster Lesezeitpunkt: 1/4+3/4 Bitlaenge oder eine Bitlaenge
}
while(count){count--; dummy++;} // eine Bitlaenge warten
return(bitmuster);
}
//
int main(void)
{
int RC5_Kommando;
while(1) RC5_Kommando=get_rc5_bitmuster();
return(0);
}
Ungetestet, aber das könnte mit einem invertierenden 36kHz-Tsop funktionieren, wenn diese beiden Schleifen ähnliche Ausführungszeiten besitzen würden:
while(digitalRead(IRpin)==HIGH) {bitlaenge++;}
while(count){count--; dummy++;}
Ohne Timer und Interrupts scheint mir das eine sehr einfache RC5-Funktion zu sein. Das muss ich bei Gelegenheit mal selbst testen ;)
Lesezeichen