mikrocontroller.net

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


Autor: binGeradePlanlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende einen ATmega644 bei 1 MHz und der nachfolgende 
Codeschnipsel funktioniert einwandfrei:
void uart_init(void)
{
  uint8_t ubrr0;

  // 9600 BAUD RATE @ 1Mhz using 2x == 1
  ubrr0 = 103;
      UCSR0A |= ( 1 << 1);        // doubling the transfer rate for asynchronous communication
  UBRR0L = ubrr0;                 // Baud Rate = 9600
  UBRR0H = ubrr0 >> 8;            // Baud Rate = 9600
  UCSR0C = ( 3 << UCSZ00);        // number of data bits = 8-bit;
                                    // no parity; 1 stop bit

  UCSR0B |= (1<<RXEN0)|(1<<TXEN0);// Enable receiver and transmitter
  // Enable RX Interrupt
  UCSR0B |= (1 << RXCIE0);      // RX Complete Interrupt Enable
}

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?

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: binGeradePlanlos (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.