Forum: Compiler & IDEs Programm hängt sich auf - Fehlersuche


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein kleines Problem und ich hoffe mir kann jemand helfen.
Mein Programm (siehe Anhang) hängt sich sporadisch auf und ich hab keine 
Ahnung wieso. Exakt ist es auch nicht zu reproduzieren aber nach einer 
gewissen weile kommt es immer zum hängenbleiber.

Ich erleutere mal gerade die Funktion des Programms.
in festen intervallen (100ms) werden zwei IO Pins abgefragt PIND4 & 5.
Pin D4 habe ich mit einer Abfallverzögerung versehen.
Wenn also PIND5 = 0 ist und PIND4 nicht länger als seit 2sek. 1 ist wird 
die LED angeschaltet.

Wenn dann noch die Drehzahl die durch den INT0 berechnet wird kleiner 
als eine Zieldrehzahl ist, wird der PORTC0 und 1 auf 1 geschaltet. 
Dahinter hängt ein MOSFET der ein Magnetventil auf Masse schaltet.

Insb. wenn es zum Anschalten des MOSFETS gekommen ist, bleibt das 
Programm gerne hängen. Äussern tut sich das dadurch das die LED nicht 
mehr an geht, obwohl beide eingänge den richtigen Pegel haben.

Hat jemand ne Idee? bzw. Tipp zur Fehlereingrenzung

von rudi (Gast)


Lesenswert?

> Dahinter hängt ein MOSFET der ein Magnetventil auf Masse schaltet.
> Insb. wenn es zum Anschalten des MOSFETS gekommen ist, bleibt das
> Programm gerne hängen.
Spannungsspitzen beim Schalten könnten deinen µC verwirren. Vcc mit 
Scope überprüfen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Evtl. liest du Mist aus den 16-Bit Variablen, die sich ISR und Programm 
teilen, weil nicht atomar darauf zugegriffen wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Das hier sieht verdächtig aus:
1
   N = (150000L*8) / T_N_PLS;
2
   T_N_PLS = 0;

T_N_PLS wird nach der Division auf 0 gesetzt. Damit ist das für den 
nächsten EXT_INT0-Interrupt ein Kandidat für Division durch 0.

Wenn Du natürlich garantieren kannst, dass der nächste TIM1_OVF 
schneller kommt als der EXT_INT0, dann ist alles in Butter. Unschön ist 
es trotzdem. Abfangen würde ich das allemal.

von Thomas (Gast)


Lesenswert?

Hallo,

vielen Dank für die Tipps... Programmtechnisch hab ich vor die Abfragen 
von N in der Hauptschleife jetzt die Interrupts kurz deaktiviert, so das 
das 16Bit Label nicht zwischendrin halb umgeschrieben wird.

Eine Abfrage auf T_N_PLS > 0 hab ich noch eingefügt, wobei das 
eigentlich nicht vorkommen dürfte. Hast aber recht, ist unsauber.

Zudem hab ich dem Mosfet eine separate Masse gegeben und dem Prozessor 
noch 200nF Pufferkondensatoren...

damit scheint es jetzt zu gehen... bisher keine Ausfälle.

Danke

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.