Forum: Mikrocontroller und Digitale Elektronik Mega128 Fullduplex Verständnisproblem


von lightninglord (Gast)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

Das UDR, in das geschrieben wird, ist ein anderes als das, aus dem 
gelesen wird.  Sie liegen nur auf derselben Adresse.  Da brauchst Du 
nichts mitzuteilen, das weiß der AVR schon von alleine (siehe 
Blockschaltbild in der UART-Beschreibung).

von spess53 (Gast)


Lesenswert?

Hi

>zum auslesen der Daten aus dem Register nehme ich die altbekannte
>Funktion:

>while (!(UCSR0A & (1<<RXC0)));      // wait for data to be received

>return UDR0;              // get and return the recieved data

Und warum nicht den RXC-Interrupt. Da brauchst du auf nichts warten.

MfG Spess

von lightninglord (Gast)


Lesenswert?

Den RXC-ISR hab ich drin, dachte es ist vlt sinnvoll das Bit nochmal 
abzufragen, damit ich dem wirklich nicht zwischen die Beine greif.

von spess53 (Gast)


Lesenswert?

Hi

>Den RXC-ISR hab ich drin, dachte es ist vlt sinnvoll das Bit nochmal
>abzufragen, damit ich dem wirklich nicht zwischen die Beine greif.

Unnötig.

MfG Spess

von lightninglord (Gast)


Lesenswert?

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?

von TestX .. (xaos)


Lesenswert?

lightninglord schrieb:
> 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?

nimm dir doch einfach mal das datenblatt zur hand und lies nach..
-sobald das ding gesendet ist

von spess53 (Gast)


Lesenswert?

Hi

>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?

Der TXC-Interrupt wird ausgelöst, wenn ein Byte gesendet wurde. Da aber 
das TX-UDR gepuffert ist, heißt das nicht zwangsläufig das UDR komplett 
leer ist.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.