Forum: Mikrocontroller und Digitale Elektronik UART Synchronisieren


von Peter W. (ja_wasser)


Lesenswert?

hallo,
wir haben ein mikrocontroller mit 25 Mhz. wir sollen über die serielle 
schnittstelle (uart) nun strings bzw. chars übertragen und sender und 
empfänger synchronisieren. Das mit startbit, stopbit etc. ist klar, was 
wir nun allerdings berechnen sollen ist diese abtastrate oder sowas. So 
wie es hier beschrieben ist 
https://www.mikrocontroller.net/articles/Baudratenquarz unter dem punkt 
abtastung.

Also irgendwie sollen wir berechnen, das der empfänger in der mitte 
zwischen zwei bits auf der leitung guckt ob low oder high anliegt.

Wir haben da so eine formel gegeben:

Baud rate = Masterclock / (16 * Clock_Divisor)

Der Clock Divisor ist ein 16bit counter und die masterclock sind die 
25Mhz, d.h. so wie es ausschaut kann ich damit die masterclock auf 
höchstens 16*2^16 herunterdividieren. In dem programm für die serielle 
schnitstelle haben wir das hier stehen:

25MHz / ( 16 * 38400) = 40.69  -> 41

D.h. die masterclock (also die 25Mhz) wird auf 41Hz heruntergetaktet, 
d.h. 41 mal in der sekunde kann ein bit (oder auch zeichen, also 8bit?) 
übertragen werden?

Aber was muss ich dann als baudrate beim empfänger einstellen? Ich kann 
da nur 9600, 38400 und 115200 einstellen. Das macht doch überhaupt kein 
sinn? Wenn ich da 9600 einstelle bedeutet das doch das der empfänger 
9600 mal in der sekunde schaut welcher pegel an der leitung anliegt 
während der sender irgendwie nur 41 mal in der sekunde ein bit 
übertragen kann? D.h. der sender könnte alle 1/41s den pegel verändern 
und der empfänger kann alle 1/9600s schauen ob sich der pegel verändert 
hat. Na ja könnte ja hinhauen? Aber ganz blick ich da jetzt nicht durch. 
Weiß wer wie man das gescheit hinrechnet das sender und empfänger 
synchron sind?

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Stelle deine Formal mal nach dem Clock Divisor um.
Da sollte dir was auffallen.

Ansonsten kannst du auch ausprobieren und kannst feststellen, dass du:
- für eine Baudrate von 38400 einen Divisor von ca. 41 brauchst;
- mit einem Divisor von 41 auf eine Baudrate von 38110 kommst.

Eine Baudrate von 38400 ist übrigens eine Standardrate, die dir sogar 
vorgegeben ist.

von H.Joachim S. (crazyhorse)


Lesenswert?

Peter W. schrieb:
> und sender und
> empfänger synchronisieren.

Genau das ist weder möglich noch nötig, schau mal, wofür das A in UART 
steht.
Es muss nur in etwa stimmen, das ist die Vereinbarung der (gleichen) 
Baudrate auf beiden Seiten. Üblich sind 2% zul. Toleranz. Ein Art 
Synchronisation ist die fallende Flanke des Startbits, daran orientiert 
sich der Rest des Byte-Empfangs. Die Abtastzeitpunkte der einzelnen 
Datenbits ergeben sich aus der Baudrate und werden nicht mehr mit 
irgendwas synchronisiert.

von Peter W. (ja_wasser)


Lesenswert?

S. R. schrieb:
> Stelle deine Formal mal nach dem Clock Divisor um.
> Da sollte dir was auffallen.
>
> Ansonsten kannst du auch ausprobieren und kannst feststellen, dass du:
> - für eine Baudrate von 38400 einen Divisor von ca. 41 brauchst;
> - mit einem Divisor von 41 auf eine Baudrate von 38110 kommst.
>
> Eine Baudrate von 38400 ist übrigens eine Standardrate, die dir sogar
> vorgegeben ist.

Hmm ok. Das bedeutet wenn ich die Masteclock auf die 41Hz heruntertakte, 
also wegen diesem wirsing:

25MHz / ( 16 * 38400) = 40.69 = 41 und dann nach Baudrate umstellen:
baud = 25Mhz / 16*41 = 38110

und deswegen beim empfänger eine baudrate von 38400 einstelle, dann 
passt die geschichte? Rein formeltechnisch macht das zwar sinn, aber 
versteh jetzt nicht so ganz wieso es in der praxis genau so sein soll. 
Alle 1/41s sendet der sender und alle 1/38400s schaut der empfänger auf 
die leitung. Kommt mir etwas komisch vor dieses verhältnis.

von H.Joachim S. (crazyhorse)


Lesenswert?

Peter W. schrieb:
> Alle 1/41s sendet der sender

