ATtiny3216, UART CLK2X - Verständnisfrage

OP #6553368
Hallo,

wenn ich bei dem ATtiny3216 für den UART (RS232) die Baudrate einstellen 
möchte, dann kann ich nicht irgendeine Frequenz für den CPU Takte 
nehmen, weil dann die Abweichen vom UART abweicht.

Wenn meine Gegenstelle eine Baudrate von 19200 verlangt, so kann ich für 
meinen ATtiny einen CPU Takt von 18.432MHz wählen und bekomme für das 
Register BAUD = 18432000 / (16*19200) - 1 = 59

Nun steht aber im Datenblatt (Table 24-2. Equations for Calculating Baud 
Rate Register Setting) dass dieses Register BAUD größer als 64 sein 
muss.

Ok, dann kann ich noch das Register CLK2X auf 1 setzen und muss in 
meiner Formel der Wert von S = 16 auf S = 8 setzen und bekomme dann: 
BAUD = 18432000 / (8*X) - 1 = Y

Wenn ich jetzt aber S=8 setze, wie sieht die Formel dann mit Werten aus?
Moderator Persönliche Seite #6553384
Ich habe den 3216 noch nicht in den Fingern gehabt, aber ich lese das 
Datenblatt völlig anders als du.

Erstens: selbstverständlich kann man für eine UART-Kommunikation auch 
mit "baudratenunfreundlichen" Taktfrequenzen arbeiten, solange man die 
Bedingung einhält, dass der Betrag des resultierenden Taktfehlers 
kleiner als etwa 2 % bleibt. Da es sich um eine asynchrone Übertragung 
handelt (und bei heute üblichen UARTs der Empfänger stets eine 
Überabtastung macht), synchronisiert sich das mit dem nächsten Startbit, 
sodass die Fehler sich nicht aufsummieren.

Zweitens: da steht ausdrücklich drin, dass es sich um einen fractional 
baud rate generator handelt, du kommst also auch mit einer 
"baudratenunfreundlichen" Taktfrequenz noch viel näher an den 
gewünschten Takt heran, als das bei den älteren AVRs der Fall war.

Drittens: eben wegen dieses fractional baud rate generators wird das 
Teilerverhältnis im Register mit 64 multipliziert abgelegt. Wenn du also 
einen Taktteiler von 1 haben willst, musst du eine 64 ins Register 
schreiben, für 2 eine 128 etc. Da 1 der kleinste mögliche Teiler ist 
(ein Teilerverhältnis kleiner 1 würde ja eine Erhöhung des Takts 
ergeben), ergibt sich daraus der minimale Registerwert von 64.
OP #6553439
Okay! Wusste ich alles vorher nicht, dank! Habe "nur" gelesen das ich 
mir den Takt und auch die Baudrate selber aussuchen kann.

Aber dass was du geschrieben hast bestätigt doch, dass ich mit der 
BAUD-Formel den minimalen Registerwert von 64 nicht unterschreiten darf. 
Welches mit dem CPU-Takt und der Baudrate von 19200 der Fall wäre: 59

Wenn ich nun aber nun das Register CLK2X auf 1 setze, steht im 
Datenblatt das ich dadurch die Baudrate hochschraube?

Ich kann dadurch noch nicht ableiten wie ich die folgende Formel 
gestalten muss "BAUD = 18432000 / (8*X) - 1 = Y"

Vielen Dank
Moderator Persönliche Seite #6553562
Du willst 19200 Bd haben, ohne U2X hast du 16faches Oversampling (S = 
16), d.h. du brauchst eine Haupt-Taktfrequenz von minimal 307200 (da 
wäre der Teilerfaktor 1, d.h. BAUD=64).

Du hast viel mehr als das. :-) Du brauchst einen Teilerfaktor von 60 (= 
18432000 : 16 : 19200).

Du hast
 und
 sowie
 (mal ohne U2X). Das macht für mich BAUD = 3840. Es sollte dich jetzt 
nicht verwundern, dass dies 64 · 60 ist. :)
Gast #6553639
> ich frage mich gerade warum wir unterschiedliche Datenblätter haben.
Ganz einfach: preliminary von 2018 vs. 2020. Im Prinzip steht da ja aber 
dasselbe.
OP #6553656
Jörg W. schrieb:
> Droid E. schrieb:
>> Ich kenne die alten AVR nicht.
>
> Dafür ist es verwunderlich, wie du auf
> BAUD = 18432000 / (16*19200) - 1 = 59
>
> kommst. Denn das steht auch in deinem Screenshot an keiner Stelle.

BAUD = 18432000 / (16*19200) = 60

Die -1 hatte ich an vielen anderen Stellen gesehen und muss gestehen, 
dass ich das ebenfalls nicht verstanden hatte - sorry!
Moderator Persönliche Seite #6553672
Droid E. schrieb:

> BAUD = 18432000 / (16*19200) = 60

Stimmt eben halt nur fast: das ist zwar der Teilerfaktor, aber eben 
nicht die Zahl, die ins Register einzutragen ist. Diese muss noch mit 
64 multipliziert werden (oder 2^6 in deinem Dokument).

> Die -1 hatte ich an vielen anderen Stellen gesehen und muss gestehen,
> dass ich das ebenfalls nicht verstanden hatte - sorry!

Bei den alten AVRs musste man vom Teilerfaktor immer noch 1 
subtrahieren, also ein Registerwert 0 entsprach einem Teilerfaktor 1, 59 
entsprach 60 etc. Außerdem war das dort eben kein fractional divider, 
sodass man nur ganzzahlige Teilerfaktoren benutzen konnte und daher 
diesen auch nicht mit 64 multipliziert hat.

Daher: deine Formel ist die für die herkömmlichen AVRs. Für den von dir 
verwendeten musst du ins (16-Bit-)Register BAUD die besagten 3840 
eintragen, ohne U2X-Bit.

Du kannst natürlich genauso gut mit 20 MHz Haupttakt arbeiten und ins 
BAUD-Register eine 4167 eintragen (round(65.104167 · 64)) und damit vom 
erwähnten fractional baud rate divider Gebrauch machen.
Gast #6553704
Wobei dieser 'Teilerfaktor' ja eigentlich nicht interessiert: der 
Fractional-Baudrate-Generator, dat is ene jroße schwarze Raum, der hat 
hinten un vorn e Loch. Vorn steckt man den nach der Formel berechneten 
Wert rein, hinten kommen die richtig empfangenen Daten raus.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.