Berechnungen für serielle Übertragungen?

Hallo Experten!

Ich hoffe, ich bin hier im entferntesten richtig, habe aber keinen besseren Bereich gefunden.

Ich habe hier die Aufgabe, die ich hoffentlich mit eurer Hilfe lösen kann.
Die Aufgabe sieht vor, dass ich eine asynchrone, serielle Übertragung über eine USART-Schnittstelle habe, die eine Datenrate von 9600 Bit/s hat. Die Schnittstelle hat eine Datenbreite von 8 Bit, keine Paritätsprüfung, 2-faches Stop-Bit und die Schnittstelle ist im normalem Betriebsmodus.
So, ich soll nun für diese Konstellation einen geeigneten Masterclock einstellen bzw. finden (> 30 MHz).

Nun hab ich hier mal nen komischen Ansatz, weiss aber gar nicht, ob das stimmt… Ganz einfach gedacht (so von mir, wie gesagt, hoffe es stimmt), habe ich ja die Datenrate und die Datenbreite. Somit kann ich einfach 9600/8 rechnen und komme auf 1200. Das sollte ja eigentlich die Baud-Rate sein. Habe hier auch eine Formel irgendwo in meinen Aufzeichnungen, die besagt, dass im asynchronen Modus

Baud-Rate = ausgewählter Takt/16

gilt. Nach dem Takt aufgelöst und eingesetzt würde ich also auf 19200 Hz kommen. Sofern diese Überlegung überhaupt richtig ist… Leider ist das auch unter den geforderten Clockeinstellung von größer 30MHz!

Irgendwie fehlen mir hier die richtigen Formeln, Ansätze, Überlegungen oder sowas… Ich hoffe, hier findet sich jemand, der mir das erklären kann, wie ich soetwas berechne!

danke schonmal im voraus!
Geisterkarle

Hallo Experten!

Die Aufgabe sieht vor, dass ich eine asynchrone, serielle
Übertragung über eine USART-Schnittstelle habe, …

Hallo,

eine noch nicht ganz serienreife Glaskugel modernster Bauart entnimmt aus deinen Ausführungen:

  1. die Schnittstelle kann 9600 Baud oder weniger
  2. sie soll mit 1200 Baud betrieben werden
  3. der Takt soll aus dem Prozessortakt abgeleitet werden, der mehr als 30 MHz betragen soll

Üblich ist für USARTs ein Takt von Baud * 16 (es gibt auch * 32), also ist für 1200 Baud ein Takt von 19200 Hz schon richtig. Wortlänge, Parity, Stoppbits spielen dabei keine Rolle.

Dieser Takt soll also aus dem Mastertakt abgeleitet werden, sollte also in einem ganzzahligen Verhältnis dazu stehen, möglichst eine 2er-Potenz. Da käme allerdings nur 2048 in Frage mit 19200 * 2048 = 39321600. Praktisch ist das irrelevant: die Fragestellung war interessant bei Prozessoren mit 1 oder 2 MHz, bei 30 MHz ist der Wert des Quarzes völlig egal, da man 19200 Hz immer mit ausreichender Genauigkeit ableiten kann (ein Teilungsfaktor > 1000 bedeutet ja 0.1 % Genauigkeit, 5% reichen im Notfall für ein USART).

Typisch für das deutsche Bildungswesen: eine Aufgabe aus dem vorigen Jahrhundert wird behelfsmässig an moderne Verhältnisse angepasst, aber das Lehrpersonal ist nicht einmal qualifiziert genug zu erkennen, dass die Aufgabe damit ihren Sinn verloren hat.

Den letzten Abschnitt besser nicht an die Lehrer weitergeben.

Gruss Reinhard

Hallo,

Hallo!

eine noch nicht ganz serienreife Glaskugel modernster Bauart
entnimmt aus deinen Ausführungen:

  1. die Schnittstelle kann 9600 Baud oder weniger
  2. sie soll mit 1200 Baud betrieben werden
  3. der Takt soll aus dem Prozessortakt abgeleitet werden, der
    mehr als 30 MHz betragen soll

Nein, 9600 Bit/s soll die Übertragung sein. Bitrate und Baudrate nicht verwechseln! :smile:

