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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.