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:
Ungetestet, aber das könnte mit einem invertierenden 36kHz-Tsop funktionieren, wenn diese beiden Schleifen ähnliche Ausführungszeiten besitzen würden: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); }
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 ;)






Zitieren

Lesezeichen