Nach Interrupt keine Rückkehr in Hauptschleife

Gast #1239108
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
Angehängte Dateien:
Gast #1239120
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.
Gast #1239134
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.
Gast #1239139
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
Gast #1239185
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.