Forum: Mikrocontroller und Digitale Elektronik Ungeklärter Absturz PIC18F4580


von Norman S. (norman-s)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin bereits seit meinen ersten PIC Tagen im Jahr 2004 immer 
fleißiger Nutzer dieses Forums. Habe mir auch schon etliche Tipps und 
Tricks hier geholt und bisher eigentlich immer alles zum laufen 
bekommen.

Nun habe ich ein Phänomen, bei dem ich seit Tagen einfach nicht 
weiterkomme.

Ich nutze folgende Umgebung:
Controller: PIC18F4580 @ 4MHz Crystal Quarz mit 4-fach-PLL
Sprache:    C
Compiler:   C18
IDE:        MPLAB 8.90

Projekt:
Lenkregelung an einem Obstbau Traktor
Ich erfasse den Abstand zu Obstbäumen links und rechts vom Fahrzeug mit 
dem Ziel das Fahrzeug immer in der Mitte der Fahrspur zu halten.
(AD Wandlung ist Interrupt gesteuert)

Weiterhin gibt es noch diverse andere analoge und digital Signal für 
Bediener-Befehle und Umgebungsüberwachungen (z.B. 
Betriebsspannungsüberwachung).

Die Lenkregelung erfolgt dann Geschwindigkeitsgesteuert, daher erfasse 
ich noch Wegimpulse von einem Messrad am Fahrzeug über den Capture 
Interrupt des CCP1 Moduls.

Zur Ablaufsteuerung im Quellcode verwende ich ein selbst progrtammiertes 
Zeitscheibenverfahren auf Basis von Timer3 mit einer Grund-System-Zeit 
von 100us. Die kleinste Zeitscheibe ist zusätzlich Watchdog überwacht.

Problemstellung:
Grundsätzlich funktioniert alles einwandfrei so wie ich es mir 
vorstelle.
Zeitscheibe, Interrupts für AD Wandlung, Capture Interrupt funktioniert 
alles einwandfrei. Das System läuft Problemlos und macht seinen Job.

Nun kommt es aber sporadisch zu einem komplett Absturz des Controllers.
Ich sage bewusst Absturz, da es aus meiner Sicht nicht zu einem Restart 
kommt. Der Controller hängt und ich kann nichts mehr tun.
Ein Reset durch den Watchdog findet aber irgendwie auch nicht statt. 
Daher gehe ich davon aus dass ich nicht mehr im normalen 
Bearbeitungszyklus befinde sonder der Program Counter irgendwo im 
Nirvana steht bzw. noch mehr schiefging, da ja sogar der Watchdog 
Baustein hängt.

Normalerweise Programmiere ich den Code fest über den Programmer meines 
ICD2.
Habe dann versucht mittels Debugger den Fehler ausfindig zu machen:
Wenn das Absturz Verhalten auftritt, wird der Debug Vorgang nicht 
"ge-paused" sonder der Debugger läuft ganz normal weiter. Wenn ich dann 
versuche manuell anzuhalten stürzt die ganze IDE ab (Time-Out)
Ein Stack Overflow Reset sollte wenigsten den Debugger zum anhalten 
bewegen, daher vermute ich den auch nicht.

Wenn ich nach so einem Absturz nun einen manuellen Power-On-Reset mache 
funktioniert wieder alles einwandfrei für einige Zeit (15-20min).
Dann beginnt das selbe Spiel wieder von vorn.

Kann sich jemand erklären, wie das passieren kann? Liegt es vielleicht 
an der Konfiguration bei (Warm-)Restart?
Ich komme nicht mehr weiter, bitte helft mir! :-)

Habe bis jetzt bei der Interrupt Behandlung schon ein wenig mit Register 
Sicherung rumgespielt, bisher ohne erfolg. Normalerweise muss ich hier 
aber doch garnichts tun bei nem C-Compiler, oder?

Im Anhang mal meine "main.c" mit der config und der Interrupt 
Behandlung.

