Interrupt in der ISR abschalten. Ist was zu beachten?

Gast #1962385
Lesenswert?
• ▲
▼
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
#1962418
Lesenswert?
• ▲
▼
@  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
#1962447
Lesenswert?
• ▲
▼
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 #1962797
Lesenswert?
• ▲
▼
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

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.