Forum: Mikrocontroller und Digitale Elektronik UART UBRR setzen ATMEGA


von Christian (Gast)


Lesenswert?

Hallo zusammen,

ich hab mal wieder ne Frage. Da ich mich gerade mit UART beschäftige, 
habe ich mir das Tutorial "Der UART angesehen. Dabei ist mir ein 
Codeschnipsel aufgefallen den ich nicht kappiere.



1
UBRRH = UBRR_VAL >> 8;
2
  UBRRL = UBRR_VAL & 0xFF;

Wenn ich das richtig verstanden habe und richtig gerechnet habe, müsste 
ein UBRR = 26 rauskommen.

Die erste Zeile dieses Codes verstehe ich überhaupt nicht.
In der zweiten Zeile werden alle Bits auf 1 gesetz, aber warum.

Ich bin noch ein Anfänger in Sachen Mikrocontroller.

von Mike (Gast)


Lesenswert?

Christian schrieb:
> Ich bin noch ein Anfänger in Sachen Mikrocontroller.

Das hat nichts speziell mit Mikrocontroller zu tun, sondern es sind 
grundlegende C Operatoren. Guck dir mal Dinge wie die bitweises UND 
Operation und Rechts-Shift an, z.B. in 
http://de.wikibooks.org/wiki/C-Programmierung:_Ausdr%C3%BCcke_und_Operatoren

> In der zweiten Zeile werden alle Bits auf 1 gesetz, aber warum.
Werden sie nicht. Du darfst UND nicht mit ODER verwechseln.

von Christian (Gast)


Lesenswert?

Danke für die schnelle Antwort.

Da ich C nicht perfekt behersche, habe ich das noch nicht gewusst.
Jetzt schon.

Was die zweite Zeile angeht, hab ich das & übersehen.
Sehe ich das richtig, dass der Wert gleich bleibt und es nur darum geht 
Dieses Register zu beschreiben?

von Christian (Gast)


Lesenswert?

Könnte ich eigentlich auch schreiben
1
UBBR0H = BAUD_Wert >> 8;
2
   UBRR0L = BAUD_Wert;

von Oliver R. (orb)


Lesenswert?

Christian schrieb:
> Sehe ich das richtig, dass der Wert gleich bleibt und es nur darum geht
> Dieses Register zu beschreiben?

Nein, es geht darum die unteren 8Bit von einem 16Bit-Wert zu erhalten.

Christian schrieb:
> Könnte ich eigentlich auch schreiben
> UBBR0H = BAUD_Wert >> 8;
>    UBRR0L = BAUD_Wert;

Nein, zum einen ist UBRR nicht der 'Baud_Wert' sondern 
(Taktfrequenz/(BAUD_Wert*16))-0.5 und zum anderen kommt es auf den 
Compiler an, was passiert wenn Du einem 8Bit-Register UBBR0L einen 
16Bit-Wert zuweist.

von Haro (Gast)


Lesenswert?

Die Aufteilung in High- und Lowregistern ist bei einem aktuellen gcc 
nicht mehr nötig. Es reicht ein einfaches:

UBRR0 = UBRR_VAL;

Beschäftige dich trotzdem mit Bitoperationen wie & und >>, sie sind dein 
täglich Brot.
Mal dir auf einen Zettel, was bei diesen Operationen passiert.

von Peter D. (peda)


Lesenswert?

Haro schrieb:
> Die Aufteilung in High- und Lowregistern ist bei einem aktuellen gcc
> nicht mehr nötig.

Nö, das geht nur bei den AVRs, wo die High-Adresse = Low-Adresse+1 ist.
Also z.B. nicht bei Atmega8, 16, 32, 64, 128.

von Christian (Gast)


Lesenswert?

Mein Compiler hat nichts dagegen, UBRR0 von meinem Atmega88 zu 
beschreiben.

Damit wäre das Thema abgschlossen.

von Peter D. (peda)


Lesenswert?

Christian schrieb:
> meinem Atmega88

Wichtige Informationen sollte man immer am Anfang (am besten im Topic) 
geben.

von Matthias L. (Gast)


Lesenswert?

>Also z.B. nicht bei Atmega8, 16, 32, 64, 128.

Hm.. Dann muss der Compiler das aber wissenn und beachten. Bei mir geht 
das bisher auch aktuell mit einem mega32

von Michael (Gast)


Lesenswert?

Christian schrieb:
> Mein Compiler hat nichts dagegen, UBRR0 von meinem Atmega88 zu
> beschreiben.

Damit verbaust du dir die Möglichkeit, den Code ohne deutlich größere 
Änderungen auf einen Prozessor zu portieren, der seine Register anders 
liegen hat.

von Peter D. (peda)


Lesenswert?

Matthias Lipinsky schrieb:
> Hm.. Dann muss der Compiler das aber wissenn und beachten. Bei mir geht
> das bisher auch aktuell mit einem mega32

Welchen Compiler benutzt Du denn und welche Version?

Der AVR-GCC kennt kein UBRR0 beim ATmega32.

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.