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
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
Verwendest du einen Sende-Buffer? Das von dir beschriebene Verhalten passt ganz gut zu nem Buffer-Überlauf oder sowas.
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
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.