Forum: Mikrocontroller und Digitale Elektronik PIC UART Rx im 7Bit-Modus?


von heinzhorst (Gast)


Lesenswert?

Hallo!

Weiß jemand, wie man mit dem UART im 7-Bit Modus empfangen kann? 1 
Startbit, 7 Datenbits, 1 Stopbit, kein Paritätsbit, 9600 Baud. 
Controller ist ein PIC32MX795F512L (PIC32 Ethernet Starter Kit). Brauche 
nur den Rx-Modus. Der UART des angeschlossenen Gerätes kann nicht 
verändert werden. Hoffe, dass ich den UART nicht in Software machen 
muss.

von Chris (Gast)


Lesenswert?

Der kann das nicht laut Datenblatt. Würde es dennoch testen.
Der Knackpunkt ist folgender: Zwischen einem Frame und dem Nächsten ist
normalerweise 1.5 Bittime Pause, eigentlich 0.5 wenn man das Stop-Bit 
nicht
mitzählt. Wenn der Sender nun das nächste Frame zu schnell raussendet,
dann könnte der Pic einen Framing Error signalisieren.
Dem könntest du auch eventuell Abhilfe schaffen, wenn du das 
Timing(Baudrate)
etwas erhöhst, eventuell einen krummen Quarz oder PLL Einstellung.

Prinzipiell müsste es machbar sein, das mit dem Hw-UART zu machen und
die Daten mit 8Bit zu Empfangen.

von Reinhard Kern (Gast)


Lesenswert?

Chris schrieb:
> Der kann das nicht laut Datenblatt. Würde es dennoch testen.
> Der Knackpunkt ist folgender: Zwischen einem Frame und dem Nächsten ist
> normalerweise 1.5 Bittime Pause...

Nein, wenn die Angaben stimmen nur 1 Stopbit. Dann nimmt der Empfänger 
das Stopbit als 8 Datenbit (wäre kein Problem), findet anschliessend 
aber statt des Stopbits das nächste Startbit und meldet einen Framing 
Error. Auch das wäre noch nicht schlimm, aber das nächste Zeichen 
startet schon fehlerhaft, weil das Startbit überlesen wurde, wo der 
Empfänger dann mit dem nächsten Zeichen beginnt ist ziemlich zufällig.

Es könnte nur funktionieren, wenn der Sender mit 2 Stopbits arbeiten 
würde.

Gruss Reinhard

von chris (Gast)


Lesenswert?

Zwischen zwei Byte wird minimal ein halbes Bit abgewartet, bis das 
naechste gesendet wird. Wei da auch noch FIFO drin sind, muss man die 
Frequenz erhoehen, entweder mit Einstellungen der Register, oder der 
Verwendung einer anderen PLL Frequenz oder eines leicht schnelleren 
Quarzes. Worst case. Angenommemn 9600bps oder 104uS dann wuerde byte 7 
bei 824uS starten und bei 828uS enden mit einer Toleranz von 4uS.
Bei 10 bit (S+8+S) waeren das 83uS oder 12000bps, dann muesste eine 
Einstellung nahe 10700bps funktionieren ohne irgendwelche Probleme zu 
machen, gehe nicht weiter auf die Register sowie der Validierung des 
Zeitrahmens ein da es nur ein fiktives Beispiel ist sowie keine weiteren 
infos Vorliegen.

von heinzhorst (Gast)


Lesenswert?

Problem gelöst. Hab einfach das MSB abgeschnitten mit

1
data_array[data_index] &= 0b01111111;

Die empfangenen Bytes werden von meinem Programm in ein Array 
geschrieben. Hab dann mal mit dem Debugger den Inhalt des Arrays 
angesehen und mit den Daten verglichen, die ich mit PC und 
Terminalprogramm mit der Einstellung 7N1 von dem angeschlossenen Gerät 
empfange. Daten sind identisch. Trotzdem: Danke für Eure schnellen 
Lösungsvorschläge!

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.