mikrocontroller.net

Forum: Compiler & IDEs Erklärung einer C-Zeile.. bin Anfänger


Autor: Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Bitte um Hilfe bei dieser Zeile: (UDRE-Bit abfragen, ob es 1 ist)

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

Sie dürfte das folgende ASM sein:
sbis UCSRA,UDRE

Warum das Ausrufezeichen? Kann mir jemand die Zeile mal verständlich
erklären?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ausrufezeichen ist eine Negierung des folgenden booleschen
Ausdrucks.

Autor: Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
komisch, dann würde ich das so verstehen, dass die while schleife erst
bei einer Null ausgeführt würde. !0=1

Sie sollte aber bei einer 1 ausgeführt werden.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Schleife wird nur bei einer 0 ausgeführt. Sie wird solange
ausgeführt, wie das Bit UDRE in UCSRA 0 ist. Wenn das Bit 1 wird, wird
die Schleife beendet.
Klingt so in etwa wie das, was man üblicherweise will (warten, bis UDRE
1 ist und damit die Schnittstelle bereit ist, wieder Daten anzunehmen).

Autor: Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach alles klar. denkblockade überwunden.
danke!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Zeile macht in der Anwendung nur dann Sinn, wenn hinten ein
Semikolon steht:
while (!(UCSRA & (1<<UDRE)));
Damit wird die (leere) Schleife so lange ausgeführt, wie die Bedingung
in der Klammer wahr ist, also so lange das Bit UDRE im UCSRA nicht
gesetzt ist.

En Détail: Das Ausrufezeichen ist eine logische (boolesche) Negation.
Der dahinter stehende Ausdruck wird also negiert (ist er 0, dann ist
das Eregbnis 1, andernfalls ist es 0). (UCSRA & (1<<UDRE)) ist eine
bitweise UND-Verknüpfung des Registers UCSRA mit einer um UDRE Stellen
nach links verschobenen binären 1 (in 8 Bit also 00000001). UDRE ist
ein in der Headerdatei definiertes Makro, das die Bitnummer im Register
einsetzt. Hab grad net im Kopf, welche Nummer das UDRE hat, aber mal
angenommen, es ist das Bit Nr. 3 im UCSRA, also wird die binäre 1
(00000001) um 3 Stellen nach links verschoben (gibt also 00001000). Das
Ding wird jetzt mit UCSRA verUNDet. Wenn das Bit Nr. 3 im UCSRA gesetzt
ist, ist der Ausdruck (UCSRA & (1<<UDRE)) 1, also logisch wahr. Durch
das "!" wird er negiert, der gesamte Inhalt der Klammer wird also in
dem Fall "0", also logisch falsch, so dass die Schleife abgebrochen
wird, sobald das UDRE-Bit im UCSRA gesetzt ist.

Die Schleife dient dazu, zu warten, bis nach dem Schreiben von Daten in
das UART-Datenregister UDR diese Daten übertragen wurden, also das UDR
leer ist. In dem Fall (also nach abgeschlossener Übertragung) wird das
UDRE gesetzt und die UART zeigt so an, dass sie bereit ist, neue Daten
aufzunehmen. Das Semikolon (alternativ ein paar {}) ist dabei elementar
wichtig, da es eine leere Schleife sein soll.

Hoffe, das war jetzt nicht zu viel Information...

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.