mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32: Fehlerhafter Rücksprung aus ISR


Autor: Harald Horn (harald_horn)
Datum:

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

SIGNAL (SIG_OUTPUT_COMPARE1B)
{
cli();
//Zündung
  PORTD |= (1<<PD2);
  PORTD &= ~(1<<PD2);
sei();
}

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

Dank im Voraus,
Harald

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Harald,
zwei Dinge:

*Signal ist veraltete Schreibweise; lade GCC neu dann nennst Du das 
ganze: ISR {...}

* in einer ISR Interrupts zu erlauben ist etwas komisch. Mach das von 
Deinem Hauptprogramm aus.

Gruß
Helmut

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: nixVerstaan (Gast)
Datum:

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

Autor: Sven (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von einem Stacküberlauf würde ich bei nur 4 Befehlen innerhalb der
ISR nicht ausgehen.  Dann wohl eher von einem fehlerhaft aktivierten
Interrupt.  Da uns der OP aber nicht mehr als das Schnipsel zeigen
will, wird der Reset sein Geheimnis bleiben.

Autor: Harald Horn (harald_horn)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anmerkung:

"cli()" und "sei()" sind Überbleibsel von einem Versuch, das Problem zu 
lösen; der Fehler trat auch vorher schon genau so auf.

Gruß,
Harald

Autor: Michael Appelt (micha54)
Datum:

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

Autor: Harald Horn (harald_horn)
Datum:

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

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.