Wie kritisch sind UART-Frequenzen?

17

Ich werde einen 8-MHz-Quarz verwenden, um meinen Mikrocontroller mit 16 MIPS zu betreiben (PLL 4x, 2-Zyklus-Anweisungen). 8 MHz teilt sich jedoch nicht in UART-Frequenzen AFAIK auf. Wie kritisch sind diese Frequenzen? Ich plane, 115.200 Baud zu verwenden.

Kann UART innerhalb von ± 1% laufen? Wenn dies nicht funktioniert, welche Frequenz soll ich verwenden? (Ich möchte für maximale Verarbeitungsgeschwindigkeit so nahe wie möglich an 16 MIPS kommen.) Wenn es darauf ankommt, verwende ich einen PIC24FJ64GA004.

Thomas O.
quelle

Antworten:

13

Wenn Sie innerhalb von 1% sind, sollten Sie in Ordnung sein.

Angenommen, Ihr UART verwendet einen 16-fachen Oversampling-Takt. Sie können ihn beispielsweise auf 1.843.200 Hz und ein 16-faches Oversample von 115.200 Bit / s einstellen. (Überabtastung wie diese ist ziemlich häufig.) Dadurch zählt der UART 8 Übertakte von der fallenden Flanke des Startbits ab, sodass er die Mitte der Bitzellen innerhalb von +/- einer Periode nach dem Übertakt lokalisieren kann Dabei werden 16 Perioden der Übertaktung abgezählt, um zu bestimmen, wann Daten abgetastet werden sollen.

Wenn Sie davon ausgehen, dass es die Mitte des Startbits treffen kann, muss die Taktfrequenz zwischen (8-0,5) / 8 und (8 + 0,5) liegen, damit die seriellen Daten weiterhin in den richtigen Bitzellen über 8 Datenbits abgetastet werden ) / 8 oder +/- 6,25% der beabsichtigten Bitrate. Ein höheres Übertakten nähert sich der idealen Bedingung, die Mitte des Startbits zu treffen, aber 8x oder 16x sind normalerweise nahe genug, dass Sie davon ausgehen können, dass eine 5% ige Fehlanpassung funktioniert.

Sie können sich jedoch nicht darauf verlassen, dass die Frequenz auf der anderen Seite perfekt ist. Wenn Sie ein Gerät, das 4% schnell ist, mit einem Gerät verbinden, das 4% langsam ist, besteht ein Problem. Ich bin auf mindestens einen Fall gestoßen, in dem ein PC etwas langsam und ein Gerät etwas schnell lief und die beiden nur am Rande miteinander kommunizieren konnten, obwohl dasselbe Gerät für andere PCs in Ordnung war und der PC für andere in Ordnung war Geräte. (O-Scoped diese bei ca. 112kbps und 119kbps) Aus diesem Grund ist es gut zu versuchen, die Nennfrequenz so genau wie möglich zu treffen. Ich habe noch nie gesehen, dass etwas innerhalb von 2% der Nennwerte ein Problem hat.

Üblicherweise wird eine Haupttaktrate verwendet, die ein ganzzahliges Vielfaches der beabsichtigten UART-Überabtastrate multipliziert mit der Baudrate liefert. Wenn Sie beispielsweise eine CPU mit etwa 8 MHz benötigen, können Sie einen Oszillator mit 7,3728 MHz verwenden, der durch 4 geteilt werden kann, um 1,8432 MHz zu erhalten, was genau 16 mal 115200 entspricht.

JustJeff
quelle
8 MHz könnten durch 69 geteilt werden, um 115.942 zu erhalten, was deutlich innerhalb von ± 1% liegt. Ich frage mich, ob der PIC diese Art der Unterteilung für seinen Baudratengenerator unterstützt. Ich hoffe es, aber ich glaube nicht, dass es so sein wird.
Thomas O
Der PIC verfügt über einen Baudratengenerator. Es würde gut funktionieren, aber nur für niedrige Baudraten wie 9600, es würde nicht für hohe Baudraten wie 115.200 funktionieren, es wird zu ungenau.
Thomas O
Glaubst du, ich könnte einen 7,3728 MHz-Quarz verwenden? (Ich werde den internen 7,37-MHz-Oszillator nicht verwenden, weil ich Präzision haben möchte.) Dadurch kann ich durch 64 teilen, um eine UART-Frequenz von 115.200 zu erhalten. Es ist das schnellste, was ich mit einer hohen Toleranz fahren kann.
Thomas O
1
Wenn Ihr UART dies unterstützt, ist es vorzuziehen, ihm eine Übertaktung (wie 16x) zuzuweisen, damit er das Startbit überabtasten und die Mitte der Bitzelle finden kann. Es könnte jedoch eine Herausforderung sein, für 115K ein 16x innerhalb von 1% zu erhalten Sie verwenden einen Baud-Multiple-Kristall.
JustJeff
4

Die 1% @JustJeff-Erwähnungen sind nicht erforderlich. Die meisten UARTs lassen beim letzten Bit einen halben Bitfehler zu. Meistens besteht ein Frame aus 1 Startbit, 8 Datenbits und 1 Stoppbit für insgesamt 10 Bits. Ein halbes Bit auf 10 Bits ist 5% (JustJeffs 6,25% berücksichtigen nicht das Start- und Stoppbit).

