Forum: Compiler & IDEs RC5 senden klappt nicht


von RC5 (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe einmal ein ganz simples Programm zum Senden von RC5 Codes 
geschrieben. Simpel deswegen, da ich feste delays genommen hab und nicht 
den Timer.
Zum Test hab ich über Girder+Igor Plugin mir den Code meiner 
Fernbedienung anzeigen lassen und sende den nun zyklisch. Wenn ich alles 
mit dem besagten Girder mir am PC anschaue, was für einen Code gesendet 
wurde, dann scheint es zu klappen. Problem ist eben nur, dass der 
Fernseher nicht zuckt ;)
Hab mir den Code auch schon mit meinem RC5 decoder angeschaut, der 
sollte also richtig sein. Sieht evtl. jemand einen großen Bug?

thx für eventuelle Hilfe
(ach so, atmega32, 16mhz, -Os)

von Timmo H. (masterfx)


Lesenswert?

Vielleicht bist du einfach zu ungenau:

delay_us(14);   // 889/32/2=13,89

Warum schreibst du dann auch nicht 13.89? delay_us ist doch eh double. 
Wie siehts ansonsten mit deiner Frequenz aus? Interner RC ist ungenau, 
vielleicht zu ungenau für dein TV

EDIT:
Ah ok, 16 MHz ist also extern. Wie gesagt mach mal ruhig exakte double 
Werte. Versuch auch mal -O2 und nicht -Os. Mit O2 erziele ich bessere 
Ergebnisse.

von RC5 (Gast)


Lesenswert?

OK, nachdem ich die delays geändert und den Vorwiderstand verkleinert 
hab - funktionierts.

Problem hab ich jetzt mit dem toggle bit, es ist ständig 1 (lediglich 
die LED an PD6 blinkt)
1
  if (rc5_senden.toggle==1) {
2
      rc5_senden.toggle = 0;
3
      DDRD = (1 << PD5);
4
      PORTD^=(1<<PD5);    
5
  }
6
  else {rc5_senden.toggle = 1;
7
        DDRD = (1 << PD6);
8
        PORTD^=(1<<PD6);     
9
  }

scheint irgend ein dummer Denkfehler zu sein. Hab auch schon
1
rc5_senden.toggle^=rc5_senden.toggle;
 versucht.

von Timmo H. (masterfx)


Lesenswert?

>Problem hab ich jetzt mit dem toggle bit, es ist ständig 1 (lediglich
>die LED an PD6 blinkt)
Wenn toggle immer 1 wäre würdest du immer PD5 togglen. Du sagst aber 
dass PD6 toggelt, bloß dann kann toggle ja nicht immer 1 sein!?

von P. S. (Gast)


Lesenswert?

RC5 wrote:

>
1
>   if (rc5_senden.toggle==1) {
2
>       rc5_senden.toggle = 0;
3
>       DDRD = (1 << PD5);
4
>       PORTD^=(1<<PD5);
5
>   }
6
>   else {rc5_senden.toggle = 1;
7
>         DDRD = (1 << PD6);
8
>         PORTD^=(1<<PD6);
9
>   }
10
>

Du willst bestimmt nicht jedesmal das DDR komplett mit setzen. Kein 
Wunder, siehst du nur eine LED blinken ;-)

von Timmo H. (masterfx)


Lesenswert?

>Du willst bestimmt nicht jedesmal das DDR komplett mit setzen. Kein
>Wunder, siehst du nur eine LED blinken ;-)
Hab ich doch auch glatt übersehen, eigentlich denkt man ja "sowas kann 
man doch gar nicht falsch machen". Weit gefehlt :-)

von RC5 (Gast)


Lesenswert?

Das mit den LEDs war natürlich nur schnell so reingeschrieben.sry!!!
Und ja, es blinkt die ganze Zeit die LED an PD6 also ist toggle ständig 
0.
Es soll ja auch nur immer eine LED blinken, aber ebend im Wechsel 
(blinken ist nur zu Testzwecken eingebaut).
1
int main(void){
2
RC5_INIT_PORT();
3
rc5_senden.toggle = 0;
4
DDRD |= (1 << PD6)|(1 << PD5);
5
while(1) 
6
{  
7
  rc5_senden.unused = 0;
8
  rc5_senden.start = 3;
9
  if (rc5_senden.toggle!=0) {
10
      rc5_senden.toggle = 0;
11
      PORTD^=(1<<PD5);    
12
  }
13
  else {
14
      rc5_senden.toggle = 1;
15
      PORTD^=(1<<PD6);     
16
  }
17
  rc5_senden.address = 0;
18
  rc5_senden.command = 32;
19
  rc5_send(&rc5_senden);
20
  wait(2000);
21
  
22
}
23
return 0;
24
}

von RC5 (Gast)


Lesenswert?

ok, Fehler sebst gefunden. durch das durchshiften der 14 bits steht nach 
dem senden doch immer 0x0000 in der struct, also muss toggle ja immer 0 
sein ;)

von RC5 (Gast)


Angehängte Dateien:

Lesenswert?

falls jemand die Lösung interessiert.

für Kritik bin ich immer offen ;)

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.