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