Hi, ich hatte hier schon mal einen Thread aber da ging es mehr um das Layout als um die Software. Es handelt sich um den RC5 Sender von www.a-netz.de Ich habe vor einem guten halben Jahr die aktuelle Software des Autors bekommen(noch nicht auf der Website) und er hat mir (Anfänger) geholfen mehr Taster dran zu bringen. Das Projekt lag lange Zeit auf Eis und ich bin heute endlich zum Überspielen gekommen - und es funktioniert einfach nicht. Mit dem original Code funktioniert alles einwandfrei aber mit dem modifizierten nicht. Ich poste hier mal den Code. Es sgibt in der Schaltung eine normale und eine IR LED die normale macht eigentlich das gleiche wie die IR, sie blitzt in dem Takt, wie die IR LED. Diese LED macht aber kein Mux. Hoffe mir kann und will jemand weiterhelfen, den Code zum Laufen zu bringen Gruß, Hendi Achja die angehänget datei ist eine von mehreren sie enthält die Tastenzuordnung und was passiert, wenn man eine Taste drückt.
:
Verschoben durch User
Ich wüßte nicht, wie diese Datei dabei helfen kann, eine nicht blitzende LED zu erforschen. Keine main (was wird wie aufgerufen), die Header muß man auch kennen (z.B. Deklaration von
1 | uint8_t rc5_get_cmd(rc5_cmd_t *cmd) { |
) Das Einzige, was so ersichtlich ist (bzw. so scheint), ist, das *cmd die Größe eines Bytes hat ... Hendi schrieb: > Mit dem original Code funktioniert alles einwandfrei aber mit dem > modifizierten nicht. Was "funktioniert" bzw. "funktioniert nicht"? Ist das Einzige, daß die normale LED (=> zumindest nicht sichtbar) blitzt? Das ganze mußt Du schon sehr viel genauer rüberbringen.
Ok ich versuchs nochmal: Es handelt sich um eine RC Fernbedienung. Wenn eine Taste gedrückt wird, soll die IR LED einen bestimmten RC5 code senden (logisch), im gleichen "Rhythmus" wie die IR LED blitzt eine normale Rote LED,als Statuskontrolle. Mit dem Originalprogramm funktioniert das auch einwandfrei. Nun habe ich noch ein paar Eingänge hinzugefügt, da ich mehr Tasten brauchte.Diese habe ich dann in der Sende Routine mit aufgenommen. Diese bestand vorher aus Kommandos wie case und break, diese habe ich dann durch if und else ersetzt, was mir der Autor dieses Codes geraten hat und auch gezeigt hat, wie ich es machen muss. Das ganze funktioniert jetzt aber nicht. Ich habe nur die Datei buttons.c verändert. Ich hänge jetzt mal den original Code und meinen modifizierten an. vielleicht kann man dann mehr sagen. Ich hoffe es macht nichts, dass ich das ganz in ein Zip Archiv packe. Ich hoffe das ist jetzt besser und mir kann jemand helfen. Gruß, Hendi
Hallo Hendi, bin gerade etwas in Eile und schaue nur flüchtig auf die beiden buttons.c: In der Originalversion wird der Status von PIND zu einem Zeitpunkt in der Variablen "buttons" gespeichert und dann weiter verarbeitet. Bei Deiner Version wird PIND bei jeder if-Abfrage neu eingelesen (PIND ist als volatile in den avr-libc-headern definiert) und der Status kann sich bis zum letzten if (immerhin 12 Stück!!!) schon verändert haben. Spiel das mal im Simulator durch. Du solltest deshalb den Wert auch in einer Variablen speichern, auch wenn das hier vielleicht nichts zum Fehler tut. Gruß Lutz
Also da das mit dem if Kram anscheinend nicht so dolle ist habe ich wie im original einfach mal mit case und break weitergemacht. Aber wie muss ich die zuätzlichen Pins noch in die Funktion uint8_t mit einbauen, damit das auch funktioniert?
Hallo Hendi, ohne jetzt wirklich das Programm komplett gelesen zu haben, könntest Du mal folgendes probieren (einfach die Funktion hier mit der Maus markieren, rauskopieren und bei Dir ersetzen). Ist zwar nicht optimal, aber sollte erst mal laufen und Du kannst es dann in aller Ruhe nachvollziehen und dann Stück für Stück verbessern (bleibst also auch erstmal bei der if-Geschichte, da hast Du Dir ja anscheinend schon Gedanken zu gemacht):
1 | uint8_t rc5_get_cmd(rc5_cmd_t *cmd) { |
2 | |
3 | uint8_t pind = PIND; |
4 | uint8_t pinb = PINB; |
5 | *cmd = 0xff; |
6 | |
7 | |
8 | if((pind & _BV(PD0)) == 0) { |
9 | *cmd = RC5_CMD_0; |
10 | return 0; |
11 | |
12 | }
|
13 | else if((pind & _BV(PD1)) == 0) { |
14 | *cmd = RC5_CMD_1; |
15 | return 0; |
16 | }
|
17 | else if((pind & _BV(PD3)) == 0) { |
18 | *cmd = RC5_CMD_2; |
19 | return 0; |
20 | }
|
21 | else if((pind & _BV(PD4)) == 0) { |
22 | *cmd = RC5_CMD_3; |
23 | return 0; |
24 | }
|
25 | else if((pind & _BV(PD5)) == 0) { |
26 | *cmd = RC5_CMD_4; |
27 | return 0; |
28 | }
|
29 | else if((pind & _BV(PD6)) == 0) { |
30 | *cmd = RC5_CMD_5; |
31 | return 0; |
32 | }
|
33 | else if((pinb & _BV(PB0)) == 0) { |
34 | *cmd = RC5_CMD_6; |
35 | return 0; |
36 | }
|
37 | else if((pinb & _BV(PB1)) == 0) { |
38 | *cmd = RC5_CMD_7; |
39 | return 0; |
40 | }
|
41 | else if((pinb & _BV(PB3)) == 0) { |
42 | *cmd = RC5_CMD_8; |
43 | return 0; |
44 | }
|
45 | else if((pinb & _BV(PB4)) == 0) { |
46 | *cmd = RC5_CMD_9; |
47 | return 0; |
48 | }
|
49 | else if((pinb & _BV(PB5)) == 0) { |
50 | *cmd = RC5_CMD_UNKNOWN1; |
51 | return 0; |
52 | }
|
53 | else if((pinb & _BV(PB7)) == 0) { |
54 | *cmd = RC5_CMD_UNKNOWN2; |
55 | return 0; |
56 | }
|
57 | |
58 | return 1; |
59 | }
|
Also ich habe das mal ausprobiert aber es funktioniert leider nicht. Es ist wie bei meinem Code, den ich am Anfang gepostet habe d.h. die IR LED (durch Kamera) und die normale Status LED zeigen keinerlei Regung. Hoffe mir kann jemand mit einer anderen Lösung helfen bzw. den Fehler finden ich finde ihn jedenfalls nicht aber ich habe auch sehr wenig Ahnung von µc Programmiereung.
Sorry, aber weiter kann ich nichts finden, ohne mich wirklich damit zu beschäftigen. Die Funktion rc5_get_cmd () macht in beiden Versionen (Deine als Original gepostete und meine oben veränderte) folgendes: Es wird der Wert/logische Pegel des Ports PIND gelesen und in einer lokalen Variablen gespeichert. Dann wird geprüft, welcher Pin in PIND zum Zeitpunkt des Einlesens Null war. Beim ersten gefundenen Nullwert wird der Variablen cmd ein RC5-Code zugewiesen und die Funktion wird mit return 0 abgeschlossen. Wenn keine Übereinstimmung da war, wird mit return 1 abgeschlossen. Als einzigen Unterschied sehe ich die zugewiesen RC5-Codes (z.B. RC5_CMD_0 statt RC5_CMD_VOLUME_INC), was aber eigentlich egal sein müßte.
Hendi schrieb: > Hat keiner irgendwelche Anregungen? Das Problem ist, daß die Tastenabfrage und Entprellung schonmal völlig vergurkt ist. Da ist leider nix mehr zu löten. Wenn die Entprellung funzt, ist der Rest nur noch Kinderspiel. Ich würde ja zu C raten, da gibts schon fertige Entprellungen. Peter
Peter Dannegger schrieb: > Das Problem ist, daß die Tastenabfrage und Entprellung schonmal völlig > vergurkt ist. Da ist leider nix mehr zu löten. Kann gut sein, aber warum hat es denn vorher funktioniert? > Ich würde ja zu C raten, da gibts schon fertige Entprellungen. Was ist da denn nicht in C?
Bist Du schon weiter gekommen? Doch_Gast schrieb: > Peter Dannegger schrieb: >> Das Problem ist, daß die Tastenabfrage und Entprellung schonmal völlig >> vergurkt ist. Da ist leider nix mehr zu löten. > Kann gut sein, aber warum hat es denn vorher funktioniert? Ich hatte mir nur die buttons.c angeschaut, nachdem Du geschrieben hattest, daß dies die einzige Datei ist, die Du verändert hast und es vorher funktionierte. Die Originalversion um eine zweite switchanweisung zu erweitern macht wohl auch keinen Sinn, da Peter sich anscheinend den Rest angesehen hat und seine Äußerung wenig Zuverlässigkeit des Programms erwarten ließe, selbst wenn es erstmal funktionieren würde. Vielleicht liegt es auch an dieser Implementierung, daß mein Vorschlag nicht funktioniert hat.
Doch_Gast schrieb: > Peter Dannegger schrieb: >> Das Problem ist, daß die Tastenabfrage und Entprellung schonmal völlig >> vergurkt ist. Da ist leider nix mehr zu löten. > Kann gut sein, aber warum hat es denn vorher funktioniert? > >> Ich würde ja zu C raten, da gibts schon fertige Entprellungen. > Was ist da denn nicht in C? Sorry, ich war wohl in Gedanken noch bei nem anderen Thread. Beitrag "Re: RC5 Sender Code, Wo ist der Wurm drin?" Die Tastenerkennung kann man erstmal so machen. Man könnte Code sparen, indem man den Tastenwert als Returnwert übergibt, per Pointer ist doch etwas strange. Für nicht gedrückt dann z.B. 0 oder -1. Die Entprellung und Flankenerkennung erfolgt dann wohl in den anderen Programmteilen. 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.