Forum: Mikrocontroller und Digitale Elektronik Xmega:"Impact of Fractional Baud Rate Generation"


von Werner (Gast)


Lesenswert?

Hallo!

Ich bin gerade dabei das Datenblatt des ATxmega(128)a zu studieren.
Den Abschnitt 21.9 "The Impact of Fractional Baud Rate Generation" 
verstehe ich jedoch irgendwie gar nicht.
Kann mir bitte jemand verständlich (und auf Deutsch ;) ) erklären, 
worauf dieses Kapitel hinweist und was man wie zu beachten hat?

Danke.

Gruß
Werner

von Clemens (Gast)


Lesenswert?

Wenn der Takt für die serielle Übertragung durch Division aus dem 
Systemtakt abgeleitet wird, kann man sich in manchen Fällen nur 
annähern. Das führt über längere Zeit zu einer Phasenverschiebung und 
Übertragungsfehlern.

von Simon K. (simon) Benutzerseite


Lesenswert?

Clemens schrieb:
> Wenn der Takt für die serielle Übertragung durch Division aus dem
> Systemtakt abgeleitet wird, kann man sich in manchen Fällen nur
> annähern. Das führt über längere Zeit zu einer Phasenverschiebung und
> Übertragungsfehlern.

Und das wird durch den Fractional Baud Rate Divider eben verhindert.
Der "Phasenfehler" wird über die Bitzeit "aufaddiert" und falls nötig 
wird ein Extra "Wartetakt" bis zum nächsten Bit eingefügt um den Fehler 
wieder zu verringern.

von Werner (Gast)


Lesenswert?

Clemens schrieb:
> Wenn der Takt für die serielle Übertragung durch Division aus dem
> Systemtakt abgeleitet wird, kann man sich in manchen Fällen nur
> annähern. Das führt über längere Zeit zu einer Phasenverschiebung und
> Übertragungsfehlern.

Ja, das ist mir bewusst.
155.2kBaud aus 16MHz wären 138,8888. Meist wählt man dann als Divisor 
139.

Simon K. schrieb:
> Der "Phasenfehler" wird über die Bitzeit "aufaddiert" und falls nötig
> wird ein Extra "Wartetakt" bis zum nächsten Bit eingefügt um den Fehler
> wieder zu verringern.

Das habe ich irgendwie noch nicht verstanden. Wie wird der Phasenfehler 
erkannt? Wie wird der Wartetakt berechnet/bestimmt und wann dieser 
erfolgen soll? Was für Auswirkungen hat das auf die Abtastung des/der 
Bits? Normalerweise wird ja ein Bit überabgetastet (8...16mal).

von Simon K. (simon) Benutzerseite


Lesenswert?

Werner schrieb:
> Simon K. schrieb:
>> Der "Phasenfehler" wird über die Bitzeit "aufaddiert" und falls nötig
>> wird ein Extra "Wartetakt" bis zum nächsten Bit eingefügt um den Fehler
>> wieder zu verringern.
>
> Das habe ich irgendwie noch nicht verstanden. Wie wird der Phasenfehler
> erkannt?
Das gute ist, dass der Phasenfehler nicht mal erkannt werden muss, 
sondern bekannt ist :-) Siehe dein Rechenbeispiel. Beim Runden lässt du 
die Dezimalstellen wegfallen. Mithilfe dieser lässt sich im Prinzip der 
Fehler berechnen.

Ach so, nur damit das klar ist: Der Mikroprozessor weiß nichts von 
Dezimalstellen oder Runden. Der Phasenfehler wird auch nicht im 
Mikrocontroller berechnet. Du kannst beim XMEGA soweit ich weiß ja den 
ganzzahligen Teil und den fraktionalen (fraktional heißt 1/xten) Teil 
des Teilers angeben, der deiner gewünschten Baudrate am nächsten kommt.

Hierdurch wird dem Controller direkt mitgeteilt, wo genau irgendwelche 
"Wartetakte" eingebaut werden müssen.

> Wie wird der Wartetakt berechnet/bestimmt und wann dieser
> erfolgen soll? Was für Auswirkungen hat das auf die Abtastung des/der
> Bits? Normalerweise wird ja ein Bit überabgetastet (8...16mal).

Das Ganze hier ist eine eher amateurhafte Erklärung. Aus dem Stegreif 
kann ich dir auch keine weiteren Details dazu nennen. Ich weiß aber, 
dass es ganz gut funktioniert.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Vom Prinzip her ist es so, dass Du mit jedem Bitwert des fraktionalen 
Baudratenteilers die Eingangsfrequenz des UARTs verdoppelst, wodurch Du 
die doppelte Auflösung mit dem einfachen Baudratenteiler erhältst. Somit 
kannst Du einen Fehler von 2.5% durch einen fraktionalen Baudratenteiler 
von -2 und der entspechenden Anpassung des normalen Baudratenteilers 
ausgleichen.

von Werner (Gast)


Lesenswert?

Simon K. schrieb:
> Das gute ist, dass der Phasenfehler nicht mal erkannt werden muss,
> sondern bekannt ist :-)

Woher soll der Prozessor wissen, dass ich mit dem Teiler von 139 eine 
Baudrate von 115,2kBaud erreichen möchte und ich den Teiler um 
0,1111...111 aufgerundet hab!?

Simon K. schrieb:
> (fraktional heißt 1/xten)
Knut Ballhause schrieb:
> Vom Prinzip her ist es so, dass Du mit jedem Bitwert des fraktionalen
> Baudratenteilers die Eingangsfrequenz des UARTs verdoppelst

