www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt in der ISR abschalten. Ist was zu beachten?


Autor: Christian Schneider (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man so machen.

Autor: Falk Brunner (falk)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Christian Schneider (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Falk Brunner (falk)
Datum:

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

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.