Üblich ist für USARTs ein Takt von Baud * 16 (es gibt auch *
32), also ist für 1200 Baud ein Takt von 19200 Hz schon
richtig. Wortlänge, Parity, Stoppbits spielen dabei keine
Rolle.
Dieser Takt soll also aus dem Mastertakt abgeleitet werden,
sollte also in einem ganzzahligen Verhältnis dazu stehen,
möglichst eine 2er-Potenz. Da käme allerdings nur 2048 in
Frage mit 19200 * 2048 = 39321600. Praktisch ist das
irrelevant: die Fragestellung war interessant bei Prozessoren
mit 1 oder 2 MHz, bei 30 MHz ist der Wert des Quarzes völlig
egal, da man 19200 Hz immer mit ausreichender Genauigkeit
ableiten kann (ein Teilungsfaktor > 1000 bedeutet ja 0.1 %
Genauigkeit, 5% reichen im Notfall für ein USART).

Ah, dann lag ich also richtig, nur der letzte Schritt zur Multiplikation, um über meine 30 MHz zu kommen fehlen! Doch noch wissen angehäuft irgendwie!

Typisch für das deutsche Bildungswesen: eine Aufgabe aus dem
vorigen Jahrhundert wird behelfsmässig an moderne Verhältnisse
angepasst, aber das Lehrpersonal ist nicht einmal qualifiziert
genug zu erkennen, dass die Aufgabe damit ihren Sinn verloren
hat.

Ach, wenn ich betrachte, was ich hier im Studium alles machen musste, ist das ja geradezu „high-end“ :stuck_out_tongue:

Den letzten Abschnitt besser nicht an die Lehrer weitergeben.

Ich halte mich zurück :smile:

Gruss Reinhard

grüße und Danke
Geisterkarle

Datenbreite von 8 Bit, keine Paritätsprüfung, 2-faches
Stop-Bit und die Schnittstelle ist im normalem Betriebsmodus.

Wenn du alle Angaben verwendest, heißt das zumindest schon 'mal, dass jedes Zeichen 11 bits benötigt: 1 Start-Bit, 8 Datenbits, kein Parity-Bit, Stopp-Bit1, Stopp-Bit2…

Hm, na gut, aber letztlich schicke ich bei allen Übertragungen irgendwelche Header, Checksummen, etc. (je nach Übertragungsrat) mit! Aber für die die Übertragungs-Rate sind ja glaube nur die wirklichen Daten einberechnet!?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!

  1. die Schnittstelle kann 9600 Baud oder weniger
  2. sie soll mit 1200 Baud betrieben werden
  3. der Takt soll aus dem Prozessortakt abgeleitet werden, der
    mehr als 30 MHz betragen soll

Nein, 9600 Bit/s soll die Übertragung sein.
Bitrate und Baudrate nicht verwechseln! :smile:

In dem Fall bedeutet Baud=Bit/s, weil die Symbolrate auch nur
1Bit pro ein 1 Pegelwechsel ist.

Verwechsle hier nicht „Symbol“ mit einem Zeichen bzw. Byte.
Anders sieht es bei speziellen Modulationen aus.

