Forum: Mikrocontroller und Digitale Elektronik RC5 Sender Code, Wo ist der Wurm drin?


von Hendi (Gast)


Angehängte Dateien:

Lesenswert?

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
von Hendi (Gast)


Lesenswert?

Weiß wirklich niemand was?
wäre ziemlich schade...

von Lutz (Gast)


Lesenswert?

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.

von Hendi (Gast)


Angehängte Dateien:

Lesenswert?

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

von Lutz (Gast)


Lesenswert?

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

von Hendi (Gast)


Lesenswert?

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?

von Hendi (Gast)


Angehängte Dateien:

Lesenswert?

Ach Anhabng ma wieder vergessen sry

von Lutz (Gast)


Lesenswert?

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
  }

von Hendi (Gast)


Lesenswert?

Danke! Ich werds probieren.
GRuß, Hendi

von Hendi (Gast)


Lesenswert?

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.

von Hendi (Gast)


Lesenswert?

Hat keiner irgendwelche Anregungen?

von Lutz (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Doch_Gast (Gast)


Lesenswert?

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?

von Lutz (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.