Wie kommst du darauf?

von Jim M. (turboj)


Lesenswert?

Peter W. schrieb:
> wenn ich die Masteclock auf die 41Hz heruntertakte,

Die 41 ist ein Divisor und hat keine Einheit.

Oder wenn man eine Einheit angeben will, dann wären das "Bit" hoch minus 
eins.

von Peter W. (ja_wasser)


Lesenswert?

H.Joachim S. schrieb:
> Peter W. schrieb:
>> Alle 1/41s sendet der sender
>
> Wie kommst du darauf?


Weil bei der formel ja die masterclock im zähler steht und die 
masterclock wird dann ja durch 16*38400 geteilt, deswegen hab ich halt 
irgendwie gedacht die masterclock wird dann dementsprechend 
heruntergetaktet auf die 41Hz damit sie nicht so viele zeichen senden 
kann damit der empfänger nicht "überflutet" wird und fehler entstehen. 
Denn es ist ja schon klar je höher die abtastfrequenz des empfängers ist 
und desto niedriger die sendefrequenz ist, desto weniger wahrscheinlich 
ist es das der pegel auf der leitung falsch interpretiert wird (nehm ich 
an).

: Bearbeitet durch User
von H.Joachim S. (crazyhorse)


Lesenswert?

Peter W. schrieb:
> Denn es ist ja schon klar je höher die abtastfrequenz des empfängers ist
> und desto niedriger die sendefrequenz ist, desto weniger wahrscheinlich
> ist es das der pegel auf der leitung falsch interpretiert wird (nehm ich
> an).

Du hast es noch nicht verstanden.

von foobar (Gast)


Lesenswert?

Der Baudratengenerator wird mit dem "Masterclock" (25MHz) getaktet. Es 
ist ein einfacher Zähler, der bei erreichen eines Schwellwertes (deine 
41) einen Puls auf den Ausgang gibt und wieder bei 0 anfängt. Der 
Ausgangstakt wird dadurch durch den Schwellwert geteilt - 25MHz/41 
ergibt dann (ungefähr) die gewünschten 38400*16.

Die 38400 ist die Bitrate, d.h. 38400 Bits werden pro Sekunde 
übertragen. Fürs Senden würden diese 38400Hz ausreichen - jeden Takt ein 
Bit rausschieben, das *16 bräuchte man nicht.

Da Sender und Empfänger aber nicht synchron laufen (leicht 
unterschiedliche Geschwindigkeiten, Flanken zu unterschiedlichen 
Zeitpunkten), reicht das für den Empfang nicht - man würde das Startbit 
an irgendeinem Punkt erkennen und nach ein paar Bits rutscht man in ein 
Nachbarbit. Deshalb wird jedes Bit in 16 Zeitscheiben eingeteilt (also 
eine 38400*16-tel Sekunde). Mit Erkennen der vorderen Flanke des 
Startbits wird die Zeitscheibenzählung begonnen (Synchronisierung auf 
die Sendeflanke) und dann immer der Wert der 8. Zeitscheibe (also die 
Mitte eines Bits) als Datenbit übernommen[1]. Auf diese Weise dürfen die 
Takte leicht unterschiedlich sein, ohne Probleme zu verursachen - man 
"rutscht" im Laufe des Bytes etwas nach vorne oder hinten, man startet 
aber mit dem maximalen Abstand zum Nachbarbit.
1
       Startbit            1.Datenbit       ...
2
    ___________________                 _____________
3
____|                 |_________________|                ~38400Hz
4
    01234567890abcdef01234567890abcdef01234567890abcd    38400*16Hz
5
    ^       ^                ^                ^
6
    Start   Abtasten         Abtasten         Abtasten

[1] Die meisten Empfänger testen nicht nur die 8. Zeitscheibe, sonder 
auch noch die davor und danach (7. und 9.) - der Wert, der am häufigsten 
detektiert wurde (also 2 oder 3 mal), wird dann genommen.

von foobar (Gast)


Lesenswert?

s/90a/9a/g

von Rolf M. (rmagnus)


Lesenswert?

foobar schrieb:
> s/90a/9a/g

s/9a/9/g

von Peter W. (ja_wasser)


Lesenswert?

Alles klar danke. habs mittlerweile auch ausprobiert am mikrocontroller 
und es hat ordnungsgemäß funktioniert.

von Wolfgang (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Es muss nur in etwa stimmen, das ist die Vereinbarung der (gleichen)
> Baudrate auf beiden Seiten. Üblich sind 2% zul. Toleranz.

Immerhin summieren sich die 2% am Ende des letzen Bits auf fast 20% der 
Bitdauer auf. Wie groß die Toleranz sein darf, hängt dann auch noch von 
der Verzerrung der Impulse bei der Übertragung ab.

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.