mikrocontroller.net

Forum: Compiler & IDEs RC5 von Peter Dannegger


Autor: technikus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich probiere mich seit Tagen an dem RC5 Beispiel von Peter Dannegger.
Im Anhang die von mir geänderten Dateien.

Ich setze einen ATMega48 mit 8MHz internem RC Osz. ein.

Der IR Empfänger hängt auf PD5.

PB1 soll über die FB Taste (Geräteadresse16, Kommando 16) An- und 
Ausgeschaltet werden.

PB2 ist mit dem gleichen Befehl in der Timer ISR eingebaut um zu 
erkennen das die ISR aufgerufen wird (leuchtet also auch).

Da ich mittlerweile total verzweifelt bin, habe ich die Schaltung + 
Fernbedienung mal in Bascom mit den Standard Bascom Befehlen probiert, 
und dort funktioniert es.

Da ich C-Neueinsteiger bin vermute ich einen dummen Gedankenfehler und 
bitte um Eure Mithilfe!

Danke
technikus

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Fehler weiter eingrenzen können. Wenn ich in der 
Hauptschleife die LED an PB2 ansteuere, wie hier
while(1)
   {        
    cli();
    i = rc5_data;               //2 Bytes aus Interrupt lesen
    rc5_data = 0;
    sei();


    if( i )           //wenn Daten Empfangen
    {           
     
     PORTB ^= (1<<PB2);  //<---HIER            
    ToggleBit= i >>11 & 1;       // Toggle Bit
     
    DeviceAdress= i >> 6 & 0x1F;  //Geräte Adresse
     
    KeyCode= (i & 0x3F) | (~i >> 7 & 0x40);    // Tastencode
...

Dann macht PB2 nichts :-(
Also kommen wohl auch keine Daten aus der ISR in rc5.c....

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

läuft nun alles soweit :-)

Der Fehler lag im Detail...

Anstatt
extern uint rc5_data;        //RC5 Ergebnis

muss es
extern volatile uint rc5_data;        //RC5 Ergebnis

heißen.

Ich frage mich warum die Fehlerhafte Datei so zu Download stand und alle 
waren glücklich damit?


Gruß
technikus

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
technikus wrote:
> Ich frage mich warum die Fehlerhafte Datei so zu Download stand und alle
> waren glücklich damit?

Na dann setzt Dich erstmal hin, ich muß Dir ne ganz große Enttäuschung 
mitteilen:

Die Leute, die in der Codesammlung schreiben sind keine gottgleichen 
Wesen, die nie Fehler machen dürfen. Es sind ganz normale Menschen.


Außerdem läuft das Programm ja, so wie es ist.
Der Fehler tritt erst nach Deinen Änderungen auf.

Im (zur Zeit) 13. Beitrag von unten steht mehr dazu. Man kann leider 
ältere Beiträge nicht editieren.


Peter

Autor: Gerhard. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

"Na dann setzt Dich erstmal hin, ich muß Dir ne ganz große Enttäuschung
mitteilen:

Die Leute, die in der Codesammlung schreiben sind keine gottgleichen
Wesen, die nie Fehler machen dürfen. Es sind ganz normale Menschen."

dem muss ich widersprechen. Deine Programbeispiele funktionieren bei mir 
(und sogar auf PIC portiert) immer. Nicht immer sofort. Und wenn es beim 
ersten Mal nicht richtig geht ist das ja ein guter Grund sich in die 
Details der Funktionen richtig einzuarbeiten.

Moechte mich an dieser Stelle fuer Deine Drehencoder und Keypad routinen 
bedanken - Die sind echt grosse Klasse. Deine Programmebeispiele sind 
wunderbar portierbar. Wollte das schon laengst mal schreiben.

Moral von der Geschicht: "Vertrau dem Peter" ;-)

MFG,
Gerhard

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,

ich bin schon enttäuscht das es vorher keinem aufgefallen ist. 
Schließlich waren es ja einige user.

Ich hätte da noch zwei Fragen zu deinem Code (bin eben c- einsteiger):

1. Hier landen ja die RC5 Daten:
unsigned int  rc5_tmp;        // shift bits in  

Aber wie passen 14 Bits in eine 8 Bit Variable? Ich verstehe leider den 
Hintergrund nicht.

2.
#define PULSE_MIN  (uchar)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
#define PULSE_1_2  (uchar)(XTAL / 512 * RC5TIME * 0.8 + 0.5)
#define PULSE_MAX  (uchar)(XTAL / 512 * RC5TIME * 1.2 + 0.5)

Wie kommt man genau auf den Wert (hier 512). Heißt dass hier --> Der 
Timer Interrupt wird alle 512 Zyklen aufgerufen?

Danke und Gruß

technikus

Autor: Ja Mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgend jemand hat hier mal einen sehr klugen und zutreffenden Satz 
geschrieben:

"Heruntergeladener Code funktioniert erst wenn man ihn verstanden hat."
Das war bei mir ausnahmslos bisher immer so wenn ich etwas aus der 
Codesammlung verwendet habe... :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
technikus wrote:
> ich bin schon enttäuscht das es vorher keinem aufgefallen ist.
> Schließlich waren es ja einige user.

Nö, es ist ja aufgefallen, sonst hätte ich ja nicht die Antwort dazu 
geschrieben:
> Im (zur Zeit) 13. Beitrag von unten steht mehr dazu.

Da man altes aber nicht editieren kann, muß man eben bei Problemen mit 
Codebeispielen sich die Zeit nehmen, alles zu lesen.

> 1. Hier landen ja die RC5 Daten:
>
unsigned int  rc5_tmp;        // shift bits in  
>
> Aber wie passen 14 Bits in eine 8 Bit Variable? Ich verstehe leider den
> Hintergrund nicht.

unsigned int ist beim AVR-GCC 16Bit, 14Bit passen also bequem rein.

> Wie kommt man genau auf den Wert (hier 512). Heißt dass hier --> Der
> Timer Interrupt wird alle 512 Zyklen aufgerufen?

Ja, Vorteiler 256 und Preload auf -2: 2 * 256 = 512

Peter

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.