Hallo,
ich verwende einen ATmega644 bei 1 MHz und der nachfolgende
Codeschnipsel funktioniert einwandfrei:
1 | void uart_init(void)
|
2 | {
|
3 | uint8_t ubrr0;
|
4 |
|
5 | // 9600 BAUD RATE @ 1Mhz using 2x == 1
|
6 | ubrr0 = 103;
|
7 | UCSR0A |= ( 1 << 1); // doubling the transfer rate for asynchronous communication
|
8 | UBRR0L = ubrr0; // Baud Rate = 9600
|
9 | UBRR0H = ubrr0 >> 8; // Baud Rate = 9600
|
10 | UCSR0C = ( 3 << UCSZ00); // number of data bits = 8-bit;
|
11 | // no parity; 1 stop bit
|
12 |
|
13 | UCSR0B |= (1<<RXEN0)|(1<<TXEN0);// Enable receiver and transmitter
|
14 | // Enable RX Interrupt
|
15 | UCSR0B |= (1 << RXCIE0); // RX Complete Interrupt Enable
|
16 | }
|
Ich kann jedoch nicht nachvollziehen warum das Register UBRR auf 103
gesetzt wird (würde es aber trotzdem gerne verstehen). Wenn ich im
Datenblatt nachsehe (Seite 187), dann müsste doch der Wert (bei f=1MHz,
UsXn=1 und 9600 Baud) auf 12 gesetzt werden. Oder irre ich mich?