Forum: Mikrocontroller und Digitale Elektronik ATtiny3216, UART CLK2X - Verständnisfrage


von Droid E. (eedroid)


Lesenswert?

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?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Droid E. (eedroid)


Lesenswert?

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

von Droid E. (eedroid)


Lesenswert?

Ah, jetzt habe ich es. Da durch CLK2X der Wert von S halbiert wird, 
verdoppelt sich der Registerwert.

BAUD1X = 18432000 / (16*19200) - 1 = 59
BAUD2X = 18432000 / ( 8*19200) - 1 = 119

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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. :)

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nochmal: du bist weit davon entfernt, U2X zu brauchen.

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Wie kommt man auf diese Formel
> BAUD = 18432000 / (16*19200) - 1 = 59
nachdem man bis zu 24-2
> Nun steht aber im Datenblatt (Table 24-2.
vorgedrungen war?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

S. Landolt schrieb:
> Wie kommt man auf diese Formel

Vermutlich mit "haben wir doch schon immer so gemacht" :-)

Das ist letztlich die Formel für die alten AVRs.

von Droid E. (eedroid)


Angehängte Dateien:

Lesenswert?

Hallo,

ich frage mich gerade warum wir unterschiedliche Datenblätter haben. Ich 
kenne die alten AVR nicht. Die aktuellen AVR sind für mich gerade die 
neuen AVR - Vielen Dank für Eure Geduld! :)

von S. Landolt (Gast)


Lesenswert?

> ich frage mich gerade warum wir unterschiedliche Datenblätter haben.
Ganz einfach: preliminary von 2018 vs. 2020. Im Prinzip steht da ja aber 
dasselbe.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Droid E. schrieb:
> Ich kenne die alten AVR nicht.

Dafür ist es verwunderlich, wie du auf
1
BAUD = 18432000 / (16*19200) - 1 = 59

kommst. Denn das steht auch in deinem Screenshot an keiner Stelle.

von Droid E. (eedroid)


Lesenswert?

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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

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.