Mega128 Fullduplex Verständnisproblem

Gast #1811103
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
#1811108
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).
Gast #1811113
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
Gast #1811131
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
Gast #1811159
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?
Gast #1811172
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.