Ich werde einen 8-MHz-Quarz verwenden, um meinen Mikrocontroller mit 16 MIPS (PLL 4x, 2-Zyklus-Anweisungen) zu betreiben. 8 MHz teilen sich jedoch nicht in irgendwelche UART-Frequenzen AFAIK ... also wie kritisch sind diese Frequenzen? Ich plane, 115.200 Baud zu verwenden.
Kann UART innerhalb von ±1 % ausgeführt werden? Wenn dies nicht funktioniert, welche Frequenz sollte ich verwenden? (Ich möchte für maximale Verarbeitungsgeschwindigkeit so nah wie möglich an 16 MIPS herankommen.) Wenn es darauf ankommt, verwende ich einen PIC24FJ64GA004.
Wenn Sie innerhalb von 1 % liegen, sollten Sie in Ordnung sein.
Angenommen, Ihr UART verwendet beispielsweise einen 16-fachen Oversampling-Takt, Sie können ihn auf 1.843.200 Hz auf 16-faches Oversampling von 115.200 bps einstellen. (Oversampling wie dieses ist ziemlich üblich) Dadurch kann der UART 8 Übertaktungen von der fallenden Flanke des Startbits abzählen, sodass er die Mitte der Bitzellen innerhalb von +/- einer Periode der Übertaktung danach lokalisieren kann die es 16 Perioden der Übertaktung abzä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) bleiben, um serielle Daten in den richtigen Bitzellen über 8 Datenbits abzutasten )/8 oder +/-6,25 % der beabsichtigten Bitrate. Eine höhere Übertaktung nähert sich der idealen Bedingung, die Mitte des Startbits zu treffen, aber 8x oder 16x ist normalerweise nah genug, dass Sie davon ausgehen können, dass eine Abweichung von 5 % funktioniert.
Sie können sich jedoch nicht darauf verlassen, dass die andere Seite perfekt auf Frequenz eingestellt ist. Wenn Sie ein 4 % schnelles Gerät mit einem 4 % langsamen Gerät verbinden, treten Probleme auf. 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 geringfügig kommunizieren konnten, obwohl dasselbe Gerät mit anderen PCs in Ordnung war und der PC mit anderen in Ordnung war Geräte. (O-scoped diese bei etwa 112kbps und 119kbps) Aus diesem Grund ist es gut zu versuchen, die Nennfrequenz so genau wie möglich zu erreichen. Ich habe noch nie gesehen, dass etwas innerhalb von 2% des Nennwerts ein Problem hat.
Üblicherweise wird eine Haupttaktrate verwendet, die ein ganzzahliges Vielfaches der beabsichtigten UART-Oversampling-Rate multipliziert mit der Baudrate bietet. Wenn Sie beispielsweise eine CPU mit etwa 8 MHz haben möchten, können Sie einen 7,3728-MHz-Oszillator verwenden, der durch 4 geteilt werden kann, um 1,8432 MHz zu erhalten, was genau 16 mal 115200 ist.
Die 1 % @JustJeff-Erwähnung ist nicht erforderlich. Die meisten UARTs erlauben einen halben Bitfehler beim letzten Bit. Meistens besteht ein Frame aus 1 Startbit, 8 Datenbits und 1 Stoppbit, also insgesamt 10 Bits. Ein halbes Bit auf 10 Bits sind 5 % (JustJeffs 6,25 % berücksichtigen nicht das Start- und Stoppbit).
Ein noch nicht erwähnter Punkt ist, dass einige Geräte erwarten, dass sie für jedes empfangene Datenbyte ein Datenbyte übertragen. Wenn ein solches Gerät kontinuierlich mit Daten versorgt wird, seine Baudrate sogar 0,1% langsamer ist als die des sendenden Geräts und es keine Möglichkeit hat, leicht geschrumpfte Stoppbits zu senden, wird sein Ausgang für alle 1000 aufeinanderfolgenden Bytes zurückfallen Byte, die hereinkommen. Wenn das Gerät auf 16 Byte Pufferung beschränkt ist, wird es ein Datenbyte löschen, nachdem es ungefähr 16.000 passiert hat, und danach ungefähr ein Byte pro Tausend. Es ist erwähnenswert, dass sogenannte "1200-Baud" -Modems aus genau diesem Grund tatsächlich mit einer Rate von etwas mehr als 1200 Bit / Sekunde (ich denke, es sind ungefähr 1202) arbeiten (selbst wenn der Sender 0,15% schneller ist als er sollte sein, das Modem leitet trotzdem alle Daten durch).
JustJeff hat das Startbit vergessen, aber Stevenh hat das Stoppbit hinzugefügt. 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 führenden Flanke des Startbits bis zur Mitte des letztes Datenbit. Im Allgemeinen möchten Sie, dass der Empfänger dieses letzte Bit innerhalb von 1/4 Bitzeit abtastet. Beachten Sie, dass 1/2 Bit der garantierte Fehlerschwellenwert ist. Alles in der Nähe wird unzuverlässig, da es immer elektrisches Rauschen und Jitter gibt.
1/4 dividiert durch 8 1/2 = 2,94 %.
Wie JustJeff erwähnte, tasten die meisten UART-Implementierungen die eingehenden Daten tatsächlich mit einem asynchronen 16x-Takt ab. Das fügt eine weitere 1/16-Bitzeitunsicherheit hinzu, da dies der Fehler ist, mit dem die Vorderflanke des Startbits gemessen werden kann. 1/16 Bitzeit von 8 1/2 Bits sind weitere 0,74 %. Das ergibt sich aus dem zuvor berechneten Fehlerbudget. Am Ende haben Sie eine zulässige Taktabweichung von 2,2%, damit der Empfänger das letzte Bit innerhalb von 1/4 Bitzeit von seiner Mitte abtasten kann.
Wie andere gesagt haben, ist die Verwendung eines 7,3728-MHz-Quarzes eine gängige Praxis, wenn eine genaue Baudrate erforderlich ist. Normalerweise können Sie dafür sorgen, dass die CPU nahe ihrer maximalen Rate läuft, während Sie die UART-Baudrate innerhalb des Kristallfehlers erreichen.
Thomas o
Thomas o
Thomas o
Nur Jeff