Ohhh, ich glaube wir sollten mehr Leerzeichen benutzen! (Oder lieber 2-3 !!!)
Unser "while ( ! (UCSRA & 0x40)) ;"-Code dreht ja nun alles auf den Kopf. Das Bit bleibt also nicht dauerhaft auf 1, sondern auf 0. Denn nur dann kommen wir ja wieder aus dem while herraus, wenn es auf 0 gegangen ist.
Also nochmal für mich:
- TXC-Inhalt ist 1 (hier von mir angenommen)
- Unser Programm schreibt nach UDR
- Unser Programm geht zum "while ()" weiter
- AVR moved UDR in's interne Schieberegister
- AVR sendet aus Schieberegister
- AVR setzt TXC auf 0 wenn alles geschoben ist.
- unser "while ( ! ...) sieht dies und while bricht ab
---> wenn wir uns nicht um das TXC-Bit kümmern:
- TXC-Inhalt ist 0
- Unser Programm schreibt nach UDR
- Unser Programm geht zum "while ()" weiter
- AVR moved UDR in's interne Schieberegister
- AVR sendet aus Schieberegister
- AVR setzt TXC auf 0 wenn alles geschoben ist. <--- Ist es aber noch
- unser "while ( ! ...) sieht dies und while bricht vor dem setzen durch AVR ab. Und damit bevor alle Bits das Schieberegister verlassen haben.
---> Wenn nun direkt zum Empfangen gewechselt wird:
- wir schalten den Sender ab
---> Das letzte zu sendende Zeichen ist verloren.
Da es ja nur in einer Interruptfunktion wieder gecleard (also 1) wird, müssen wir es demnach tatsächlich selber machen, wenn wir weitere Zeichen auf komplette Übertragung des zu sendenden Bytes prüfen wollen.
Wann muss das TXC gecleard werden? Vor dem Beschreiben des UDR oder hinterher (wie bei Arexx-Henk)?
Im Kapitel "USART Initialization" ist zu finden:
--> Sieht so aus, als ob der Code der Asuro-LIB NICHT in Ordnung ist bei SerWrite() in uart.c.The USART has to be initialized before any communication can take place. The initialization
process normally consists of setting the baud rate, setting frame format and
enabling the Transmitter or the Receiver depending on the usage. For interrupt driven
USART operation, the Global Interrupt Flag should be cleared (and interrupts globally
disabled) when doing the initialization.
Before doing a re-initialization with changed baud rate or frame format, be sure that
there are no ongoing transmissions during the period the registers are changed.
The TXC Flag can be used to check that the Transmitter has completed all
transfers, and the RXC Flag can be used to check that there are no unread data in
the receive buffer.
Note that the TXC Flag must be cleared before each transmission
(before UDR is written) if it is used for this purpose
Aber wer hat es richtig gemacht?
stochri mit seiner Funktion UartPutc() aus print.c die von helmut_w mit seinem ersten Eintrag schon gezeigt wurde.
Und wer hat als erster hier auf die Kombination senden/empfangen hingewiesen?
Ein "BRAVO" an m.a.r.v.i.n (kleines bravo an damaltor, der sich auch noch erinnern konnte.)
Also bleibt eigendlich nur noch eine Änderung der Asuro-LIB übrig.
Dann auch gleich die von helmut_w ja eigendlich gewünschten Verbesserungen einbauen und alle sind glücklich
Jubel, ich glaube es nun kapiert zu haben.
Sonst noch Fragen zum TXC? Was ist nun mit den Vorschlägen von helmut_w?
- Stom sparen auf alle Fälle
- for()-Schleife in SerWrite() entsorgen
- TXC-Bit vor dem nutzen des UDR auf 1 setzen
- Neue Funktions-"Gruppierung" á la m.a.r.v.i.n's #define ?
- Von helmut_w vorgeschlagene Funktion, da aber ohne Möglichkeit zum senden eines 0x00-Bytes ?
Bis morgen.
Lesezeichen