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


von Christian Schneider (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Kann man so machen.

von Falk B. (falk)


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

von Peter D. (peda)


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

von Christian Schneider (Gast)


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

von Hannes L. (hannes)


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.

...

von Falk B. (falk)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.