Forum: Mikrocontroller und Digitale Elektronik Nach Interrupt keine Rückkehr in Hauptschleife


von Joba (Gast)


Angehängte Dateien:

Lesenswert?

Hi!

Ich versuche gerade einen Delay Generator zu programmieren. Ziel ist das 
ein ext. Interrupt einen Timer startet, der wiederrum bei compare match 
ein Bit setzt. Funktioniert alles wunderbar, nur leider springt mein 
Programm nach dem Interrupt nicht in die Hauptschleife zurück. Evtl. 
liegt es auch daran, dass die Debounce-Routine von Peter Danneger durch 
meine Interrupts gestört wird. Also wer was dazu weiß, bedanke mich 
schonmal. Code ist im Anhang.

Gruß
Joba

von Ahem (Gast)


Lesenswert?

Sieht mir irgendwie nach Designfehler aus.

Aber gut.
Warum denn die Interrupts allgemein sperren?

Das wird auch den LCD-Routinen nicht gut tun (und Peter D.s Entprellung 
auch nicht.)

Also, lass das! :-)

Die Ausgabe völlig aus dem Delay-Schreiben rausnehmen oder das setzen 
des Timer-Registers.

Den fraglichen Timer kannst Du auch einzeln anhalten, falls das Dein 
Bedenken ist.

von Joba (Gast)


Lesenswert?

Nun die Interrupts deaktiviere ich in delay-schreiben weil ich in OCR1A 
schreibe. Wenn ich Timer 1 nicht aktiviere habe ich das Problem mit der 
Rückkehr in's Hauptprogramm nicht. Also kann es daran meiner Meinung 
nach auch nicht hängen.

von Joba (Gast)


Lesenswert?

Habe den Fehler gefunden. Habe wegen deinem Hinweis, dass ich den Timer 
auch so anhalten kann nochmal rumgespielt. und es ist kein wunder, dass 
nichts mehr geht. Durch
1
TIMSK = ( 1<<OCIE1A );  // enable timer interrupt T1A
 lösche ich das Interrupt enable von Timer 0.

Alles klar, auf jeden Fall trotzdem Danke Ahem

von Oliver (Gast)


Lesenswert?

>Funktioniert alles wunderbar, nur leider springt mein
>Programm nach dem Interrupt nicht in die Hauptschleife zurück.

Niemals.

>Durch
>TIMSK = ( 1<<OCIE1A );  // enable timer interrupt T1A
>lösche ich das Interrupt enable von Timer 0.

Richtig. Genau das, und nichts anderes. Das verhindert, daß beim 
nächsten compare match die ISR aufgerufen wird, verursacht aber nicht, 
daß das Programm nicht aus der ISR zurückkommt. Am Ende der ISR steht 
der Befehl reti, und der bedeutet: Spring zurück dahin, wo du her 
kommst. Immer. Das einzige, was schief gehen kann, ist ein versemmelter 
Stack, dann geht der Sprung irgenwohin, aber gesprungen wird immer.

Aber es stellt sich natürlich die Frage, wie du überhaupt rausgefunden 
hast, daß es da nicht zurückspringt...

Oliver

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.