Christoph2
08.08.2010, 20:03
Hi,
ich möchte mit einem ATmega8 RC5-codierte Signale einer IR Fernbedienung empfangen.
Ich habe dazu einen TSOP 1738 zur Verfügung, und habe die Schaltung und den Code (rc5.h und rc5.c) aus dem RN Wissensbereich:
http://www.rn-wissen.de/index.php/RC5-Decoder_f%C3%BCr_ATMega
Der Code funktioniert angeblich für jeden ATmega mit nur einer einzigen Änderung: Der Prescaler muss abhängig vom Quarz eingestellt werden.
Ich verwende den internen RC Oszillator mit 1Mhz.
Bei 16MHz soll als Prescaler 1024 verwendet werden, das heißt bei 1MHz...
16 / 1024 = 1 / X
=> X=64
Das habe ich auch so eingestellt. Hier ist mein Hauptprogramm:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <rc5.h>
#define RC5_PRESCALE 64
#define RC5_INT RC5_INT0
int main()
{
uint8_t code=0, addr=0;
DDRD&=~(1<<2); // INT0 ist Eingang (TSOP1738)
DDRB|=(1<<1); // OC1A ist Ausgang (LED)
/* Nach dem Starten 3 Mal blinken (um zu sehen dass die Led funktioniert) */
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
_delay_ms(300);
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
_delay_ms(300);
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
/* RC5 initialisieren, alle Adressen zulassen */
rc5_init (RC5_ALL);
/* Interrupts zulassen */
sei();
while(1)
{
/* Gibt's was Neues? */
if (-1 == rc5.flip)
{
/* Nein, dann mach irgendwas (oder nix) */
}
else
{
/* Ja, dann rc5.code merken und evtl. rc5.addr */
/* falls man die braucht und nicht sowieso schon kennt */
code = (uint8_t) rc5.code;
addr = (uint8_t) rc5.addr;
/* code (evtl. addr) auswerten */
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
/* und auf naechstes Zeichen warten */
rc5.flip = -1;
}
} //while(1) ENDE
} // main ENDE
Das Programm soll einfach wenn irgendein RC5 Befehl empfangen wurde eine LED 300ms lang leuchten lassen.
Ich habe es ohne Errors und Warnings compilieren können, die LED funktioniert sicher (ich lasse sie nach dem starten zur Überprüfung 3 Mal blinken), und den Ausgang des TSOP hab ich schon mit einem Oszi inspiziert, und es kommt ein wunderschönes Signal heraus (wenn ich eine Taste auf der Fernbedienung gedrückt halte sind es immer 24ms Signal, dann eine Pause, dann wieder 24ms Signal, etc. Das Signal wiederholt sich ca. alle 110ms. Genau so ist der RC5 Standard beschrieben).
Irgendwie funktioniert es aber trotzdem nicht... Nach den 3 Mal blinken beim Starten bleibt die LED dunkel...
Findet ihr irgendeinen Fehler in den paar Zeilen Code oder irgendwas was ich vergessen habe?
lg Christoph
ich möchte mit einem ATmega8 RC5-codierte Signale einer IR Fernbedienung empfangen.
Ich habe dazu einen TSOP 1738 zur Verfügung, und habe die Schaltung und den Code (rc5.h und rc5.c) aus dem RN Wissensbereich:
http://www.rn-wissen.de/index.php/RC5-Decoder_f%C3%BCr_ATMega
Der Code funktioniert angeblich für jeden ATmega mit nur einer einzigen Änderung: Der Prescaler muss abhängig vom Quarz eingestellt werden.
Ich verwende den internen RC Oszillator mit 1Mhz.
Bei 16MHz soll als Prescaler 1024 verwendet werden, das heißt bei 1MHz...
16 / 1024 = 1 / X
=> X=64
Das habe ich auch so eingestellt. Hier ist mein Hauptprogramm:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <rc5.h>
#define RC5_PRESCALE 64
#define RC5_INT RC5_INT0
int main()
{
uint8_t code=0, addr=0;
DDRD&=~(1<<2); // INT0 ist Eingang (TSOP1738)
DDRB|=(1<<1); // OC1A ist Ausgang (LED)
/* Nach dem Starten 3 Mal blinken (um zu sehen dass die Led funktioniert) */
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
_delay_ms(300);
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
_delay_ms(300);
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
/* RC5 initialisieren, alle Adressen zulassen */
rc5_init (RC5_ALL);
/* Interrupts zulassen */
sei();
while(1)
{
/* Gibt's was Neues? */
if (-1 == rc5.flip)
{
/* Nein, dann mach irgendwas (oder nix) */
}
else
{
/* Ja, dann rc5.code merken und evtl. rc5.addr */
/* falls man die braucht und nicht sowieso schon kennt */
code = (uint8_t) rc5.code;
addr = (uint8_t) rc5.addr;
/* code (evtl. addr) auswerten */
PORTB|=(1<<1);
_delay_ms(300);
PORTB&=~(1<<1);
/* und auf naechstes Zeichen warten */
rc5.flip = -1;
}
} //while(1) ENDE
} // main ENDE
Das Programm soll einfach wenn irgendein RC5 Befehl empfangen wurde eine LED 300ms lang leuchten lassen.
Ich habe es ohne Errors und Warnings compilieren können, die LED funktioniert sicher (ich lasse sie nach dem starten zur Überprüfung 3 Mal blinken), und den Ausgang des TSOP hab ich schon mit einem Oszi inspiziert, und es kommt ein wunderschönes Signal heraus (wenn ich eine Taste auf der Fernbedienung gedrückt halte sind es immer 24ms Signal, dann eine Pause, dann wieder 24ms Signal, etc. Das Signal wiederholt sich ca. alle 110ms. Genau so ist der RC5 Standard beschrieben).
Irgendwie funktioniert es aber trotzdem nicht... Nach den 3 Mal blinken beim Starten bleibt die LED dunkel...
Findet ihr irgendeinen Fehler in den paar Zeilen Code oder irgendwas was ich vergessen habe?
lg Christoph