Forum: Mikrocontroller und Digitale Elektronik Atmega88 Usart Baudrate - Warum 8Bit nach rechts?


von Martin R. (martin84)


Angehängte Dateien:

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

von g457 (Gast)


Lesenswert?

> [..] das UBRR0L für das Low-Byte bzw. die 8 least significant bits. [..]
                          ^^^^^^^^          ^                   ^^^^
> Warum werden nun immer 8 Bit nach rechts geschoben???
                         ^^^^^

Du hast Dir die Frage schon selbst beantwortet.

Im übrigen kann man auch auch das ganze ubrr direkt an UBRR0 zuweisen, 
das spart das rumgeschiebe.

HTH

von Coder (Gast)


Lesenswert?

UBRR0 ist ein 16 Bit Register, das aufgeteilt ist in zwei 8-Bit Register 
UBRR0H und UBBR0L.Korrekt.

Was für Datentyp ist wohl ubbr und wie steht es da drin? Ein 12bit 
Datentyp habe ich noch nicht gesehen.

von Cyclon (Gast)


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

von Martin R. (martin84)


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 :-)

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
Noch kein Account? Hier anmelden.