Hallo, ich habe ein Problem bei einem aktuellen Projekt. Wenn es fertig ist soll es ein empfänger für eine NEC Protokoll FB sein. Um die Codes, laufzeit usw. der FB herauszufinden vesuche ich den Tiny25 so zu programmiert, dass er mir die Zeiten zwischen einem Flankenwechsel am PB0 (hier hängt der TSOP34838 drann) sendet. Ansonsten ist PB1 mit dem TX auf dem STK500 verbunden, PB3 mit XT1 (8MHZ crystal), PB5 mit RST. Der Rest ist nicht verbunden. Der Code ist im Anhang Wenn ich nun was auf der FB drück sendet er grundsätzlich die richtigen Daten (140=9ms; 70=4,5ms; 35=2,25ms; 26=1,6875ms; 8=562,5µs). Bsp: 110 000 141 000 069 009 009 009 008 010 008 010 008 009 008 010 008 009 008 010 008 009 026 010 025 010 026 009 026 010 025 010 025 010 025 010 026 009 026 009 008 010 008 010 008 009 026 010 008 009 008 010 008 009 008 010 026 009 026 009 026 009 008 010 026 009 026 010 025 010 000 Die 110 am anfang fällt weg da es ein zufallswert ist. 141 ist das Sync Signal. 69 das Datensignal. Dann eben die Daten. Was mich nun stört sind die kursiven 000 die immer kommen wenn länger kein Flankenwechsel stattgefunden hat. Sie kommen nicht aus der PC Interrupt Routine, ich habe die einfach schonmal einen fortlaufenden wert schreiben lassen bei jedem aufruf und nach den 000 ging der Wert normal weiter (... 005 000 006 ...). Aber woher kommen die Nuller??? Ich bin echt ratlos und einen Fehler im Code finde ich jetzt seit 2 Tagen suche nicht. Bitte helft mir, ich verzweifle!
Du hast in Main und Interrupt 16Bit Zugriffe auf X, dann muß der gesamte Zugriff im Main atomar gekapselt werden. Die USI-UART sieht ja höllisch kompliziert aus. Da ist es viel einfacher und übersichtlicher, das Senden als Schleife zu machen:
1 | void sputchar( uint8_t c ) |
2 | {
|
3 | c = ~c; |
4 | STX_PORT &= ~(1<<STX_BIT); // start bit |
5 | for( uint8_t i = 10; i; i-- ){ // 10 bits |
6 | _delay_us( 1e6 / BAUD ); // bit duration |
7 | if( c & 1 ) |
8 | STX_PORT &= ~(1<<STX_BIT); // data bit 0 |
9 | else
|
10 | STX_PORT |= 1<<STX_BIT; // data bit 1 or stop bit |
11 | c >>= 1; |
12 | }
|
13 | }
|
Man sollte immer die Quarzfrequenz und die Baudrate als Wert im Quelltext stehen haben, damit man später noch durchsieht. Der AVR-Assembler kann integer Konstanten selber ausrechnen. Daher einfach die Formel hinschreiben, statt magischer Werte. Peter
Alles gute Einwände, nur helfen die mir nicht wirklich weiter. Nicht böse gemeint, aber es ist ein OneShot zum herausfinden was der TSOP macht, danach fliegen 90% wieder raus. USI und RS232 sind keine freunde, das is klar, nur wollt ich einfach sehen wie es geht (Appnote -> Code). Was für mich wichtig ist, ist eben die Erkentnis obs USI Probleme sind, oder Probs im erkennen der Flanken. Wenns usi ist is mir das Bums, bei den Flanken wirds dann schon schwieriger. Keiner mehr ne Idee wo der Fehler noch liegen könnte?
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.