Das wäre ja nur der Fall, wenn es 1/(2^x) wäre, aber dann komme ich ja 
nicht auf 139 bzw. 138 sondern mit x=7 auf 128.

Knut Ballhause schrieb:
> Somit
> kannst Du einen Fehler von 2.5% durch einen fraktionalen Baudratenteiler
> von -2 und der entspechenden Anpassung des normalen Baudratenteilers
> ausgleichen.

Mir fehlt anscheinend noch immer das Grundverständnis diese Erklärung zu 
verstehen.

von spess53 (Gast)


Lesenswert?

HI

>Woher soll der Prozessor wissen, dass ich mit dem Teiler von 139 eine
>Baudrate von 115,2kBaud erreichen möchte und ich den Teiler um
>0,1111...111 aufgerundet hab!?

Der Controller gar nicht. Aber du. In BAUDCTRLB gibt es BSCALE[3:0] mit 
den das eingestellt wird. Dein Baudratenregister must du z.B. doch auch 
selbst setzen.

MfG Spess

von Werner (Gast)


Lesenswert?

Sorry. Ich schein' wohl völlig auf dem Schlauch zu stehen, oder vor 
lauter Bäume den Wald nicht zu sehen ...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Die Baudrate, auf der Dein UART des Controllers arbeiten soll, stellst 
Du über BAUCTRLB Bit3:0 (BSEL11:8) und BAUDCTRLA Bit7:0 (BSEL7:0) ein, 
so wie auch bei den herkömmlichen Megas auch. Wenn Du dann feststellst, 
dass die UART-Taktrate nicht nah genug an die erwartete Baudrate 
herankommt, also ein Fehler entsteht, dann trägst Du in BAUDCTRLB Bit7:4 
(BSCALE3:0) eine -1 ein (1111). Damit hast Du dann für die BSEL-Bits die 
doppelte Auflösung. Wenn Du beispielsweise mit BSEL=20 nicht auf die 
Zielbaudrate gekommen bist, kannst Du nun anstelle der 20 BSEL=41 oder 
39 eingeben und kannst somit Zwischenwerte erreichen. Wenn Du BSCALE=-2 
(1110) eingibst, könnte BSEL=82/81/79/78 sein. Der Fehler ist damit nur 
noch 1/4 des Eingangsfehlers. Das Ganze kannst Du bis BSCALE=-7 (1001) 
fortsetzen.

von Werner (Gast)


Lesenswert?

Das heißt ich suche mir den Faktor raus, der am nächsten zu meiner 
gewünschten Baudrate führt und wähle dementsprechend das BSCALE-Register 
und BSEL aus.
Aber warum nämlich dann nicht gleich die höchste Überabtastung?
Weil BSEL=82 bei BSCALE=-2 ist doch das gleiche wie BSEL=41 bei -1!?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Werner schrieb:
> Aber warum nämlich dann nicht gleich die höchste Überabtastung?

Weil dort ein Jitter auftritt, der vielleicht unerwünscht ist. Betrachte 
es als Hilfsmittel.

Werner schrieb:
> Das heißt ich suche mir den Faktor raus, der am nächsten zu meiner
> gewünschten Baudrate führt

Das musst Du sowieso immer. Idealerweise triffst Du die Rate genau, mit 
einem Fehler von +-1% kannst Du ebenfalls leben.

von spess53 (Gast)


Lesenswert?

Hi

>Aber warum nämlich dann nicht gleich die höchste Überabtastung?

Was für eine Überabtastung? Ein Bit wird immer 16 bzw. 8 mal 
gesampled. Und diese Samlingfrequenz wird mit BSEL und BSCALE 
eingestellt.

MfG Spess

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

spess53 schrieb:
> Ein Bit wird immer 16 bzw. 8 mal
> gesampled.

Nee, eben nich ;-). Das Bit wird alle 15,16,15,16... Male gesampelt bei 
BSCALE -1. Oder alle 14,15,16,14,15,16... Male bei BSCALE -2. Oder so 
ähnlich. Die Eingangsfrequenz für den UART-Takt ist immer dieselbe.

von spess53 (Gast)


Lesenswert?

Hi

>Nee, eben nich

Also im A-Manual lese ich:

The data recovery unit uses sixteen samples in Normal mode and eight 
samples in Double Speed mode for each bit. Figure 21-7 on page 244 shows 
the
sampling process of data and parity bits.

BSCALE dient ja der Feinabstimmung. Da würde ein Bereich von -7...+7 
also 9...23 Samples pro Bit keinen sinn machen. Beim Prescaler schon.

MfG Spess

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich denke, dass mit BSCALE nur die Zeit zwischen den 16 oder 8 
Abtastungen leicht verändert wird.

Sprich, bei Baudregister = 139 ohne Fractional Divider (A steht für 
Abtastung).

A - 139 Takte warten - A - 139 Takte warten - A - 139 Takte warten - A - 
...

Das ganze 8 oder 16 mal bis ein Bit fertig ist.

Mit Fractional Divider könnte das so aussehen:


A - 139 Takte warten - A - 138 Takte warten - A - 139 Takte warten - A 
- ...

EDIT: Ach so, weil oben die Frage aufkam: Warum nicht immer auf maximale 
Auflösung stellen: Wenn man BSCALE auf die höchste Auflösung stellt, 
kommt man AFAIK nicht mehr an hohe Baudraten dran.

von spess53 (Gast)


Lesenswert?

Hi

So sehe ich das auch.

MfG Spess

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.