Mega8+Max481 schneiden letztes Zeichen ab

Gast #2538522
Lesenswert?

Hi

Ich programmiere gerade einen Bus auf RS-485 Basis mit 19.200 Baud. 
Dabei wird ein Paket übertragen aus einem Startbyte, acht Datenbytes und 
dann einem Stoppbyte. Als Stoppbyte wird "Carriage Return" benutzt. Doch 
Carriage Return kommt nie an.
1
loop_until_bit_is_set (UCSRA, UDRE);
2
UDR=13; //Paketende senden
3
//Nach Abschluss des Sendens (Puffer leer, Puffer gesendet) wieder auf Empfangen umschalten
4
loop_until_bit_is_set (UCSRA, UDRE);
5
loop_until_bit_is_set (UCSRA, TXC);
6
PORTD |= 1<<6;
7
PORTD &= ~(1<<5);

Nach meinem Verständnis müsste - sobald der Puffer frei ist - Carriage 
Return in den Puffer geschrieben werden. Dann wird gewartet, bis der 
Puffer wieder leer ist. Und dann wird gewartet, bis auch das Senden des 
leltzten Elements abgeschlossen ist. Erst wenn das passiert ist, wird 
der "Driver Output" deaktiviert und der "Receiver Input" aktiviert. Doch 
wie gesagt, das CR wird verschluckt. Warte ich vor dem Deaktivieren des 
Driver-Outputs noch ein paar Hundert Mikrosekunden, kommt auch mein CR 
an. 100µs reichen nicht, gut 500 (so lang wie ein Byte zum Senden 
braucht) dagegen schon. Aber wo wird mein letztes Byte (eben das CR) 
verschluckt? Der MAX481 wird wohl kaum ein ganzes Byte puffern, aber im 
Mikrocontroller warte ich doch eigentlich extra, bis alles aus allen 
Puffern raus ist oder nicht? Wo ist mein Denkfehler?
Gast #2538615
Lesenswert?

1
loop_until_bit_is_set (UCSRA, UDRE);
2
UDR=13; //Paketende senden
3
//Nach Abschluss des Sendens (Puffer leer, Puffer gesendet) wieder auf Empfangen umschalten
4
loop_until_bit_is_set (UCSRA, UDRE);
5
UCSRA &= ~(1<<TXC);
6
loop_until_bit_is_set (UCSRA, TXC);
7
PORTD |= 1<<6;
8
PORTD &= ~(1<<5);

So? Das hat leider den gleichen Effekt...
#2538626
Lesenswert?

@  Tobias (Gast)

>UCSRA &= ~(1<<TXC);
>loop_until_bit_is_set (UCSRA, TXC);

So nicht. RTFM. Das Bit wird gelöscht, indem man eine '1' reinschreibt. 
Klingt komisch, ist aber so.

"The TXC Flag bit is automatically cleared when a transmit complete 
interrupt is executed, or it can be cleared by writing a one to its bit 
location."

MfG
Falk

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