Hallo, kann mir jemand die folgenden Programmzeilen erkären? /* baud rate*/ UBRR0H = (unsigned char) (UBRR>>8); UBRR0L = (unsigned char) UBRR; Danke und Gruß
In das (wahrscheinlich) 8-bit-Register UBRR0H wird das obere Byte vom
(wahrscheinlich) 16-bit-Register UBRR geladen. In das Register UBRR0L
die andere Hälfte.
>>8 verschiebt um 8 bits nach links und (unsigned char) läßt nur die unteren 8 bit
übrig.
">>8" verschiebt um 8 bits nach links und (unsigned char) läßt nur die unteren 8 bit übrig. Nö, es verschiebt nach rechts... Sonst stimmt es aber.
Das sind zwei 8-Bit-Register (UBRR0H und UBRR0L), macht zusammen 16 Bit. Dass von den 16 Bit nur 12 verwendet werden, ist in dem Falle Wurscht, da die 4 MSB von UBRR0H nicht anderweitig belegt sind und eh mit Nullen beschrieben werden. Der Wert von UBRR muss dazu natürlich im gültigen Bereich liegen.
"die 4 MSB von UBRR0H nicht anderweitig belegt" Das stimmt nicht unbedingt. Siehe: http://www.atmel.com/dyn/resources/prod_documents/doc2502.pdf Seiten 163/167/169. CU
Im Prinzip richtig, bei einigen AVRs (Mega16/8515/8535) teilen sich das UBRRH und UCSRC dieselbe I/O-Adresse. Trotzdem muss das MSB beim Zugriff auf UBRRH 0 geschrieben werden, so dass sich am Prinzip nichts ändert (also 4 MSB 0). Da im ursprünglichen Posting aber von UBRR0H und UBRR0L die Rede ist, handelt es sich offensichtlich um einen AVR mit zwei UARTs. Und bei denen trifft die Doppelbelegung nicht zu.
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.