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?