Forum: Mikrocontroller und Digitale Elektronik Pic 16f und USART Empfang mit zwei Stoppbits


von Kai (Gast)


Lesenswert?

Hallo zusammen,

Ich grüble gerade über ein Problem mit dem pic16f887. Da die Pic16 
Familie ja nicht "von Natur aus" in der Lage ist eine Übertragung mit 2 
Stoppbits zu empfangen suche ich gerade nach einer Alternative: (es geht 
nebenbei um den Empfang des unidirektionalen DMX-Protokolls) Gehe ich 
richtig in der Annahme, dass ich den Empfang auf 9 Bit konfigurieren 
kann, Bit 9 ignoriere und nur das letzte Stoppbit auswerte? Alle 
bisherigen Versuche sind Fehlgeschlagen... ;) Oder fällt jemandem eine 
andere Lösung ein?

Gruß Kai

von S. Landolt (Gast)


Lesenswert?

Ich kenne die Pics nicht, aber die können doch sicher 8N1 - und damit 
muss der Empfang klappen.

von Max H. (hartl192)


Lesenswert?

Ich würde sagen, dass es dem Empfänger egal ist, ob er ein zweites Stopp 
bit bekommt. Das ist ja nur das Gleiche wie eine längere Pause zwischen 
den Frames.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Kai schrieb:
> Da die Pic16
> Familie ja nicht "von Natur aus" in der Lage ist eine Übertragung mit 2
> Stoppbits

Natürlich können sie das. Einem Empfänger ist es egal, wieviele 
Stoppbits nach dem ersten kommen, es können auch hundert sein. Stoppbits 
sind ja nichts anderes als kein Signal auf der Leitung.

MfG Klaus

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Kai schrieb:
> Familie ja nicht "von Natur aus" in der Lage ist eine Übertragung mit 2
> Stoppbits zu empfangen suche ich gerade nach einer Alternative: (es geht
> nebenbei um den Empfang des unidirektionalen DMX-Protokolls) Gehe ich

 Meistens geht es bei 2 Stoppbits nur darum, dass der Sender/Empfänger
 mehr Zeit braucht, um die empfangenen bzw. zu sendenden Bytes zu
 verarbeiten. Das zweite Stoppbit wird bei Soft-Uart in 99% der Fälle
 gar nicht geprüft bzw. gesendet - ist ja sowieso gleich Idle.
 Also, wenn du unbedingt Empfang mit 2 Stoppbits haben willst - eine
 bitzeit nach dem Senden warten - und schon hast du 2 Stoppbits.

von lrep (Gast)


Lesenswert?

Kai schrieb:
> Gehe ich
> richtig in der Annahme, dass ich den Empfang auf 9 Bit konfigurieren
> kann, Bit 9 ignoriere und nur das letzte Stoppbit auswerte?

Du brauchst es gar nicht auszuwerten. Ich kenne zwar das DMX-Protokoll 
nicht, aber da du von 9 Bits schreibst, denke ich dass es sich um 8 
Datenbits plus Paritätsbit handelt.

Das Paritätsbit bekommt der Anwender normalerweise gar nicht zu Gesicht, 
sondern es wird von Sende-Maschinerie erzeugt und von der 
Empfangsmaschinerie lediglich auf Richtigkeit überprüft.
Diese Maschinerien bestehen meist aus recht einfacher Hardware, aber da 
sie aus nicht viel mehr als einem Zähler und einem Schieberegister 
bestehen, kann man sie auch leicht in Software implementieren.

Beim Empfang eines Zeichens spielt sich etwa folgendes ab:
Am Anfang ruht die Leitung, das entspricht einer logischen 1.
Zu irgend einem x-beliebigen Zeitpunkt fängt der Sender an zu senden, 
und das kündigt er an, indem er das Startbit, eine logische 0 sendet.
Dieser Übergang 1-->0 wird vom Empfänger erkannt und nun wartet er 1,5 
Bitzeiten bis er die Leitung wieder testet und das Ergebnis als erstes 
Datenbit in das Empfangsregister schiebt.

1,5 Bitzeiten weil dann die Abtastung in der Mitte des ersten Datenbits 
erfolgt.  Wie lange eine Bitzeit dauert, hat der Pogrammierer der 
Maschine bei der Initialisierung, z.B. 2400, 4800, 9600 etc., 
mitgeteilt.

