PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RC5 Code empfangen



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

RP6conrad
08.08.2010, 22:31
Irgendwo muss doch auch eine ISR INT0(interrupt sub routine) in AT uebertragen werden. Diesen ISR soll dan doch die decodierung von RC5 machen. Hasst du das gemacht ?

Christoph2
09.08.2010, 02:17
Hmm ich verstehe nicht ganz was du meinst...

Beim Hauptprogramm habe ich mich nach den Beispielen orientiert die ganz unten im Artikel sind:
http://www.rn-wissen.de/index.php/RC5-Decoder_f%C3%BCr_ATMega#Beispiele

Wo soll eine interrupt sub routine übertragen werden und was meinst du mit AT?
Ich habe nur das Hauptprogramm geschrieben an rc5.h und rc5.c hab ich nichts verändert. Es kommen auch sonst keine .h oder .c files zum Einsatz.

lg Christoph

RP6conrad
09.08.2010, 19:20
AT =ATmega. Interruptroutine ist in rc5.c. Aber da steht auch ein Hinweis : Der beteiligte INT-Port wird nicht auf IN geschaltet und das I-Flag in SREG (Global Interrupt Enable/Disable-Flag) wird nicht verändert.
In ihre hauptprogram mach du das doch ? Versuch mal das raus zu lassen.