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
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....
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
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
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
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
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... :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.