Danach tastet der Empfänger noch 7 Mal im Abstand von einer Bitzeit ab 
und schiebt so die übrigen 7 Datenbits in das Ergebnisregister.

Wenn man den Sender (und hoffentlich auch dem Empfänger) bei der 
Initialisierung mittels der Angabe "PE" ode "PO" angewiesen hat das 
Paritybit zu erzeugen (und zu prüfen), wird anschliessend noch die 
Quersumme der Einsen im Datenwort ermittelt und als 1 oder 0 übertragen, 
und das wird beim Empfänger mit der dort ermittelten Quersumme des 
Datenbytes verglichen.

Das ist dein 9-tes Bit, das du normalerweise aber nicht zu sehen 
bekommst.
Mit dieser "Prüfsumme" kann  man erkennen, ob die Übertragung gestört 
wurde, und falls das der Fall ist, wird in einem Statusregister ein 
"Parity-Error" signalisiert.

Nach dem all diese Bits im Kasten sind, wartet der Empfänger noch eine 
weitere Bitzeit, weil dann wieder der Ruhezustand auf der Leitung 
herrschen  muss.
Der Sender sendet dazu mindestens ein Stopbit, bevor er das nächste 
Startbit schickt, oder er hört einfach mit der Sendung auf.

Erst jetzt signalisiert die Empfangsmaschinerie dem Programm, dass ein 
Datenbyte zum Abholen bereit steht.

Das auswertende Programm sollte sich nun aber zuerst das Statusregister 
ansehen, ob dort ein "Parity Error" (Zahl der Einsen stimmt nicht) oder 
ein "Framing Error" angezeigt wird, denn dann besteht das Datenbyte 
wahrscheinlich nur aus Müll.
Abholen muss man es meist trotzdem.
Zu dem "Framing Error" kommt es, wenn kein Stopbit zur erwarteten Zeit 
auf der Leitung ist.
Das kann passieren, wenn man den Empfänger im eine bereits laufende 
Übertragung einschaltet, da er ja ein Startbit nicht von einer regulären 
0 zu unterscheiden vermag.
Normalerweise synchronisiert sich der Empfänger bald von selbst, aber 
man kann das beschleunigen, indem man mit 2 Stoppbits anstatt nur einem 
arbeitet.
Der Empfänger braucht davon nichts zu wissen, er wartet immer nur auf 
das erste Stopbit.
Der Preis für 2 Stopbits ist eine insgesamt etwas geringere 
Übertragungsgeschwindigkeit.

Hier steht das Ganze noch mal in Farbe. Und bunt ;-)
https://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter

von spontan (Gast)


Lesenswert?

>Ich grüble gerade über ein Problem mit dem pic16f887.

Grüble über deine Software, da hackt es.

>Gehe ich richtig in der Annahme, dass ich den Empfang auf 9 Bit
>konfigurieren kann, Bit 9 ignoriere und nur das letzte Stoppbit auswerte?

Nein, falsche Annahme.

Und was willst du mit "letzte Stoppbit auswerte?". Was willst du da 
machen?

Beschreib doch mal die Fehler, die auftreten. Darüber hast du noch 
nichts gesagt.

von Frank K. (fchk)


Lesenswert?

Kai schrieb:
> Hallo zusammen,
>
> Ich grüble gerade über ein Problem mit dem pic16f887. Da die Pic16
> Familie ja nicht "von Natur aus" in der Lage ist eine Übertragung mit 2
> Stoppbits zu empfangen suche ich gerade nach einer Alternative: (es geht
> nebenbei um den Empfang des unidirektionalen DMX-Protokolls) Gehe ich
> richtig in der Annahme, dass ich den Empfang auf 9 Bit konfigurieren
> kann, Bit 9 ignoriere und nur das letzte Stoppbit auswerte? Alle
> bisherigen Versuche sind Fehlgeschlagen... ;) Oder fällt jemandem eine
> andere Lösung ein?

Nimm doch einen moderneren PIC. PIC24 und PIC32 lassen sich problemlos 
auf 2 Stopbits einstellen.

fchk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.