Atmega88 Usart Baudrate - Warum 8Bit nach rechts?

#2331276
Lesenswert?

Hallo,

ich habe schon im ganzen Forum vergeblich nach einer simplen Antwort auf 
meine Frage gesucht.

Hoffe ihr könnt mir auf diesem Wege weiterhelfen.
1
/*Set baud rate */
2
UBRR0H = (unsigned char)(ubrr>>8);
3
UBRR0L = (unsigned char)ubrr;

Wenn ich das richtig verstanden habe, dann ist das UBRR0-Register ein 
16-Bit-Register, das in zwei 8-Bit-Register geteilt ist. Zum Einen das 
UBRR0H für das High-Byte bzw. die 4 Most significant bits und zum 
Anderen das UBRR0L für das Low-Byte bzw. die 8 least significant bits.

Es werden also nur 12 von den 16Bit für den Taktteilungswert, um auf die 
gewünschte Baudrate zu kommen, benötigt.

Warum werden nun immer 8 Bit nach rechts geschoben???
Nach meiner Logik, die sicherlich falsch ist, komme ich drauf, dass ich 
das High-Byte doch nur um 4 Bits nach rechts schieben muss. Dann fallen 
doch die unteren 4 Bit des High-Bytes raus und die vier höchstwertigen 
stehen ganz rechts. Die freigewordenen, vier Stellen werden dann 
automatisch mit Nullen aufgefüllt und gut ist.

Könnt ihr mir bitte bei meinem Denkfehler auf die Sprünge helfen??

MfG

Martin
Angehängte Dateien:
Gast #2331291
Lesenswert?

>Dann fallen doch die unteren 4 Bit des High-Bytes raus und die vier
>höchstwertigen stehen ganz rechts.
Nein, es fallen die 4 unteren Bits des Low-Bytes raus.
Am einfachsten kann man sich das an einem Beispiel verdeutlichen:
Anmerkung: Wenn eine Variable gößer als das Register ist, wird nur das 
untere Byte in das Register geschrieben.

Angenommen ubrr ist eine 16-Bit Variable mit dem Wert 1893.
Dann steht in ubrr binär gesehen
0000 0111 - 0110 0101

Du möchtest nun die unteren 4-Bit des High-Bytes (also 0111) ins UBRR0H 
Register schreiben.
Schiebst du um 4-Bit nach rechts, erhälst du
0000 0000 - 0111 0110
was irgendwie nicht den erwarteten Wert entsrpicht.
Deshalb schiebt man um 8-Bit um somit das komplette obere Byte anstelle 
des unteren zu haben.
0000 0000 - 0000 0111
#2331309
Lesenswert?

Hm ok ich glaub jetzt hab ichs geschnallt...

Danke, danke, danke für die klasse Erklärungen!!! :-)

Hier noch mal kurz aus meiner Sicht:

also  aus dem 16-Bit-Register kann ich,da es ein 8-Bit-Atmega ist, nur 
die ersten 8 Bits verwenden. Deshalb kann ich den Wert im Low-Byte 
sofort verwenden und ins UBRR0L schreiben.
Will ich den Wert aus dem High-Byte, muss ich sozusagen, das Low-Byte 
erst, mit dem High-Byte,von seinem Platz "kicken". Damit ich das 
High-Byte verwenden kann und ins UBRR0H schreiben kann.

Vielen Dank nochmal für eure Antworten :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren