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
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.
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.
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).
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.
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.
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.
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
Sorry. Ich schein' wohl völlig auf dem Schlauch zu stehen, oder vor lauter Bäume den Wald nicht zu sehen ...
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.
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!?
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.
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
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.