Gast
#436904
Hallo, kann mir jemand die folgenden Programmzeilen erkären? /* baud rate*/ UBRR0H = (unsigned char) (UBRR>>8); UBRR0L = (unsigned char) UBRR; Danke und Gruß
|
Anzeige
|
Baudrate UART
Gast
#436904
Hallo, kann mir jemand die folgenden Programmzeilen erkären? /* baud rate*/ UBRR0H = (unsigned char) (UBRR>>8); UBRR0L = (unsigned char) UBRR; Danke und Gruß
Gast
#436908
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.
Gast
#436994
">>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.
Gast
#437320
Hat das Register nicht nur 12Bit?
Gast
#437323
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.
Gast
#437770
"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
Gast
#437820
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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|