Aus uart.c Zeile ??? (von
http://homepage.hispeed.ch/peterfleury/avr-software.html, abgerufen
heute):
1 | #if defined(UART0_UBRRH)
|
2 | UART0_UBRRH = (unsigned char)((baudrate>>8)&0x80) ;
|
3 | #endif
|
4 | UART0_UBRRL = (unsigned char) (baudrate&0x00FF);
|
Wozu ist das &0x80 gut?
Im alten ATmega8 gibt es zwar das URSEL-Bit an der entsprechenden
Stelle. Das soll aber 0 sein, wenn man nach UBRRH schreiben möchte.
Ausserdem werden durch das &0x80 die unteren 4 Bit gelöscht, die ja für
langsame Baudraten nötig sind.
Ich bin auf dieses Problem gestoßen, als ich versucht habe, ein UART mit
300 Baud auf meinem ATtiny841 mit 8MHz zu programmieren. Egal wie hoch
ich die Zahl in
geschrieben habe, die Baudrate war immer etwas über 4000 Baud.
Ich habe das &0x80 entfernt, und so funktioniert es.