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?
Das Ausrufezeichen ist eine Negierung des folgenden booleschen Ausdrucks.
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.
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).
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.