Hallo Ich versuche gerade den folgenden Quellcode zu verstehen (bin Anfänger): /* USART-Init 19200 Baud bei 16MHz für Mega32 */ UCSRB |= ( 1 << TXEN ); // UART TX einschalten UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1 UBRRH = 0; // Highbyte ist 0 UBRRL = 51; // Lowbyte ist 51 ( dezimal ) Im Dateblatt steht ja wenn während eines Schreibvorganges das höchste bit 1 ist wird in register UCSRC geschrieben wenn 0 dann wird gegister UBRRH beschrieben. ein beispiel: UCSRC = 0b10000000 // wird in UCSRC gescrieben da das höchste bit der binären zahl eine 1 ist UBRRH = 0b00001111 wird in UBRRH geschrieben da das höchste bit eine 0 ist UBRRH = 0b11110000 wird in UCSRC geschrieben da das höchste bit eine 1 ist. (mal abgesehen von der lesbarkeit und gutem progstiel) Ist das so richtig oder verstehe ich da was falsch? mfg Fritz
Leider kann ich dir deine Frage auch nicht beantworten aber ich habe zu deinem Problem auch ne Frage. In dieser Zeile: UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1 wird das Frameformat für die Uart-kommunikation festgelegt und ich verstehe das 3<<UCSZ0 nicht so ganz. In meinem Datenblatt (Atmega32, Tab. 66) steht, dass man UCSZ0,UCSZ1 und UCSZ2 einzeln definieren muss um eine bestimmte Datenbitanzahl festzulegen. Wieso genügt es denn in den Beispielen die ich bis jetzt gefunden habe (komischerweise auch im Datenblatt des Atmega32),3<<UCSZ0 zu setzen? Was bedeutet das denn genau?
Ich glaube das ist so: eine 3 wird ja als als summe aus 2hoch0 und 2hoch1 dargestellt: 2^7| 2^6| 2^5| 2^4| 2^3| 2^2| 2^1| 2^0 -------------------------------------- 0 0 0 0 0 0 1 1 und diese beiden einsen werden dann um 1 stelle nach links verschoben, da USCZ0=1 ich glaube daß das so ist. aber 100% würde ich mich nicht darauf verlassen. bin ja selbst noch anfänger. mfg fritz
@Fritz: ich hab jetzt nicht ins Datenblatt geguckt, aber es ist so. Übrigens ist (3<<UCZS0) nicht wirklich schön. Da das sowieso der Präprozessor ausrechnet, wäre die zwar längere Schreibweise (1<<UCSZ1) | (1<<UCZS0) besser lesbar...
Hi! >und diese beiden einsen werden dann um 1 stelle nach links > verschoben, da USCZ0=1 Das ist soweit richtig. Damit wird die 8bit Übertragung eingestellt > Ist das so richtig oder verstehe ich da was falsch? Ja. Die beiden Register liegen an der selben Adresse. Das oberste Bit entscheidet welche Funktion (Baudrate oder Konfiguration) verwendet werden soll. Wahrscheinlich kannst Du statt UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); auch UBRRH |= ( 1 << URSEL )|( 3<<UCSZ0 ); schreiben. Sollte den gleichen Effekt haben; mit der Außnahme das dann niemand den Code mehr versteht ohne das Datenblatt gelesen zu haben;-) Gruß Dirk
Hi! > Übrigens ist (3<<UCZS0) nicht wirklich schön. Da das sowieso der > Präprozessor ausrechnet, wäre die zwar längere Schreibweise > (1<<UCSZ1)| (1<<UCZS0) besser lesbar... Bessere wäre aber eine (numerische) Konstante z. B. #define UART_8BIT (3 << UCZS0) #define USE_UCSRC (1 << URSEL) odel als enums und dann UCSRC |= USE_UCSRC | UART_8BIT; Aber jeder wie es ihm gefällt...
Eigentlich geht es nur darum, dass die "3" gern überlesen wird, da sich bei solchen Sachen meist ein "1" im linken Teil der Klammer befindet. Somit würde ein andere USART-Modus eingestellt werden...
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.