mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega128 Fullduplex Verständnisproblem


Autor: lightninglord (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
   
while (!(UCSR0A & (1<<RXC0)));      // wait for data to be received

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:
while (!(UCSR0A & (1<<UDRE0)));      // Wait for empty transmit buffer

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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: lightninglord (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: lightninglord (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andi ... (xaos)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.