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
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.
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.
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.
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.
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
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.
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.
Alles klar danke. habs mittlerweile auch ausprobiert am mikrocontroller und es hat ordnungsgemäß funktioniert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.