Forum: Mikrocontroller und Digitale Elektronik PIC32-UART-ISR "versumpf"


von Peter (Gast)


Lesenswert?

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

von zweiundvierzig (Gast)


Lesenswert?

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.

von Somebody123 (Gast)


Lesenswert?

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?

von Peter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.