Hallo Zusammen,
ich hab gerade ein kleines Verständnisproblem was den USART des M128
betrifft. Der M128 ist Fullduplex fähig, hat also getrennte
Datenregister für RX und TX. Ich benötige einen Fullduplex USART, also
hab ich einen Ringbuffer in den ich die empfangenen Daten reinklopfe,
zum auslesen der Daten aus dem Register nehme ich die altbekannte
Funktion:
1 |
|
2 | while (!(UCSR0A & (1<<RXC0))); // wait for data to be received
|
3 |
|
4 | return UDR0; // get and return the recieved data
|
Zum Senden ( bis jetzt noch nicht gepuffert, aber da bin ich gerade dran
) greife ich wieder auf das UDR0 zu:
1 | while (!(UCSR0A & (1<<UDRE0))); // Wait for empty transmit buffer
|
2 |
|
3 | UDR0 = data; // Put data into buffer, send the data
|
Das ganze Funktioniert unabhängig voneinander wunderbar. Jetzt stellt
sich mir die Frage, wenn das ganze nachher Fullduplex läuft, greif ich
ja beim RX und TX auf das selbe Register zu, oder ist der Compiler so
schlau das er weiß welches UDR-Register er ansprechen muss (
WinAVR20100110 )? Ich glaube nicht. Der ganze Geschichte Trau ich so
nicht. Wie kann ich dem Compiler am geschicktesten mitteilen welches UDR
( RX oder TX ) er ansprechen muss?
Und wann wird ein TXC-Interrupt ausgelöst, schon wenn ich ihn das erste
mal via TXCIE acktivieren und das UDR leer ist oder erst nachdem ich das
erste Byte gesendet hab?
Danke schonmal für eure Hilfe.
Grüßle
lightninglord