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
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
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. ...
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.