www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation (und Verknüpfung)


Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!
kann mir jemand mal sagen, was hier eigentlich passiert:

while(!(UCSRA & (1<<UDRE)));

Es geht hier darum, mit dem USART zu senden. Mir ist schon klar, wozu 
diese Programmzeile da steht, nämlich um zu warten bis der Sendepuffer 
wieder leer und bereit zum Senden ist! Was ich aber nicht verstehe ist 
die Bitmanipulation! Ich verstehe zwar sehr wohl was beispielsweise 
PORTB&=~0xFF; macht! Hier wird PORTB verändert(gelöscht)!

Worauf wartet man jetzt aber oben (bittechnisch gesehen) bis was genau 
"true" ist? UCSRA ist ja ein ganzes Register, wie kann man da jetzt 
beurteilen ob da was true ist oder nicht?
Ist diese Operation einfach nur auf das UDRE Register bezogen?
Vielen Dank!

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> while(!(UCSRA & (1<<UDRE)));
Kurzfassung:
 "Mache nichts                  ('leere Schleife'),
 solange                        ('while')
 nicht                          ('!')
 ein bestimmtes Bit             (das mit der Nummer UDRE)
 in einem bestimmten Register   ('UCSRA')
 gesetzt ist"

> UCSRA ist ja ein ganzes Register, wie kann man da jetzt
> beurteilen ob da was true ist oder nicht?
alles was !=0 ist logisch wahr, 0, 0.0, "" sind falsch ("0" ist wahr, 
weil die Länge des Strings !=0 ist ;) )

hth. Jörg

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

Bewertung
0 lesenswert
nicht lesenswert
UDRE ist der Name eines Bits (genauer gesagt: eines Flags) im UCSRA. 
UDRE wird von der Hardware automatisch gesetzt, wenn der Sendepuffer 
leer ist, also wenn ein neues Zeichen in den Puffer (UDR) geschrieben 
werden kann. In der Device-Headerdatei des verwendeten Controllers steht 
irgendwo eine Definition dieses Namens, der ihm eine Nummer zuweist, und 
zwar die Nummer, die das Bit im Register hat. Das sieht so aus:
#define UDRE 5
Das #define sorgt dafür, dass an allen Stellen im Code, an denen "UDRE" 
auftaucht, dieser Name durch die Zahl "5" ersetzt wird.

In der Schleifenbedingung steht jetzt der ominöse Ausdruck
1 << UDRE
Da der Präprozessor das "UDRE" durch eine "5" ersetzt, steht da
1 << 5
Das wiederum bedeutet, dass eine binäre "1" (0b00000001) um 5 Stellen 
nach links geschoben wird. 1 << 5 entspricht also der Binärzahl 
0b00100000. Mit dieser Binärzahl, die in diesem Zusammenhang auch als 
"Maske" bezeichnet wird, wird jetzt das UCSRA bitweise UND-verknüpft. 
Das führt dazu, dass alle Bits bis auf das mit der Nummer 5 (nämlich das 
UDRE) "ausgeblendet" werden. Ist das Bit gesetzt, dann liefert der 
Ausdruck "(UCSRA & (1<<UDRE))" ein 0b00100000 zurück, andernfalls eine 0 
(0b00000000). Dieser Ausdruck wird jetzt noch logisch negiert. Das 
wiederum bedeutet, dass aus allem, was ungleich 0 ist eine 0 wird, und 
aus 0 eine 1. Ist das Bit "UDRE" also gesetzt, dann steht nach 
Auswertung des Ausdrucks "!(UCSRA & (1<<UDRE))" effektiv eine 0 in der 
Klammer, was dazu führt, dass die Schleife verlassen wird. Ist das Bit 
UDRE nicht gesetzt, steht da eine 1 ("wahr") und die Schleife wird 
weiterhin durchlaufen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ john (Gast)

>"true" ist? UCSRA ist ja ein ganzes Register, wie kann man da jetzt
>beurteilen ob da was true ist oder nicht?

Wird ja gar nicht. Das Register UCSRA wird mit einer Bitmaske verknüpft, 
welche durch die Schiebeopreation (1<<UDRE) erzeugt wird.

(1<<UDRE) ergibt 0x20, (eine 1 um 5 Stellen nach links geschoben)

Das Register UCSRA wird mit 0x20 UND verknüpft, was bewirkt dass alle 
Bits ausser UDRE auf Null gesetzt werden, UDRE bleibt wie es ist.

Dieses Ergebniss wird nun mit Null verglichen

Ergebis==Null -> False, While Schleife wird noch eimal durchlaufen
Ergebis!=Null -> True, While Schleife wird abgebrochen

>Ist diese Operation einfach nur auf das UDRE Register bezogen?

Auf das Bit UDRE im Register UCSRA.

MFG
Falk

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey vielen dank für die kompetente antwort! so was ist einfach super! 
danke!

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.