stellt euch eine UART-Übertragung zwischen zwei Mikrocontrollern (z.B. STM32) vor, bei der wegen Kapazitäten die Signalflanken stark verschliffen sind, die Pegel high und low aber noch OK sind.
Wann sampelt der Receiver? Gibt es da einen Standard oder Quasi-Norm, zu welchem Zeitpunkt das jeweilige Bit gültig sein muss?
Da es ja keine Clock-Leitung gibt, müssen die Sampling-Zeitpunkte ja zwangsweise aus den "unschön aussehenden" Bits gewonnen werden. Wie läuft das ab?
Hintergrund ist, ich möchte generell nachvollziehen, was die kritischsten Einflüsse für UART-Kommunikation sind.
stellt euch eine UART-Übertragung zwischen zwei Mikrocontrollern (z.B.
STM32) vor, bei der wegen Kapazitäten die Signalflanken stark
verschliffen sind,
Warum? Wieviel m Kabel willst du denn mit wieviel Baud befeuern?
Zeig mal einen gescheiten Screenshot.
die Pegel high und low aber noch OK sind.
Wann sampelt der Receiver?
Meistens in der Mitte, ggf. auch dreimal und dann eine Mehrheitsentscheidung. Aber "Mitte" heißt auch, in Bezug auf die Schaltschwellen des Empfängers! Denn dort fängt der intern an zu zählen!
Da es ja keine Clock-Leitung gibt, müssen die Sampling-Zeitpunkte ja
zwangsweise aus den "unschön aussehenden" Bits gewonnen werden. Wie
läuft das ab?
Die fallende Flane des Start-Bits ist er Startzeitpunkt für das GESAMTE Byte + Stop Bit. Dort wird dann mit x8 oder meist eher x16 fachem Takt abgetastet und entschieden.
Hintergrund ist, ich möchte generell nachvollziehen, was die
kritischsten Einflüsse für UART-Kommunikation sind.
Meistens in der Mitte, ggf. auch dreimal und dann eine
Mehrheitsentscheidung. Aber "Mitte" heißt auch, in Bezug auf die
Schaltschwellen des Empfängers! Denn dort fängt der intern an zu zählen!
Oder auch in Bezug auf einen internen Referenztakt, der zum Ende des Bytes schon ordentlich zum Signal hin verschoben sein kann.
Genaueres dazu sollte, wie eigentlich immer, im Datenblatt des verwendeten Devices stehen.
Wann sampelt der Receiver? Gibt es da einen Standard oder Quasi-Norm, zu
welchem Zeitpunkt das jeweilige Bit gültig sein muss?
Datenblatt/Manual lesen. Gute Receiver samplen in der Mitte des Bits, d.h. wo der Pegel am stabilsten sein sollte. Hat aber auch was mit möglichen Differenzen in der Baudrate zu tun, insbesondere wenn man keine Quarz Taktquelle nutzt.
Genaueres musst Du im Handbuch nachlesen, denn das kann u.U. auch von den konkreten Einstellungen am Uart Peripherial abhängen. Manche µC unterstützen verschiedene Oversamplings.
Meistens in der Mitte, ggf. auch dreimal und dann eine
Mehrheitsentscheidung. Aber "Mitte" heißt auch, in Bezug auf die
Schaltschwellen des Empfängers! Denn dort fängt der intern an zu zählen!
Oder auch in Bezug auf einen internen Referenztakt, der zum Ende des
Bytes schon ordentlich zum Signal hin verschoben sein kann.
Nö. Wenn er das ist, ist die Baudrate im Sender oder Empfänger falsch eingestellt. Im Normalfall sollte der Frequenzfehler <1% sein.
Falsch.
Die STEIGENDE Flanke des Startbits ist der Startzeitpunkt.
Hmmm, die fallende Flanke - also der Beginn des Startbits - ist garantiert immer vorhanden.
Eine steigende Flanke hingegen ist optional und nur gewährleistet wenn das erste Datenbit (LSB) ›1‹ ist.
Falsch.
Die STEIGENDE Flanke des Startbits ist der Startzeitpunkt.
Hmmm, die fallende Flanke - also der Beginn des Startbits - ist
garantiert immer vorhanden.
Eine steigende Flanke hingegen ist optional und nur gewährleistet wenn
das erste Datenbit (LSB) ›1‹ ist.
Jein, kommt immer drauf an, ob man vor oder nach dem Levelshifter misst, da der Levelshifter invertiert. Kann also fallend oder steigend sein, je nach Messort.
Gute Receiver samplen in der Mitte des Bits,
d.h. wo der Pegel am stabilsten sein sollte.
Schreibst du einem übertragenen Datenbit prophetische Fähigkeiten zu?
Woher soll der Pegel im Voraus wissen, wann das Bit zu Ende ist und möglicherweise instabil werden?
Der Grund für eine Abtastung in der Mitte ist bestmögliche Resistenz gegen Abweichungen der Symbolrate zwischen Sender- und Empfänger-UART.
Wir reden hier von hw-programmierten Serial Interfaces von µCs.
Dort wird die 8- (high-speed), oder 16-fache Datenrate (Baudrate) vorgegeben, dazu die Bitzahl pro Byte, Parity, Anzahl der Stoppbits etc.
Nach der -wie auch immer verschliffenen- Anfangsflanke des Startbits wird
jedes rechnerisch mögliche Byte per Abtastung zur Bit-Mitte und Mitte+/-1 Takt erfasst. Der Bit-Wert wird mit 2-aus-3-Auswertung ermittelt.
Die Abtastrate sollte besser 2% zur Baudrate passen. Bei 8N1 ist dann die Mitte des Stoppbits noch auf <20% genau. Der Vorteil von 16-facher Abtastung gegenüber 8-facher Abtastung ist ein Messwert, sonst eher gering.
Bei halbwegs linearem Tiefpassverhalten des Übertragungsweges sollten die Abtastfehler bis zu Fg >> Fbps auch nicht zu groß werden.
Richtig gefährlich kann eine DC-Unterdrückung werden. (Ein Kondensator im Daten-Pfad).
Folgen viele gleiche Bits aufeinander, verschiebt sich der mittlere Pegel und damit auch der Referenz-Zeitpunkt der erkannten Anfangsflanke des Startbits. Dagegen helfen nur Codes, die bei etwas erhöhter Datenrate zu mehr Pegelwechseln und damit geringer Verschiebung des mittleren Pegels führen.
Kostet etwas mehr Kodier- / Dekodier-Aufwand, ist aber kein Hexenwerk.
Umsonst gibt es nun mal nichts...
Nach der Anfangsflanke des Startbits wird
jedes rechnerisch mögliche Byte per Abtastung zur Bit-Mitte und
Mitte+/-1 Takt erfasst. Der Bit-Wert wird mit 2-aus-3-Auswertung
ermittelt.
Es gibt sehr viele Implementierungen, die einfach nur den Pegel sn der Bitmitte einlesen.
Richtig gefährlich kann eine DC-Unterdrückung werden
Normale asynchrone serielle Schnittstellen, die eine RS232 Codierung verwenden, sind nicht gleichspannungsfrei und können dedhalb nicht einfach über Kondensatoren oder Trafos galvanisch getrennt werden.
Wenn man sowas braucht, dann muss z.B. eine NRZ Codierung verwendet verwendet werden. Dort steckt die Information nicht im Pegel, sondern im Zeitpunkt der Pegelwechsel/Flanken.
Soweit die normierte Theorie.
Bei allen meinen PCs und USB-Schnittstellenwandlern reicht aber statt der geforderten min. -3V ein Ruhepegel (logisch '1') von 0V und ein Aktivpegel ('0') von 3V.
Die Antwort habe ich auch geschrieben: implemetierungsabhängig.
Lothar, damit wollte ich zum Ausdruck bringen das dieser Vorgang im µC stattfindet. Die Anzahl Microconcoller welche an einem UART Eingangspin -15V … +15V erwarten geht zumindest meiner Erfahrung nach asymptotisch gegen NULL.
Daher ist es völlig irrelevant wie die physikalische Schnittstelle irgendwo in der Wildnis aussieht, der Microconcoller sieht die pegelangepasste Spannung. Und die ist nun mal Ruhe '1', Aktiv '0'.
Somit ist auch der irgendwo vorgebrachte Einwand mit den positiven und negativen Flanken des Startbits bei RS232 vs. µC völlig irrelevant.
Aber wenn wir uns dann schon über diese externen Schnittstellen unterhalten, dann sollten wir über die relevanten Pegel und nicht unser Bauchgefühl, die erlebte Wirklichkeit oder sonst etwas unterhalten. Jeder hat schon mal Dinge gesehen, oder von Dingen gehört, die außerhalb der Spezifikation funktionieren. Das ändert nichts an der selbigen.
Die Antwort habe ich auch geschrieben: implemetierungsabhängig.
Lothar, damit wollte ich zum Ausdruck bringen das dieser Vorgang im µC
stattfindet. Die Anzahl Microconcoller welche an einem UART Eingangspin
-15V … +15V erwarten geht zumindest meiner Erfahrung nach asymptotisch
gegen NULL.
Daher ist es völlig irrelevant wie die physikalische Schnittstelle
irgendwo in der Wildnis aussieht, der Microconcoller sieht die
pegelangepasste Spannung. Und die ist nun mal Ruhe '1', Aktiv '0'.
Man tut gut daran, hier strikt zwischen Negativ- und Positiv-Logik zu unterscheiden, und Begriffe wie "log. 1" und "log. 0" nicht mit 'Pegel-Angaben' wie "H/high" und "L/low" zu vermischen.
RS-232 ist eine Spannungsschnittstelle. Für die Datenleitungen (TxD und RxD) wird negative Logik verwendet, wobei eine Spannung zwischen −3V und −15V (also "low") eine "log. 1" und eine Spannung zwischen +3V und +15V (also "high") eine "log. 0" darstellt.
Als physikalische Schnittstelle am UART/uC verwendet positive Logik: klassisch TTL-Pegel mit Spannungen zwischen 2V und 5V ("high") entsprechen einer "log. 1", Spannungen zwischen 0V und 0.8V ("low") entsprechen einer "log. 0".
Startcondition:
Die inaktive Datenleitung (idle, verlängertes Stopbit) liegt auf "log. 1", wechselt dann auf "log. 0" (Startbit) - entsprechend einer "1->0"-Flanke. Physikalisch entspricht dies auf RS232-Ebene einer "L->H"-Flanke, auf TTL-Ebene aber einer "H->L"-Flanke.
Man tut gut daran, hier strikt zwischen Negativ- und Positiv-Logik zu
unterscheiden, und Begriffe wie "log. 1" und "log. 0" nicht mit
'Pegel-Angaben' wie "H/high" und "L/low" zu vermischen.
Joe, wir reden hier eindeutig von dem, was ein Mikrocontroller an seinem Eingangspin "sieht" und an seinem Ausgangspin liefert.
Da braucht es keine Deutungshoheit.
Da braucht es keine Positiv/Negativ-Logik.
Wenn der Pegel tendenziell eher an der positiven Versorgungsspannung liegt, ist das nun einmal der UART-Ruhepegel. Wenn man das allen Erstes als ›0‹ ansehen möchte, ja dann…
Man kann aber - wie hier in diesem Thread mal wieder unschwer zu erkennen ist - gerne alle möglichen Probleme herbei reden und diesen Zombie künstlich am Leben erhalten.
Datenblatt/Manual lesen. Gute Receiver samplen in der Mitte des Bits,
d.h. wo der Pegel am stabilsten sein sollte.
Ihr muesst noch daruber diskutieren wo denn die Mitte ist, also
worauf ein Controller genau synchronisiert. Vermutlich eher nicht auf
die Flanke sondern mit dem Takt einsynchronisiert.
Und bei verschliffenen Flanken (siehe Subject) auch noch an welcher
Stelle er High/Low bei welcher Temperatur unterscheidet.
Und dann gibt es noch bizarre Sonderfaelle. Silabs hat teilweise
Usart mit einem fractionalen Teiler fuer Taktfrequenzen aus denen
sich uebliche Baudraten nicht ohne Rundungsfehler ableiten lassen.
Dann ist ein Bit etwas kuerzer wie das benachbarte damit in
Summe die Baudrate wieder stimmt.
Datenblatt/Manual lesen. Gute Receiver samplen in der Mitte des Bits,
d.h. wo der Pegel am stabilsten sein sollte. Hat aber auch was mit
möglichen Differenzen in der Baudrate zu tun, insbesondere wenn man
keine Quarz Taktquelle nutzt.
Nur gibt es keine Mitte des Bits. Wo soll die Mitte sein ? Das Ganze nennt sich asynchron. Es wird 4, 8 oder 16 fach gesampelt. Die Funktionalitaet beginnt, wenn die Mehrheit der Samples zu einem Zustand (0/1) passt. Fuer ein Byte muessen also Startbit, Stopbit, und die Bitmehrheiten passen, sonst ist nichts.
Nur gibt es keine Mitte des Bits. Wo soll die Mitte sein ?
Nun will ich mich hier nicht all zu weit aus dem Fenster lehnen, aber bei gegebener Baud-Rate würde ich die Möglichkeit der Bestimmung der Bitbreite ab negativer Flanke auch nicht kategorisch ausschließen wollen.
Es ist - zugegebenermaßen - mathematisch recht anspruchsvoll, doch wurde mir gelegentlich zugetragen, das eine solche Berechnung von Erfolg gekrönt sein soll.