Vielen Dank schon mal für jeden hilfreichen Beitrag.

Norman

von Michael L. (Firma: Ingenieurbüro Lehr) (ml-net)


Lesenswert?

Mach mal den Brown-Out an.

100µs Systick ist ziemlich schnell den  Pic

So wenig Funktionsaufrufe im Interrupt wie möglich.
Der C18 kommt damit nicht gut klar und sichert Riesenmengen auf den 
Stack beim Interrupt.

von test (Gast)


Lesenswert?

Du darfst vor dem Verlassen des Interrupts das GIE-Flag nicht setzen. 
Das macht der mit RETFIE selbst. Deshalb fliegt dir vermutlich der 
Return-Stack um die Ohren, wenn da zwischen GIE=1 und return ein anderer 
Interrupt ausgelöst wird.

Noch was:
1
INTCONbits.GIE = 0;
2
  save_PCLATH = PCLATH;
3
  save_WREG   = WREG;
4
  save_STATUS = STATUS;
5
    save_BSR    = BSR;
6
7
...
8
9
//  PCLATH = save_PCLATH;
10
  WREG   = save_WREG ;
11
  STATUS = save_STATUS;
12
    BSR    = save_BSR;

Ich kenn zwar den C18 nicht sondern nur den XC8, aber das generiert der 
selbst. Das GIE=0 kannst du dir auch schenken, der ist so oder so aus, 
sobald der den Handler anspringt.

von WehOhWeh (Gast)


Lesenswert?

Norman S. schrieb:
> Nun kommt es aber sporadisch zu einem komplett Absturz des Controllers.
> Ich sage bewusst Absturz, da es aus meiner Sicht nicht zu einem Restart
> kommt. Der Controller hängt und ich kann nichts mehr tun.
> Ein Reset durch den Watchdog findet aber irgendwie auch nicht statt.

Wenn du den Watchdog eingeschaltet hast, kann ich mir nur eines 
vorstellen:

Der Takt ist weg oder schlecht. Weil der Watchdog ist ein Stück 
Hardware. Wenn du den in SW nicht zurücksetzt oder wegkonfigurierst, 
muss der anschlagen und einen Reset auslösen. Egal ob sich der ganze µC 
aufhängt. Dafür ist er ja da. Watchdog und Reset müssen immer 
funktionieren!

Entweder du konfigurierst den Clock aus versehen weg oder es gibt 
Hardwareprobleme.

Ich kenne das vom Breadboard, wenn man dort die Entkoppelkondensatoren 
vergisst, dann mögen meine Breadboard-PICs auch keine PLL. Das ist dann 
instabil oder läuft nicht an.

Ich würds mal auf dem FRC laufen lassen (falls möglich!), wenn es dann 
stabil ist, hast du das Problem gefunden.
Oder schalte den Taktausgang ein, und miss das nach.

von Norman S. (norman-s)


Lesenswert?

Hallo!

Vielen Dank erst mal für eure schnellen und hilfreichen Antworten!

Es sieht so aus als hätten Sie mich zum Erfolg geführt.
Ein HW-Clock-Problem gibt es zum Glück nicht, der Absturz war ohne PLL 
immer noch aufgetreten.
Schlussendlich war es meiner Meinung nach die Interrupt-Last, wie 
Michael vermutet hat.

- Brown Out ist nun aktiviert
- manuelle Registersicherung und GIE Behandlung im Interrupt Handler
  habe ich wieder ausgebaut
- Basiszeit für Zeitscheibe habe ich von 100us auf 1ms erhöht
- Triggerfunktionen für den Fahrweg und Fahrgeschwindigkeit rufe ich nun 
vom
  Interrupt entkoppelt direkt in der main() auf

War heute morgen 3h bei einer Testfahrt um es auszuprobieren und ich 
konnte mit diesen Änderungen keinen einzigen Absturz mehr verzeichnen!! 
Voll geil :-)

Also nochmal vielen Dank für eure Hilfe.

Gruß Norman

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.