UART des ATmega644 (funktioniert zwar, weiß aber nicht warum)

Gast #1868932
Lesenswert?

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?
Gast #1868958
Lesenswert?

Hi

>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?

Wenn dieser Code funktioniert, dann läuft dein ATMega mit 8MHz. Da 
passen die 103.

MfG Spess
#1869041
Lesenswert?

binGeradePlanlos schrieb:
> Achso? Ok, danke euch.
>
> Werner B. schrieb:
> ...
>> 12+1 = 13;
>> 13*8 = 104;
>> 104-1 = 103;...
>
> Ich sehe den Wert (103) zwar auch in der Tabelle vom Datenblatt, aber
> wie kommt denn dein Rechenweg zustande?

Das ist einfach nur eine Abschätzung wie der Zusammenhang zwischen 
deinem Wert (die 103) und dem aus dem Datenblatt (die 12) aussieht.
Und siehe da, da taucht der Faktor 8 tatsächlich auf. Faktor 8 ist ein 
deutlicher Hinweis, dass es was mit dem CKDIV8 Flag zu tun haben könnte.

Im Umkehrschluss: Wenn man die Vermutung hat, dass CKDIV8 da mit 
reinspielt, dann prüft man eben auf die Schnelle ob es 'zufällig' einen 
Zusammenhang mit einem Faktor von 8 zwischen dem tatsächlichen und dem 
geforderten Wert gibt.


Wie man auf den Wert kommt, wenn man die Taktfrequenz und die Baudrate 
kennt: Im Datenblatt ist die Formel dazu.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren