Frage zu UART
-
Hallo!
Ich habe mal eine Frage zu folgendem Ausschnitt beim Senden eines Zeichens über UART:
// bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z. B. fuer ATmega16: while (!(UCSRA & (1<<UDRE))) //warten bis Senden moeglich { } UDR = 'x'; // schreibt das Zeichen x auf die Schnittstelle
Könnt ihr mir beschreiben, was genau beim While-Kopf passiert?
Wenn UDRE auf 1 ist, dann ist der Sendepuffer leer, bei 0 noch nicht. UDRE ist dabei ein Bit von UCSRA. Allerdings kann ich mich mit der Schreibweise nicht so recht anfreunden... . Bedeutet diese Schreibweise so etwas wie:
"Greife auf den momentanen Wert des Bits UDRE zu, welches zu UCSRA gehört, undiere dieses mit diesem Register insgesamt und schaue nach dem Ergebnis. Ergibt es, dass in dem Register UCSRA das Bit an der Stelle (1<<UDRE) nun 1 ist, dann springe aus der While, andernfalls nicht."
Der Initialwert von UCSRA am Bit 5 (UDRE) ist ja 1... wenn also UDRE noch 0 ist, ergibt eine Undierung eine 0, sobald UDRE auf 1 springt, eine 1 und ich weiß, dass der Sendepuffer leer ist. Was mich hier allerdings noch verwirrt ist das Ausrufezeichen bei der Anweisung...Kann mir jemand das noch mal in seinen Worten erklären?
-
while (!(UCSRA & (1<<UDRE))) /* solange UDRE'tes Bit (0 basiert) in UCSRA nicht gesetzt ist... */
-
Das ! negiert die Aussage.
In C ist 0 Unwahr und alles andere Wahr.
Das ! macht aud Wahr <-> Unwahr und umgekehrt.Das ! kennst du schon von == und !=
(a!=b) ist das gleiche wie !(a==b)Man braucht aber nicht mal den Vergleich, ein Wert reuicht auch aus:
int i; if(i) { ... // i muss ungleich Null sein, damit die Bedingung erfüllt ist} if(!i) { ... // i muss gleich Null sein, damit die Bedingung erfüllt ist}
-
Danke schon einmal für die Antworten!
Wenn ich nun also das umschreibe und sage:
while ((UCSRA & (1<<UDRE)) != 1);
bedeutet das also genau das selbe wie die andere Schreibweise?
-
Nein.
(UCSRA & (1<<UDRE)) ergibt 0 oder 32 (da UDRE == 5)
denn 00000001<<5 = 00100000 = 32while ((UCSRA & (1<<UDRE)) == 0);
if(!i) { ... // i muss gleich Null sein, damit die Bedingung erfüllt ist} if(i==0) { ... // i muss gleich Null sein, damit die Bedingung erfüllt ist}
-
Args, sry, klar!
Das Prob bei mir ist nämlich gerade, dass ich das in Bascom umschreiben möchte - und dafür musste ich erst einmal genau wissen, was das in C bedeutet...
so, wie ich es bis jetzt gedacht hatte, war so:While UCSRA.UDRE <> 1 Wend
Also warten, bis das Bit UDRE in UCSRA auf 1 gesetzt ist ("<>" -> Ungleichoperator in Bascom)... daher auch gerade die 1 XD
In C ist es natürlich so, wie du es sagtest, DirkB... oh Mann, Bascom verdirbt einen XD