Datum:
Hallo, ich habe einen TSOP34838 an PB0 an einem ATmega8L hängen. Jetzt möchte ich gerne RC5-Signale von einer Fernbedienung auswerten. Folgende Anpassungen habe ich vorgenommen: main.h
#define xRC5_IN PINB #define xRC5 PB0 #define XTAL 1000000 // Interner Oszillator, 1MHz |
Der Code läuft soweit, als dass ich
RC5-Dekoder: |
auf dem Terminal empfange. Allerdings kommt daraufhin beim Drücken der Fernbedienungstasten keine weitere Ausgabe. Der OUT-Pin des TSOP34838 reagiert allerdings auf die Fernbedienung; ich habe das mit dem Oszilloskop untersucht. Daraufhin habe ich folgende Debug-Erweiterung in den Code eingepflegt: main.c
for(;;){ // main loop cli(); i = rc5_data; // read two bytes from interrupt ! rc5_data = 0; sei(); if( i ){ DDRB = i; // LED output putchar(( i >> 11 & 1) + '0'); // Toggle Bit putchar(' '); itoa( i >> 6 & 0x1F, s, 10); // Device address puts( s ); putchar(' '); itoa((i & 0x3F) | (~i >> 7 & 0x40), s, 10); // Key Code puts( s ); puts( "\n\r" ); } // -------------- BEGIN: DEBUG ----------------- if (!(xRC5_IN & (1 << xRC5))) { puts("a"); } // -------------- END: DEBUG ------------------- } |
Jetzt erscheinen auf dem Terminal beim Drücken einer Taste auf der Fernbedienung lauter "a". Der Mikrocontroller kann also Signale empfangen. Warum kann er aber nicht den RC5-Code dekodieren und per UART raussenden?
Datum:
Vielleicht sind die 1 MHz zu knapp bemessen, um die RC5 Auswertung in der Interruptroutine zu machen. Du könntest mal versuchen den Atmega8 mit intern 8 MHz zu takten. Dazu steht was im Abschnitt Calibrated Internal RC Oscillator mit Table 9. Internal Calibrated RC Oscillator Operating Modes im Datenblatt. Mit 8 MHz und einem Attiny2313 funktioniert Peters Code (http://www.mikrocontroller.net/articles/Pollin_Fun...)
Datum:
Ich habe jetzt per Fuse-Bit den internen Oszillator auf 8MHz gestellt und es auch in den defines entsprechend geändert: main.h
#define XTAL 8000000 // Interner Oszillator, 8MHz |
Leider dekodiert er es immernoch nicht...
Datum:
Hmm. Bist du sicher, dass die Fernbedienung RC5 sendet? Ich hatte mir extra eine Universal-FB beschafft und auf RC5 eingestellt (war einfacher als einen RC5-Sender aufzubauen). Dein Debugcode springt ja bei fast jedem Gezappel an der Datenleitung an und der IR-Empfänger bei jedem IR-Lichtblitz mit richtiger Grundmodulation (um die 38 KHz). Der RC5 Decodercode in der Interruptroutine prüft aber, ob die Lichtblitze auch wie RC5-Kommandos aussehen. Hast du die Möglichkeit die Datenleitung vom Sensor auf ein Oszilloskop zu geben und eine Kommandofolge aufzuzeichnen? Dann sieht man rel. leicht, ob es RC5 ist (http://www.sbprojects.com)
Datum:
Ja, es handelt sich defintiv um eine RC5-Fernbedienung! Es ist die "HQ RC Univers 29", eingestellt auf den Code 335 http://wiki.ctbot.de/index.php/RC_Univers_29
Datum:
am Port B soll das IR Bit eingelesen werden und gleichzeitig der Code ausgegeben werden?
DDRB = i; // LED output |
ist sowieso falsch, für die Ausgabe müsste
PORTx = i; |
gesetzt werden.
Datum:
Ich habe die Zeile
DDRB = i; // LED output
|
gelöscht. Trotzdem klappt das Dekodieren nicht.
Datum:
>Beim Attiny2313 musst ich auch die Initialisierung vom Timer ändern. >Möglicherweise musst du ähnliches für den Atmega8 machen. Habe folgende Zeilen und Register überprüft: main.c
TCCR0 = 1<<CS02; // auch bei Mega8: Prescaler=256 TIMSK = 1<<TOIE0; // auch bei Mega8: OF-Interrupt |
Und für richtig empfunden.
Datum:
Ich habe auch noch einen Atmega8 zuhause und kann den Code am Wochenende darauf ausprobieren (nur wenn es regnet ;-)
Datum:
habe vor kurzem mit dem selben Code und Problem gekämpft. Ich habe die Compileroptimierung abgeschalten dann gings.
Datum:
>Ich habe die Compileroptimierung abgeschalten dann gings. Das fehlende volatile bei rc5_data hinzuzufügen, wäre auch eine Lösung gewesen. Wie schrieb Peter Danneger selber: >Versuch mal: >volatile uint rc5_data; >Der GCC hat die unangenehme Eigenschaft, Zugriffe auf globale Variablen >wegzuoptimieren. >Der Aufruf einer externen Funktion hindert ihn daran, da diese ja die >Variable ändern könnte. >Ich falle da auch regelmäßig drauf rein. Oliver
Datum:
Hallo, schau mal hier nach, hier verwende ich die Routine von Peter mit einem externen 4 Mhz Quarz. Beitrag "Platine und Software für ALPS-Motorpotentiometer" Allerdings nutze ich einen TSOP1736. Gruß Frank
Datum:
bei mir lief es auf einem Mega32 und Optimierung nach size war ein, allerdings noch mit einem älteren gcc 3.4.3. Dann habe ich in meinem Code noch ein _delay_ms(10.0); in der mainloop drin, weiss aber nicht mehr ob das wirklich nötig war.
Datum:
>volatile bei rc5_data hinzuzufügen
Das war's! Vielen Dank! :-)