Forum: Mikrocontroller und Digitale Elektronik Mega8+Max481 schneiden letztes Zeichen ab


von Tobias (Gast)


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?

von Stefan E. (sternst)


Lesenswert?

Tobias schrieb:
> Und dann wird gewartet, bis auch das Senden des
> leltzten Elements abgeschlossen ist.

Wenn du das Flag nicht löscht, dann funktioniert das natürlich maximal 1 
mal.

von Tobias (Gast)


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...

von Stefan E. (sternst)


Lesenswert?

Tobias schrieb:
> So?

Nein.

Tobias schrieb:
> Das hat leider den gleichen Effekt...

Weil du das Flag gar nicht wirklich löscht.
Lies im Datenblatt nach, wie man das macht.

von Falk B. (falk)


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

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.