Freddy schrieb:
> Thomas Eckmann schrieb:
>> Ja. Aber da die UCSZ-Werte ohnehin 1 sind, kannst du dir das Ganze auch
>> sparen.
>
> Okay, aber dann wär ja auch die Angabe der UMSEL und URSEL Werte
> überflüssig.. Die sind standardmäßig ja auch entsprechend gesetzt.
Darum geht es nicht. Vergiss das UMSEL. Das schaltet eine Funktion im
UART und steht per Default auf Asynchron. Das ist das, was du brauchst.
Das URSEL-Bit schaltet aber keine Funktion im UART, sondern steuert den
Zugriff auf UBRRH und UCSRC. Diese Register haben dieselbe(!) Adresse.
Wenn URSEL 1 ist, geht der Wert ins UCSRC, wenn es 0 ist, ins UBRRH. Per
Default ist dieses Bit eins. Wenn man zuerst das UCSRC setzt, braucht
man sich nicht darum kümmern. Man darf nur nicht das ganze Byte
zuweisen.
> UCSRC = (1<<UCSZ1) | (1<<UCSZ0) | (0<<UMSEL) = 0x06;
Damit ist URSEL nämlich 0!
Es dürfen nur die Bits geändert werden:
1 | UCSRC |= (1<<UCSZ1) | (1<<UCSZ0;
|
oder
1 | UCSRC = (1 << URSEL) | (1<<UCSZ1) | (1<<UCSZ0;
|
Sonst landet das Byte im UBRRH und setzt es in diesem Fall auf 6. Welche
Baudrate du dann hast, kannst du selber ausrechnen. Die, die du haben
haben willst auf jeden Fall nicht.
Nach einem Zugriff auf UBRRH, für das der Maximalwert 15 ist und kein
normaler Mensch einzelne Bits setzt, wird das URSEL automatisch auf 0
gesetzt.
Damit ist das Bit7, also URSEL, 0 und der Wert geht ins UBRRH.
Deswegen ist es grundsätzlich keine gute Idee, das URSEL beim Schreiben
nicht explizit zu setzen.
mfg.