RC5 senden klappt nicht

Gast #1132081
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)
Angehängte Dateien:
#1132164
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.
Gast #1132252
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.
Gast #1132644
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 ;-)
Gast #1132733
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren