- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: RC5 Code empfangen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    33
    Beiträge
    460

    RC5 Code empfangen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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/RC...%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:

    Code:
    #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

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    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 ?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    33
    Beiträge
    460
    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/RC...Mega#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

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen