ATtiny3216, UART CLK2X - Verständnisfrage

OP #6553368
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?
Moderator Persönliche Seite #6553384
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.
OP #6553439
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
Moderator Persönliche Seite #6553562
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. :)
OP #6553656
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!
Moderator Persönliche Seite #6553672
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.
Gast #6553704
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.

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