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