www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Avr operatoren 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: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Erklärung ist nicht so unfalsch, wenn auch etwas konfus 
geschrieben.

Das man mittels 1 << UDRE sich eine Bitmaske erzeugt, die genau an der 
Stelle UDRE eine 1 und ansonsten lauter 0-en enthält hast du richtig 
verstanden.
Auch dass diese Maske zusammen mit dem & als Filter benutzt wird um aus 
dem USR Register dieses eine Bit herauszufischen und alle anderen 
definiert auf 0 zu setzen, hast du richtig erkannt

Was du nicht richtig erkannt hast, ist das !
Das ist kein binärer Operator, sondern ein logischer. Aus logisch FALSCH 
wird logisch WAHR und umgekehrt.

Umgangssprachlich bedeutet also
   while (!(USR & (1<<UDRE)))

"wiederhole solange, solange es nicht wahr ist, dass Bit UDRE in USR 
gesetzt ist"

Oder etwas weniger geschwollen:

"solange UDRE in USR nicht gesetzt ist, wiederhole ..."

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.