USART ATmega2561

OP #4862352
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
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 #4862380
Aber mein lieber Thomas,

das ist nun wirklich trivial und Du solltest Dir diese Frage, nach einem 
Blick in das Datenblatt, innerhalb von 10s selbst beantworten können.
Gast #4862394
Hallo,

vielleicht sollte man noch mitteilen dass (n<<1) = n*2¹ entspricht.
Je nach Programmiersprache muss man "n" noch casten um nicht den 
Wertebereich zu überschreiten (verlassen).
Gast #4862403
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 #4862407
Visor schrieb:
> das ist nun wirklich trivial und Du solltest Dir diese Frage, nach einem
> Blick in das Datenblatt, innerhalb von 10s selbst beantworten können.

seit wann steht im Datenblatt wie der Syntax von C ist?
Gast #4862494
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.
Gast #4862507
Und Du hast dem Kind nun ein weiteres Mal bestätigt, dass es den Löffel 
nicht selbst zum Munde führen muss, weil es immer einen Blöden gibt, der 
es für es tut.
Gast #4862515
Ja Visor diesmal schon, da ihm die Grundlagen komplett fehlen; 
vielleicht sieht er nun das vorgehen und kann bei weiteren Fragen direkt 
die Infos suchen und finden - ich habe vertrauen..
OP #4862585
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.