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