Hallo zusammen
genau so wie Arexx-Henk in seinem Beitrag schreibt, sollte man es machen.
Leider würde es nicht ausreichen nur auf das UDRE-Bit zu schauen, da das Senden im URART 2-Stufig erfolgt.
1 UDR füllen vom Programm
2 AVR kopiert UDR in internes Schieberegister --> UDR ist wieder leer
3 UDR füllen vom Programm
4 AVR kopiert NICHT
5 AVR baut Transport-Frame um interne Schieberegisterdaten
6 AVR sendet Frame
7 Und weiter bei 2
Wenn also 2 Byte zu senden sind, dann kann man die im Grunde direkt hintereinander in das UDR-Register schreiben. (Natürlich sollte man das nicht so machen)
ABER, das UDR-Register ist immer viel schneller leer als man so denkt.
Genau dies hatte Arexx-Henk beschrieben.
Hier noch der Code (als Ausschnitt) von ihm:
Aber eigendlich ist bis auf das zurücksetzen des TXC-Bits (auf 1 setzen=reset) schon alles in der LIB. Und trotzdem kommt die for()-Schleife noch hinterher.Code:// warte bis UDR und Schieberegister leer sind while ( ! ( UCSRA | (1<<TXC))) ; // reset handmassig den TXC bit durch schreiben einen '1' ! UCSRA |= (1<<TXC);
In der LIB wird das "while ( ! ( UCSRA | (1<<TXC)))" nur mit 0x40 anstatt TXC abgefragt.
Was also ist mit der for()-Schleife?
Wegen der Bits im USART-Register hier mal eine Zusammenfassung:
Bit 7: RXC: USART Receive Complete
Bit 6: TXC: USART Transmit Complete
Bit 5: UDRE: USART Data Register Empty
Bit 4: FE: Frame Error
Bit 3: DOR: Data Overrun
Bit 2: PE: Parity Error
Bit 1: U2X: Double the USART transmition speed
Bit 0: MPCM: Multi-Processor Communication Mode
Zu Bit 6: TXC steht folgendes auf Seite 151:
This Flag ist set when the entire Frame in the Transmit Shift Register has been shifted out and there are no new data ... in the .. UDR. The TXC-Bit is automaticlly cleared when a transmit complete interrupt is executed, or it can be cleared by writing a one to the bit.
Somit scheint also tatsächlich nur das von Arexx-Henk angegebene clear-Bit (setzen auf 1) zu fehlen, so dass die Abfrage mit dem "while ( ! ( UCSRA | (1<<TXC)))" überhaupt erst funktionieren kann im nächsten Durchlauf.
Man sollte somit überlegen, ob man diese Abfrage nicht in die SerWRITE-Funktion verlegt VOR dem Umschalten auf Sendebetrieb.
Lesezeichen