Forum: Mikrocontroller und Digitale Elektronik UCSRnC = (1<<USBS)|(3<<UCSZ0);


von Großes F. (112)


Lesenswert?

Hallo Forum,

die Zeile:

UCSR0C = (1<<USBS0)|(3<<UCSZ00);

bedeutet doch folgendes:
(1<<USBS) // es werden zwei Stop-Bits verwendet

(3<<UCSZ00) // sollte identisch sein mit ((1<<UCSZ00) | (1<<UCSZ10)), um 
8 Bits zu senden

Wenn man nun (3<<UCSZ0) schreibt, setzt das Programm dann automatisch 
beginnend bei UCSZ00 eine 1 und bei dem nächstfolgenden Bit des 
Registers UCSR0C (hier laut Datenblatt UCSZ01) ebenfalls eine 1. oder 
ist dies nur eine kurzschreibweise für die Anleitung des Datenblattes?

Im konkreten Fall besitzt das Register UCSR0C folgenden Aufbau:
UMSEL01 UMSEL00 UPM01 UPM00 USBS0 UCSZ01 UCSZ00 UCPOL0

möchte ich also USB00, UCSZ01 und UCSZ00 auf 1 setzen, könnte ich dann 
auch einfach schreiben:

UCSR0C=(5<<UCSZ0)

???
mfg

von Jean P. (fubu1000)


Lesenswert?

Großes Fragezeichen schrieb:
> möchte ich also USB00, UCSZ01 und UCSZ00 auf 1 setzen, könnte ich dann
> auch einfach schreiben:
>
> UCSR0C=(5<<UCSZ0)

Nein, dann musst du UCSR0C |= (7<<UCSZ0) scchreiben !

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Großes Fragezeichen schrieb:

> Wenn man nun (3<<UCSZ0) schreibt, setzt das Programm dann automatisch
> beginnend bei UCSZ00 eine 1 und bei dem nächstfolgenden Bit des
> Registers UCSR0C (hier laut Datenblatt UCSZ01) ebenfalls eine 1.

Im Grunde ja.
Wenn du dir auf Binärebene überlegst, was

     3 << UCSZ0

eigentlich macht, ist auch klar warum.

von Großes F. (112)


Lesenswert?

...also irgendwie stehen eure beiden Antworten leicht im Gegensatz 
zueinander.

Die UCSR0C |= (7<<UCSZ0) wäre nötig, weil das Bit 0 nicht UCSZ0 ist, 
sondern UCPOL0, richtig?

Dann verstehe ich aber nicht, warum das Codebeispiel des Datenblattes 
das Beipiel mit (3<<UCSZ00) verwendet, weil dort gilt der selbe 
Registeraufbau, auch dort beginnt das Register mit UCPOL0 als 0-tem 
Bit...

von Justus S. (jussa)


Lesenswert?

Großes Fragezeichen schrieb:
> Die UCSR0C |= (7<<UCSZ0) wäre nötig, weil das Bit 0 nicht UCSZ0 ist,
> sondern UCPOL0, richtig?

nö weil binär 111 nunmal im dezimalen 7 ist und nicht 5...

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.