Forum: Mikrocontroller und Digitale Elektronik UART avr HILFE


von dani (Gast)


Lesenswert?

kann jemand mir klären was dies Befehl macht
while (!(USR & (1<<UDRE)))
 ich verstehe es so :  UDRE  wird gesetzt durch :  (1<<UDRE)
wird dann mit USR  undverknüpft also  UDRE =   00010000
                                                          &
                                      USR =    xxxxxxxx
                                              ---------------
                                               0000x0000

 wenn x=1,dann der code ist 00010000 also (! 00010000 )  =
11101111
und wenn x=0; der Code gleich  00000000  also  (! 00000000 )  =
11111111      ist das richtig so ,

wenn ja dann wie soll ich es hier verstehen  * warten bis Senden

  kann mir jemand es interpretieren ? wann while (!(USR & (1<<UDRE)))
wahr ist und wann nicht danke


while (!(USR & (1<<UDRE)))  /* warten bis Senden moeglich
*/
    {
    }

    UDR = 'x';                  /* schreibt das Zeichen x auf die
Schnittstelle */



UDRE (UART Data Register Empty)

Dieses Bit zeigt an, ob der Sendepuffer bereit ist, um ein zu sendendes
Zeichen aufzunehmen. Das Bit wird vom AVR gesetzt (1), wenn der
Sendepuffer leer ist. Es wird gelöscht (0), wenn ein Zeichen im
Sendedatenregister vorhanden ist und noch nicht in das
Sendeschieberegister übernommen wurde. Atmel empfiehlt aus
Kompatibilitätsgründen mit kommenden µC, UDRE auf 0 zu setzen, wenn das
UCSRA Register beschrieben wird.
Das Bit wird automatisch gelöscht, wenn ein Zeichen in das
Sendedatenregister geschrieben wird.

von Johannes M. (johnny-m)


Lesenswert?

dani wrote:
> kann jemand mir klären was dies Befehl macht
> while (!(USR & (1<<UDRE)))
>  ich verstehe es so :  UDRE  wird gesetzt durch :  (1<<UDRE)
> wird dann mit USR  undverknüpft also  UDRE =   00010000
Nein, nicht UDRE ist 00010000, sondern (1 << UDRE).

>  wenn x=1,dann der code ist 00010000 also (! 00010000 )  =
> 11101111
> und wenn x=0; der Code gleich  00000000  also  (! 00000000 )  =
> 11111111      ist das richtig so ,
Nein. "!" ist der logische Negierungsoperator. Der liefert eine 
logische Null (wenn Du es so willst, eine 0b00000000) zurück, wenn der 
Operand ungleich Null ist und eine logische 1 (in diesem Falle 
0b00000001) zurück, wenn der Operand exakt Null ist.

Das, was Du beschreibst, ist der Bitkomplement-Operator "~". Die darfst 
Du nicht verwechseln!

> wenn ja dann wie soll ich es hier verstehen  * warten bis Senden
>
>   kann mir jemand es interpretieren ? wann while (!(USR & (1<<UDRE)))
> wahr ist und wann nicht danke
"!(USR & (1<<UDRE))" ist genau dann wahr, wenn das Bit UDRE im Register 
USR nicht gesetzt ist. Denn dann wird
1
USR & (1<<UDRE)
exakt Null und damit
1
!(USR & (1<<UDRE))
zu einer logischen Eins...

Die Schleife wird immer wieder durchlaufen, solange UDRE nicht gesetzt 
ist. Sobald es gesetzt ist (also der Puffer leer ist), geht es weiter.

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.