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
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.
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.
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).
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.
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?
Nach dem wir jetzt alle sehr herzlich gelacht haben, wäre ich dankbar, wenn mir jemand erklärt, wie die 3 zustande kommt.
>wenn mir jemand erklärt, wie die 3 zustande kommt.
Ich geb dir mal einen Tip:
UCSZn1 UCSZn0
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.
Hallo, und dies entspricht dem Essen lernen eines Kindes in Bezug auf die Atmel AVR µC Programmierung in Verbindung mit der C Programmiersprache.
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.
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..
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?
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.