Kann sein, daß dies wieder zu etwas konträren Diskussionen führt,
aber in Praxis kenne ich es nur so, daß für jede normale UART,
welche mit 9600Baud arbeitet, dann ein Bit = 1/9600s= ca. 0,104ms
lang ist.
Zum sauberen Synchronisieren muß vom Startbit bis zum Stopbit
(also über 10 Bitlängen die zeitliche Abweichung deutlich kleiner
sein als eine halbe Bitbreite.

Üblich ist für UARTs ein Takt von Baud * 16 (es gibt auch *
32), also ist für 1200 Baud ein Takt von 19200 Hz schon
richtig. Wortlänge, Parity, Stoppbits spielen dabei keine
Rolle.

Bei 9600Baud also eher 153,6kHz
Macht bei 30MHz einen theoretischen Teiler von 195,3

Wenn du also den nächstliegenden ganzen Teiler mit 195 annimmst,
ist die Abweichung kleiner 0,2% pro Bitlänge

-> also kein Problem. Nach 10 Bitzeiten hast du nur eine Abweichung
zur exakten Bitmitte von klener 2% zum Nominalwert.
Das wird also sauber getriggert.
Gruß Uwi

Hallo Geisterkarle,

Die Übertragungsrate 9600Baud bedeutet bei einem UART, dass jedes BIT 1/9600s benötigt. Siehe http://de.wikipedia.org/wiki/UART. Ich empfehle Dir, dir irgendein Datenblatt eines UART-Chips oder Controller-UARTS mal anzuschauen.

Deine Aufgabe macht übrignes auch heute noch sinn, nur ist sie wie schon gesagt nicht aktualisiert. Bei 115200Baud (heute der Standard wie früher 9600) und Teilerfaktor 16 ergeben sich 1,8432 MHz. Wenn nur ganze Teiler erlaubt sind, dann hast Du bei ~30MHz eine Abweichung von bis zu 3%. Das ist beim UART zuviel. 31.335MHz dagegen ist ideal, 0% fehler.

Nun, heute haben die meisten UARTs fraktionale Teiler, aber wir haben ncoh aktuell genügend Projekte, wo wir vielfache von 1,8432 MHz einsetzten (bis 22,1184). Diese Frequenzen sind bei Quarzen sehr häufig.

Gruß
achim

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Hallo Geisterkarle,

Hallo Achim!

Deine Aufgabe macht übrignes auch heute noch sinn, nur ist sie
wie schon gesagt nicht aktualisiert. Bei 115200Baud (heute der
Standard wie früher 9600) und Teilerfaktor 16 ergeben sich
1,8432 MHz. Wenn nur ganze Teiler erlaubt sind, dann hast Du
bei ~30MHz eine Abweichung von bis zu 3%. Das ist beim UART
zuviel. 31.335MHz dagegen ist ideal, 0% fehler.

Und wie komme ich auf die Zahlen? Ist ja gerade mein Problem, dass ich der Rechnung nicht folgen kann, wie ich aus der Baudrate auf die MHz komme!? Also in welchem Zusammenhang der Masterclock mit der Taktrate des UART zusammenhängt!?

Gruß
achim

grüßle
Geisterkarle

Berechnung
Hallo Geisterkarle:

Ein UART teilt jedes Bit in 16 Takte auf, und misst in der Mitte (also nach 8 Takten), welchen Pegel denn das Bit hat. Er fängt an mit der ersten Flanke vom STartbit (der Pegel ist anders als der vom Stopbit und Ruhepegel). nach 8Takten schaut er, ob er den richtigen Pegel hat, nach 8+16 sampelt er das LSB, nach 8+2*16 das nächste, und nach 8 + 9*16 Takten das Parity-Bit, dann das Stoppbit (wenn 8 Datenbits und Parity)

Da er jedes Bit in 16 Takte aufteilt, braucht er selber eine Taktfrequenz die Baudrate * 16 ist. Also 1,8Mhz für 115200Baud.

Warum teilt er jedes Bit in 16 Takte? Nun, 2 Gründe.

  1. liegt die Startflanke Asynchron zum internen Takt, also irgendwo zwischen Anfang und Ende eines Taktes. Würde er nur 1 Takt/Bit verwenden, so könnte die Startflanke so weit am Anfang oder ende liegen, dass er die Bits nicht deutlich unterscheiden kann. So setzt er den Takt, in dem die Startflanke erkannt wird als Takt 0(oder 1) und zählt dann munter weiter.

  2. Um ein wenig unempfindlicher gegen Störungen zu sein, sampelt er nach 7 Takten, 8 Takten und 9 Takten, und nimmt den Wert, der bei mindestens 2 Sampeln erkannt wird.

Naja, 2) muss nicht sein, und auch andere Teiler als 16 sind möglich.

Wie kommst Du nun auf die anderen Möglichen Quarze und Baudraten?
Dazu gibt es Baudratenteiler. Die Teilen (meist ganzzahlig) die Quarzfrequenz soweit runter, dass sich genau( Baudrate * 16) ergibt. Hier kann man meist einen Zahlenwert zwischen 0 und 255 einstellen, was dann einem Teiler von 1-256 entspricht. Da man damit die kleinen Baudraten immer noch nicht erreicht (z.B. 22.1184MHz/16/256 > 4800Baud). Darum gibt es meisten noch ein Register, wo man nochmal durch z.B. 2,4,16 teilen kann, oder der Teiler ist gleich ein 16Bit-Register.

Ach nochwas, die Üblichen Baudraten sind meist ganzahlig durch 115200 teilbar oder vielfache (230400) Ausnahmen sind z.B. 2/3*115200

Gruß
achim