mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RC5 von Danneger auf ATmega8 - seltsames Verhalten


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Zeile
DDRB = i;        // LED output
gelöscht. Trotzdem klappt das Dekodieren nicht.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim Attiny2313 musst ich auch die Initialisierung vom Timer (Register 
für den Vorteiler) ändern (s. Link oben). Möglicherweise musst du 
ähnliches für den Atmega8 machen. Der Code wurde ja ursprünglich nicht 
für den Atmega8 geschrieben...

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe auch noch einen Atmega8 zuhause und kann den Code am Wochenende 
darauf ausprobieren (nur wenn es regnet ;-)

Autor: Bohrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe vor kurzem mit dem selben Code und Problem gekämpft.

Ich habe die Compileroptimierung abgeschalten dann gings.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>volatile bei rc5_data hinzuzufügen
Das war's! Vielen Dank! :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.