Forum: Mikrocontroller und Digitale Elektronik USI/RS232 problem bei Tiny25


von Der D. (derdaniel)


Angehängte Dateien:

Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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

von Der D. (derdaniel)


Lesenswert?

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