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)
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.
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.
>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!?
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 ;-)
>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 :-)
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 | }
|
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 ;)
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.