Interrupt in der ISR abschalten. Ist was zu beachten?

Gast #1962385
Hallo,

ich lasse meine Schaltung über einen externen Interrupt aufwachen.
Da der Interrupt nicht gebraucht wird wenn die Schaltung "wach" ist, 
sieht die ISR so aus:

ISR (INT0_vect) {
   GICR &= ~BV(INT0); //Externen Interrupt abschalten)
}

Ist das so in Ordnung? Ich frage, weil die Schaltung nach ein paar 
Stunden oder Tagen nicht mehr funktioniert.

Danke & Gruß,
Chris
@  Christian Schneider (Gast)

>ISR (INT0_vect) {
>  GICR &= ~BV(INT0); //Externen Interrupt abschalten)
>}

Ist OK.

>Ist das so in Ordnung? Ich frage, weil die Schaltung nach ein paar
>Stunden oder Tagen nicht mehr funktioniert.

Dann wird möglicherweise der Interrupt vor dem nächsten Aufruf des 
Sleep Mode nicht wieder aktiviert. Siehe die beiden Artikel, dort 
ist dein Problem als Beispiel sauber beschrieben. Es kann natürlich aber 
auch im Rest von deinem Code ein anderer Bug sein.

MFG
Falk
Christian Schneider schrieb:
> ISR (INT0_vect) {
>    GICR &= ~BV(INT0); //Externen Interrupt abschalten)
> }

Was soll dieser Unsinn?

Willst Du nun jede einzelne Zeile posten und fragen, ob sie in Ordnung 
ist?

Die Antwort ist dann:
Keine Zeile ist in Ordnung, da es immer auf den Kontext ankommt.

Man könnte bestenfalls sagen, ob sie syntaktisch in Ordnung ist, aber 
das kann der Compiler auch schon.

Der Compiler sagt übrigens, daß die Zeile syntaktisch falsch ist.
Und er hat recht, solange Du nicht die nötigen Includes und die CPU 
angibst.


Peter
Gast
Hi!
Danke für eure Antworten.

Ich glaube das Problem gefunden zu haben:
Ich schalte den Interrupt ein und lege den AVR in der nächsten Zeile 
schlafen. Wenn dazwischen ein Interrupt ausgelöst wird, geht er in die 
ISR und deaktiviert den Interrupt, springt zurück und schläft ein. Dann 
wacht er nie wieder auf. Manchmal sieht man das offensichtliche nicht.

Ich habe die Zeile aus der ISR entfernt und nach dem sleep_mode() 
eingefügt, seit dem keine Probleme mehr.

@Peter:
Ich hätte die Frage konkreter stellen sollen: Ist es in Ordnung, einen 
externen Interrupt in seiner ISR zu deaktivieren?

Am Ende lag das Problem ja woanders, da wäre in der Tat der komplette 
Code sinnvoll gewesen.
Das Programm hat natürlich noch viel mehr Möglichkeiten, sich 
aufzuhängen, die auch von externen Dingen abhängen. Daten über Uart mit 
Auswertung, 1-3 DS18S20, rfm12-Platine,

Gruß,
Chris
@  Hannes Lux (hannes)

>Wenn man AVRs in ASM programmiert, wird beim Aufruf der ISR das
>Interrupt-Flag automatisch (per Hardware) gelöscht und bei RETI wieder
>gesetzt. Ich glaube nicht, dass das in C anders ist.

Das ist ein anderes Problem.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 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.