Atmega32: Fehlerhafter Rücksprung aus ISR

OP #1213509
Hallo,

folgendes Problem:

Atmega32. Nach Beendigung untenstehender ISR springt der Prozessor nicht 
in die Hauptschleife zurück sondern startet das Programm neu (Von Reset 
will ich erstmal nicht sprechen, da ich mir nicht sicher bin, ob ein 
solcher vollstädndig ausgeführt wird.)

1
SIGNAL (SIG_OUTPUT_COMPARE1B)
2
{
3
cli();
4
//Zündung
5
  PORTD |= (1<<PD2);
6
  PORTD &= ~(1<<PD2);
7
sei();
8
}

Worann kann´s  liegen?
Lasst mich wissen, welche Infos ihr noch benötigt.

Dank im Voraus,
Harald
Helmut Ru wrote:
> * in einer ISR Interrupts zu erlauben ist etwas komisch. Mach das von
> Deinem Hauptprogramm aus.
Das macht er ja gar nicht (zumindest nicht direkt).

@Harald:
Das cli() und sei() haben im Interrupt Handler nichts verloren! Das 
Sperren und Wiederfreigeben der Interrupt-Bearbeitung während der 
Abarbeitung des Interrupt-Handlers macht die Controller-Hardware 
automatisch. Zusätzlich selber machen kann in bestimmten Fällen nicht 
nur überflüssig, sondern fehlerträchtig sein
Harald Horn wrote:
> Atmega32. Nach Beendigung untenstehender ISR springt der Prozessor nicht
> in die Hauptschleife zurück sondern startet das Programm neu (Von Reset
> will ich erstmal nicht sprechen, da ich mir nicht sicher bin, ob ein
> solcher vollstädndig ausgeführt wird.)
Tja, hast Du eventuell dem Compiler nicht den richtigen Controllertyp 
angegeben? Der muss im Makefile entsprechend eingestellt sein.

Und wirf mal einen Blick ins AVR-GCC-Tutorial.
Gast
Ein Neustart des Programm unter avr-gcc liegt meistens an einem 
Interrupt, für den es keine ISR gibt. Da ist geht es dann als default 
über bad_interrupt auf den resetvektor. Welche Interrups hast du denn 
alle freigegeben?

Und schmeiß das sei() und cli() aus der ISR. Das braucht es dort nicht, 
das macht die Hardware automatisch. Das sei() ist sogar gefährlich, denn 
an der Stelle ist die ISR noch (lange) nicht zu Ende.

Oliver
Gast
Vielleicht ist Dir mit Deiner Interrupt-Bastelei auch nur schlicht und 
ergreifend der Stack übergelaufen. Dann kann alles mögliche passieren 
(1+1=17; 1+1>1000) oder natürlich auch ein Reset.
Gast
Es ist etwas unsinig, da der AVR aus der ISR raus sowieso keinen 
weiteren Interrupt ausführt. cli und sei kann also entfallen. Sollte 
aber nicht der Grund sein, oder...
Je nachdem, wie schnell die Compare-Interrupts kommen, kann es durchaus 
sein, dass er sich durch das sei() am Ende ins Knie geschossen hat. Wenn 
zum Zeitpunkt des sei() schon der nächste Compare-Interrupt ansteht, 
kommt er aus dem Handler nicht wieder raus. Dann ist ein Stack-Überlauf 
beschlossene Sache.
Harald Horn wrote:
> Hallo,
>
> folgendes Problem:
>
> Atmega32. Nach Beendigung untenstehender ISR springt der Prozessor nicht
> in die Hauptschleife zurück sondern startet das Programm neu (Von Reset
> will ich erstmal nicht sprechen, da ich mir nicht sicher bin, ob ein
> solcher vollstädndig ausgeführt wird.)

Hallo,

mal so ein Verdacht: im Simulator oder auf der realen Hardware ?

Der simulator verblüfft manchmal, weil ganze Statements übersprungen 
werden. Da hilftt das Step-Through im Disassembler- Modus

Gruß,
Michael
OP
Hallo Oliver,

> Ein Neustart des Programm unter avr-gcc liegt meistens an einem
> Interrupt, für den es keine ISR gibt. Da ist geht es dann als default
> über bad_interrupt auf den resetvektor. Welche Interrups hast du denn
> alle freigegeben?

bingo, das war´s. Da war von einem früheren Versuch noch ein externer 
Interrupt aktiviert. Jetzt geht´s! Danke! :-)

Gruß,
Harald

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.