Forum: Mikrocontroller und Digitale Elektronik USART ATmega2561


von Thomas H. (datatom)


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

von Peter II (Gast)


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.

von Visor (Gast)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

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

von Visor (Gast)


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.

von Peter II (Gast)


Lesenswert?

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?

von Thomas H. (datatom)


Lesenswert?

Nach dem wir jetzt alle sehr herzlich gelacht haben, wäre ich dankbar, 
wenn mir jemand erklärt, wie die 3 zustande kommt.

von holger (Gast)


Lesenswert?

>wenn mir jemand erklärt, wie die 3 zustande kommt.

Ich geb dir mal einen Tip:

UCSZn1 UCSZn0

von Karl M. (Gast)


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.

von Karl M. (Gast)


Lesenswert?

Hallo,

und dies entspricht dem Essen lernen eines Kindes in Bezug auf die Atmel 
AVR µC Programmierung in Verbindung mit der C Programmiersprache.

von Visor (Gast)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

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..

von Visor (Gast)


Lesenswert?

Drücken wir die Daumen ...

von Thomas H. (datatom)


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?

von Visor (Gast)


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?

von Thomas H. (datatom)


Lesenswert?

Visor schrieb:
> Dann schiebt 1 << USCPOL mit USCPOL = 0 die 1 um wieviel Bit?

00000001

Mehr oder weniger geraten. Habe mich auch noch nicht mit dem Thema 
beschäftigen können. Steht aber zwangsläufig an.

von Visor (Gast)


Lesenswert?

Thomas H. schrieb:
> Visor schrieb:
>> Dann schiebt 1 << USCPOL mit USCPOL = 0 die 1 um wieviel Bit?
>
> 00000001

Nein. Um 0 Bit.

Das Ergebnis ist allerdings binär 00000001, nur war das nicht die Frage.

von Thomas H. (datatom)


Lesenswert?

Wie gesagt, Thema steht auf der Agenda. Danke aber für die Hilfe.

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.