mikrocontroller.net

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


Autor: Joba (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joba (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joba (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
TIMSK = ( 1<<OCIE1A );  // enable timer interrupt T1A
 lösche ich das Interrupt enable von Timer 0.

Alles klar, auf jeden Fall trotzdem Danke Ahem

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.