stevenvh
quelle
1
zitiere mich nicht falsch; Bezüglich "1%" war meine Aussage, dass dies schwierig zu erreichen sein könnte. Bei "6.25%" wurde davon ausgegangen, dass Sie zufällig die Mitte des Startbits erreicht haben, und dies wäre der maximal zulässige Unterschied zwischen den Taktraten von Empfänger und Sender unter diesen Bedingungen.
JustJeff
1

JustJeff vergaß das Startbit, aber Stevenh fügte das Stoppbit hinzu. Unter der Annahme des gemeinsamen Protokolls von 8 Datenbits, 1 Startbit und keinem Paritätsbit (Anzahl der Stoppbits spielt keine Rolle) gibt es 8 1/2 Bitzeiten von der Vorderkante des Startbits bis zur Mitte des letztes Datenbit. Im Allgemeinen soll der Empfänger dieses letzte Bit innerhalb von 1/4 Bit abtasten. Es ist zu beachten, dass 1/2 Bit der garantierte Fehlschlagschwellenwert ist. Alles, was sich in der Nähe befindet, wird nicht mehr realisierbar, da es immer ein elektrisches Rauschen und Jitter gibt.

1/4 geteilt durch 8 1/2 = 2,94%.

Wie JustJeff bereits erwähnte, tasten die meisten UART-Implementierungen die eingehenden Daten mit einem asynchronen 16-fachen Takt ab. Dies fügt eine weitere Zeitunsicherheit von 1/16 Bit hinzu, da dies der Fehler ist, mit dem die Vorderflanke des Startbits gemessen werden kann. 1/16 Bit-Zeit von 8 1/2 Bit ist ein weiterer 0,74%. Das ergibt sich aus dem zuvor berechneten Fehlerbudget. Am Ende haben Sie eine Taktinkongruenz von 2,2%, die es dem Empfänger ermöglicht, das letzte Bit innerhalb einer Viertel-Bit-Zeit von seiner Mitte abzutasten.

Wie bereits erwähnt, ist die Verwendung eines Quarzes mit 7,3728 MHz eine gängige Praxis, wenn eine genaue Baudrate erforderlich ist. Normalerweise können Sie festlegen, dass die CPU in der Nähe ihrer Maximalrate läuft, während die UART-Baudrate innerhalb des Quarzfehlers liegt.

Olin Lathrop
quelle
Ich stimme nicht zu, dass Stoppbits keine Rolle spielen. In dieser Frage schlug die Kommunikation fehl, weil das Stoppbit fälschlicherweise auf einen niedrigen Pegel gesetzt wurde.
Stevenvh
Das Stoppbit muss vorhanden sein, damit die gesamte Kommunikation funktioniert, es geht jedoch bei den meisten UARTs nicht in die Fehlerbudgetberechnung ein. UARTs benötigen nach dem letzten Datenbit eine gewisse Mindestzeit, bevor die nächste Vorderflanke des nächsten Startbits erreicht wird. Dafür ist die Stopp-Bit-Zeit da. Wenn diese Zeit nicht eingehalten wird, wird ein "Framing Error" angezeigt. Vielleicht wird das wie ein Datenbit abgetastet, aber ich kenne Fälle, in denen es anders gehandhabt wurde. Die alten Teletypen benötigten 2 Stoppbits, um dem mechanischen Mechanismus Zeit zu geben, um bereit zu sein, das nächste Zeichen zu erfassen.
Olin Lathrop
Ich habe mich dreimal auf das Startbit bezogen, nicht wahr?
JustJeff
@OlinLathrop: Der Stop - Bit ist erforderlich , um sicherzustellen , dass , wenn ein Byte , deren MSB Senden Null wird es sein , für die nächste Startbit eine fallende Flanke. Verschiedene Geräte verhalten sich in Fällen, in denen die Datenleitung zu niedrig wird, anders, aber wenn es kein Stoppbit gäbe, würde eine übertragene Folge von Null-Bytes keine nützlichen Zeitinformationen enthalten. Eine solche Anforderung könnte auf andere Weise mit einem festen Rahmenaufwand von weniger als 25% erfüllt werden, aber mir ist nicht bekannt, dass jemand dies tut.
Supercat
1

Ein noch nicht erwähnter Punkt ist, dass einige Geräte für jedes von ihnen empfangene Datenbyte ein Datenbyte senden. Wenn einem solchen Gerät kontinuierlich Daten zugeführt werden, ist seine Baudrate sogar um 0,1% langsamer als die des sendenden Geräts, und es kann keine leicht geschrumpften Stoppbits gesendet werden, und seine Ausgabe fällt alle 1000 aufeinanderfolgenden Bytes um ein Byte zurück Eingehende Bytes. Wenn das Gerät auf 16 Byte Pufferung beschränkt ist, werden nach ca. 16.000 Datenbytes und danach ca. 1 Byte pro Tausend Datenbytes gelöscht. Es ist erwähnenswert, dass sogenannte "1200-Baud" -Modems tatsächlich mit einer Rate von etwas mehr als 1200 Bit / Sekunde (ich denke, es sind ungefähr 1202) arbeiten, und zwar aus genau diesem Grund (so dass der Sender sogar 0,15% schneller ist, als er sollte) Sein,

Superkatze
quelle