www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART avr HILFE


Autor: dani (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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
USR & (1<<UDRE)
exakt Null und damit
!(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.

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.