USART ATmega2561

OP #4862352
Lesenswert?

Hallo zusammen,

ich habe eine Verständnisfrage zu folgendem Code:

 UCSR0C = (3<<UCSZ00);

aus der Beispiel-Funktion zu USART von Atmel zum ATmega2561.

void USART_init(void){
 
 UBRR0H = (uint8_t)(BAUD_PRESCALLER>>8);
 UBRR0L = (uint8_t)(BAUD_PRESCALLER);
 UCSR0B = (1<<RXEN0)|(1<<TXEN0);
 UCSR0C = (3<<UCSZ00);
}

Wie kommt man auf die 3? Ich dachte man setzt immer nur die 1 oder die 
0?

Vielen Dank für die Hilfe.

Grüße

datatom
Gast #4862361
Lesenswert?

Thomas H. schrieb:
> Wie kommt man auf die 3? Ich dachte man setzt immer nur die 1 oder die
> 0?

warum soll man eine 3 nicht schieben? Man kann jede zahl shiften

42 << 1 = 84;

nur bei 1 wird es bei einem Atmel als spezielle Atomare Bitoperation auf 
ein Register umgesetzt, wenn mehr als 1 bit gesetzt ist klappt das nicht 
mehr.
Gast #4862403
Lesenswert?

Karl M. schrieb:
> Hallo,
>
> vielleicht sollte man noch mitteilen dass (n<<1) = n*2¹ entspricht.

Vielleicht sollte man das.

Vielleicht sollte man das aber auch in einem C Buch gelesen haben, 
bevor man damit umgeht; spätestens aber bevor man danach fragt.


Es ist nun nicht wirklich schlimm, sowas zu fragen, aber es grenzt doch 
sehr ans Lächerliche.
Gast #4862494
Lesenswert?

Hallo,

man schaue ins Datenblatt

# 
http://www.atmel.com/Images/Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf

Abschnitt *22.10.4* UCSR0C – USART Control and Status Register 0 C
1
UCSR0C = (3<<UCSZ00);
die 3 dezimal entspricht 11 binär UCSZ00 ist die Bitposition hier =1
Aus (3<<UCSZ00) = (0b11<<UCSZ00) wird 0b110 und das passt wunderbar in 
das Muster von UCSR0C – USART Control and Status Register 0 C !

*Table 22-7.* UCSZ0 Bits Settings
UCSZ0[2:0] = 011 entspricht Character Size 8-bit


Thomas H. schrieb:
> Nach dem wir jetzt alle sehr herzlich gelacht haben, wäre ich
> dankbar,
> wenn mir jemand erklärt, wie die 3 zustande kommt.
OP #4862585
Lesenswert?

Danke für die Antworten.

Karl M. schrieb:
> *Table 22-7.* UCSZ0 Bits Settings
> UCSZ0[2:0] = 011 entspricht Character Size 8-bit

Wenn ich in das Datenblatt schaue, steht das Bit UCSZ00 und UCSZ01 an 
der zweiten und dritten Bitposition des Registers UCSR0C. UCPOL0 steht 
an erster Bitposition. Bei 8-Bit ist das Register folgendermaßen belegt: 
00000110
Das wäre der Wert 6.

Aber wahrscheinlich ist es so, dass der Wert ab dem angegebenen Bit 
zählt. Also 11 ab UCSZ00. Damit gilt die eine 1 automatisch für das Bit 
UCSC01. Oder irre ich mich?
Gast #4862607
Lesenswert?

Das erste und wichtigste im Leben allgemein und in der Technik im 
Besonderen ist aufmerksames Beobachten. Sonst kann man keine 
Erkenntnisse gewinnen.

Den ersten Schritt, überhaupt mal etwas anzuschauen hast Du jetzt 
gemacht. Schön.

Jetzt guckst Du Dir mal auf Seite 221, die oberste Tabelle an. Was steht 
da ganz links als Zeilenbeschriftung? Richtig. Da steht: "Bit". Und was 
steht da recht daneben? Wieder richtig. Die Ziffern 7 bis 0 in von links 
nach rechts absteigender Folge. Welche Nummer hat USCPOL? Nochmal 
richtig. Es hat die Nummer 0.
Die Aussage:

> UCPOL0 steht an erster Bitposition.

ist also in diesem Kontext falsch. Sie muss lauten:

UCPOL0 steht an NULLTER Bitposition.

Merkregel: In der Informatik werden im allgemeinen die Ordinalzahlen ab 
0 genommen, nicht ab 1.

Das koninzidiert recht gut mit dem Schema dass mit der 
Bitschiebeoperation << gemeint ist.

x << y

Sei x = 1

Dann schiebt 1 << USCPOL mit USCPOL = 0 die 1 um wieviel Bit?

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