In der Zeile unter dem Baudrate define wird dann der Wert ausgerechnet,
den man in die Register des USART schreibt:
1 | #define MYUBRR FOSC/16/BAUD-1
|
Da kommt ein Wert raus, dem man auf 2 Register (UBRRL und UBRRH)
veteilen muss.
Genau das machen die Zeilen
1 |
|
2 | UBRRH = (unsigned char)(ubrr>>8);
|
3 | UBRRL = (unsigned char)ubrr;
|
wobei der Ausdruck (ubrr>>8) das obere Byte um 8 bit nach rechts schiebt
und damit daraus ein Byte erzeugt.
Angenommen ubrr hat den Wert 0x789a, dann wird (ubrr>>8) zu 0x78, die
unteren 8 bit verschwinden. Das Maskieren auf 8 bit macht der Compiler,
da der weiss, das UBRRL und UBRRH lediglich Bytes aufnehmen können.
UBRRL erhält in diesem Beispiel dann die 0x9a.