Forum: Mikrocontroller und Digitale Elektronik UART des ATmega644 (funktioniert zwar, weiß aber nicht warum)


von binGeradePlanlos (Gast)


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?

von Werner B. (werner-b)


Lesenswert?

Offenbar läuft er mit 8 MHz, denn...

12+1 = 13;
13*8 = 104;
104-1 = 103;

Also Faktor 8. Da ist schätzungsweise die CLKDIV8 Fuse nicht im 
Auslieferzustand.

von Spess53 (Gast)


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

von binGeradePlanlos (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


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.

von Werner B. (werner-b)


Lesenswert?

Definition:  UBRR = (F_CPU / (16 * BAUD)) - 1;

==> BAUD = (F_CPU/(16 * (UBRR + 1));


Wenn bei konstantem BAUD     F_CPUa == 8 * F_CPU_b
dann muss                     (UBRRa+1) == 8 * (UBRR_b+1) sein.
                           ==> 103+1    == 8 * (12+1)

  quod erat demonstrandum

von Peter D. (peda)


Lesenswert?

Werner B. schrieb:
> Also Faktor 8. Da ist schätzungsweise die CLKDIV8 Fuse nicht im
> Auslieferzustand.

Oder das CLKPR wird in der Software geändert.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.