Forum: Mikrocontroller und Digitale Elektronik UART-Problem.. Durcheinander nach 20 Zeichen


von Tobias Hagemeier (Gast)


Angehängte Dateien:

Lesenswert?

Hi!
Ich habe ein kleines Problem mit einem P89C51RD2. Das Ding ist extern
mit 18.432mHz getaktet um gewöhnliche Baudraten vernünftig timen zu
können.
Ich verwende für die UART-Kommunikation Timer 1 im Auto-Reload-Modus
mit folgenden Werten:
RCAP2L = 0xC4;
RCAP2H = 0xFF;
Das ganze habe ich mit der Formel 65536 - (OszFreq / 32 * BaudRate)
berechnet (der µC läuft im 12-Takt-Modus). Übertragungsrate sollte 9600
Baud sein, ich habe allerdings auch schonmal mit 2400 getestet was das
gleiche Ergebnis bringt. Der Bootloader schafft bis zu 28800 Baud,
daran sollte es also nicht liegen..

Problem ist nun folgendes: Wenn ich einzelne Zeichen übertrage passt
alles wunderbar. Sobald ich aber "Volllast" fahre und schnell Daten
hin- und her schiebe bekomme ich nach einiger Zeit Datenmüll bzw
überhaupt keine Zeichen mehr übertragen. Die komplette Initialisierung
der UART-Schnittstelle hänge ich mal an.

Hat vielleicht jemand eine Idee was hier nicht stimmt? Oder hat sich
bei der Berechnung der Reload-Werte ein Fehler eingeschlichen?

Ich freu mich über jede Antwort..

- Tobi

von Tobias Hagemeier (Gast)


Lesenswert?

Nachtrag: Könnte es an meinem USB to COM-Adapter liegen der kein
sauberes Signal produziert? Wieso würde dann der Upload des Hex-Files
funktionieren?

- Tobi

von ape (Gast)


Lesenswert?

Verwendest du einen Sende-Buffer?
Das von dir beschriebene Verhalten passt ganz gut zu nem
Buffer-Überlauf oder sowas.

von Tobias Hagemeier (Gast)


Lesenswert?

Ja, ich arbeite mit einem Buffer, mit einem selbst programmierten. Aber
selbst wenn ich die Zeichen direkt wieder per UART zurück schicke (was
ja aufgrund der in beide Richtungen gleichen Sendegeschwindigkeit super
passen sollte) treten die Fehler auf. Außerdem treten die Fehler in
beide Richtungen auf..
Da meine erste Vermutung auch der Buffer war, hatte ich den auch
schonmal umgeschrieben und eine andere Methode benutzt. Da treten aber
genau die gleichen Probleme immer noch auf...

- Tobi

von ape (Gast)


Lesenswert?

Naja diese Buffergeschichten sind immer komplizierter als man denkt, ich
hab mir bei meinem UART-Buffer bald die Ohren gebrochen bis er richtiug
funktioniert hat. Wichtig ist immer schön die Interrupts abzuschalten
wenn man ein Zeichen hizufügt oder rausnimmt.
Ansonsten probier doch testweise erstmal komplett ohne Buffer und warte
bei jedem zu sendenden Zeichen bis das vorige vollständig gesendet ist.
Wenn das Problem dann nicht mehr auftritt ist es auf jeden Fall dein
Buffer :)

von Tobias Hagemeier (Gast)


Lesenswert?

Hi!
Ich habe jetzt mal den Buffer komplett als Fehlerquelle ausgeschlossen
und sende alles was ich empfange direkt zurück an den PC. Wenn ich
jetzt nur 0xAA-Bytes (entspricht Bitfolge 10101010) sende, bekomme ich
diese auch zurück. Allerdings ist dazwischen immer mal wieder 11110101
für sich alleine oder mit nachfolgendem 10101011 oder 11010101. Danach
empfängt er die Zeichen wieder ganz normal. Wenn ich vom Microprozessor
aus selbstständig Texte verschicke, kommen diese sauber und ohne
jegliche Probleme an. Der Fehler passiert also auf dem Weg vom PC zum
µC. Die Overflow-Rate des Timers kann ich +-4 verändern ohne das
Zeichenwirrwar übertragen wird, ich bin also mit der Übertragungsrate
exakt auf den 9600 Baud.

Ich habe den Verdacht, das über den USB-Adapter wirklich kein sauberes
12V-Signal ankommt, da der µC offensichtlich das Startbit zu früh
erkennt (da wo eigentlich noch durchgehend ein HIGH-Pegel anliegen
sollte) und dadurch diese Verschiebungen auftreten.
Was mich dann aber wundert ist, das der Bootloader das korrekte
Programm empfängt.. oder ist das zum Austausch der Daten verwendete
Protokoll so sicher das diese Fehler (die im Durchschnitt alle 6-7
Zeichen auftreten) ausgebügelt werden??

- Tobi

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.