Forum: Compiler & IDEs RC5 von Peter Dannegger


von technikus (Gast)


Angehängte Dateien:

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

von technikus (Gast)


Lesenswert?

Ich habe den Fehler weiter eingrenzen können. Wenn ich in der 
Hauptschleife die LED an PB2 ansteuere, wie hier
1
while(1)
2
   {        
3
    cli();
4
    i = rc5_data;               //2 Bytes aus Interrupt lesen
5
    rc5_data = 0;
6
    sei();
7
8
9
    if( i )           //wenn Daten Empfangen
10
    {           
11
     
12
     PORTB ^= (1<<PB2);  //<---HIER            
13
    ToggleBit= i >>11 & 1;       // Toggle Bit
14
     
15
    DeviceAdress= i >> 6 & 0x1F;  //Geräte Adresse
16
     
17
    KeyCode= (i & 0x3F) | (~i >> 7 & 0x40);    // Tastencode
18
...

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

von technikus (Gast)


Lesenswert?

Hallo,

läuft nun alles soweit :-)

Der Fehler lag im Detail...

Anstatt
1
extern uint rc5_data;        //RC5 Ergebnis

muss es
1
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

von Peter D. (peda)


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

von Gerhard. (Gast)


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

von technikus (Gast)


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:
1
unsigned int  rc5_tmp;        // shift bits in

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

2.
1
#define PULSE_MIN  (uchar)(XTAL / 512 * RC5TIME * 0.4 + 0.5)
2
#define PULSE_1_2  (uchar)(XTAL / 512 * RC5TIME * 0.8 + 0.5)
3
#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

von Ja Mann (Gast)


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... :-)

von Peter D. (peda)


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:
>
1
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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.