Berechnungen für serielle Übertragungen?

Von: , Frage gestellt am So, 29. Jun 2008

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

8 Antworten zu dieser Frage

  1. Antwort von nach 2 Stunden 0 hilfreich
    Re: Berechnungen für serielle Übertragungen?

    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

    • Antwort von nach 18 Stunden 0 hilfreich
      Re^2: Berechnungen für serielle Übertragungen?

      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. <wichtigtu>Bitrate und Baudrate nicht verwechseln!</wichtigtu> :) Ü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" :P Den letzten Abschnitt besser nicht an die Lehrer weitergeben.
      Ich halte mich zurück :) Gruss Reinhard
      grüße und Danke
      Geisterkarle

      • Antwort von nach einem Tag 0 hilfreich
        Re^3: Berechnungen für serielle Übertragungen?

        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.
        <wichtigtu>Bitrate und Baudrate nicht verwechseln!</wichtigtu> :)
        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

  2. Antwort von nach einem Tag 0 hilfreich
    Re: Berechnungen für serielle Übertragungen?


    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...

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: Berechnungen für serielle Übertragungen?

      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]

      • Antwort von nach einem Tag 1 hilfreich
        Re^3: Berechnungen für serielle Übertragungen?

        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]

        • Antwort von nach einem Tag 0 hilfreich
          Re^4: Berechnungen für serielle Übertragungen?

          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

          • Antwort von nach 2 Tagen 0 hilfreich
            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

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!