Hi zusammen, ich bräuchte mal eure Hilfe. Ich habe eine UART-ISR auf einem PIC32. Diese wird nur zum Empfang von Zeichen benutzt und wird etwa 500 - 1000 mal pro Sekunde aufgerufen. Funktioniert auch prima, auch über längere Zeit hinweg. Wenn ich jetzt parallel Traffic auf dem CAN erzeuge, dann "versumpft" die UART-ISR. Sie wird nicht mehr aufgerufen. Womöglich weil ein Overrun stattfindet oder sonst eine Fehlersituation auftritt. Ich habe einen Timer, der etwa alle Sekunde prüft, ob und wie oft die ISR aufgerufen wurde. Damit kann ich recht gut und schnell erkennen, ob das Problem aufgetreten ist. Nun dachte ich mir, ich könnte zumindest den UART und die ISR neu aufsetzen, aber auch nach Abschalten des UART, Disablen des Interrupts, neu initialisieren des Interrupts und Freigabe der Interrupts kommen keine Zeichen kann (es werden hier übrigens die gleiche Funktionen für UART und ISR benutzt, wie beim ersten Aufsetzen und Starten). Händisches Aufrufen der UART-ISR habe ich schon probiert, ebenso eine Abfrage der (RX, TX, ERR) - Interruptflags mit Zurücksetzen. Wenn ich stattdessen einen SoftReset auslöse, dann geht es, aber der Prozessor (das Programm) läuft dann natürlich auch wieder von vorne los. Es schau aus, als würde sich der UART oder der Interrupt Controller irgendwie verhaken... War jemand mal in einer ähnlichen Situation? Oder jemand eine Idee wie ich das lösen könnte? Grüße, Peter
Peter schrieb: > War jemand mal in einer ähnlichen Situation? Ja, ich :( aber nicht mit CAN und PIC > Oder jemand eine Idee wie ich das lösen könnte? Ich konnte es bei mir lösen. Ich kannte aber auch mein Programm.
Hallo, das ist ein tolles Problem, ich liebe soetwas. Das kann man mit Debuggen fast nicht finden. Da kann man nur eingrenzen: Einzelne Funktionsblöcke ausschalten, bis es nicht mehr auftritt. Dann kennt man schon mal grob die Problematische Stelle. Anfangen tut man mit großen Blöcken (z.B. CAN) und verfeinert dann weiter (z.B. Receive auskommentieren). Indizes von Arrays oder irgendwelche Pointer sind ein heißer Tipp. Ich würde mir zuvor mit dem Debugger folgendes anschauen - werden die beiden Interrupt Enable - Flags für die UART-Interrupts zurckgesetzt, wenn der Fehler auftritt? - wird die Priorität der UART-Interrupts verändert? - gibt es irgendwas, dass die Interrupts auf "single vector" zurückdreht? - Hängt dein Code für längere Zeit in einer höherprioren ISR fest, z.B. der vom CAN?
Vielen Dank für die Tipps! Es scheint, als wäre die fehlende Overrun-Behandlung in der ISR das Problem gewesen. Es gibt scheinbar keine Funktion in der PLIB, mit der man das Overrun-Flag löschen kann, daher habe ich dies jetzt in der ISR und beim Init per direktem Registerzugriff eingebaut. So ist der Overrun jetzt nicht mehr so kritisch, falls er wirklich einmal auftreten sollte, SoftReset ist daher nicht mehr nötig. Nächster Schritt ist dann noch die Vermeidung des Overruns. Der UART benötigt hier eine höhere Prio im Gegensatz zum CAN.
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.