Hi Wombatz,
des Rätsels Lösung findet sich im Datenblatt des ATMega8, in diesem Fall auf Seite 68:
Dort steht geschrieben, dass die Interrupt-Flags von INT0 und INT1 grundsätzlich gelöscht werden, wenn die Interrupts als "level" konfiguriert sind. Ist ja eigentlich auch logisch - sonst würden ja tausende von Interrupt-Anforderungen auflaufen, wenn man die Taste nur ´ne halbe Sekunde lang drückt.
Wenn Du die Interrupts also auf "Flanke" konfigurierst (z.B. fallend), ist dieses Grundproblem schon mal behoben - es lässt sich dann auch während einer ISR der nächste Interrupt aslösen.. Allerdings wirst Du was interessantes feststellen: Manchmal leuchtet die LED 10 Sekunden statt nur 5. Das liegt daran, dass jeder Taster prellt, und deshalb oft zu Beginn der ISR der gleiche Interrupt nochmal "auf Vorrat" ausgelöst wird. Das könntest Du ändern, indem Du vor dem return das entsprechende Interrupt-Flag löschst. Aber hier gibt´s noch eine lustige Besonderheit: Diese Flags löscht man, indem man sie auf "1" setzt (ist tatsächlich so - steht auch auf Seite 68!).
Um zu vermeiden, dass Interrupts zeitlich aufeinanderfallen, sollten die ISRs so kurz wie möglich sein (das wirst Du hier im Forum auch alle Nase lang lesen). "Guter Stil" wäre es also, in der ISR nur ein Flag-Bit zu setzen, und gleich wieder zurück in die Hauptschleife zu springen. Dort werden diese Flags dann regelmäßig abgefragt, und wenn sie 1 sind, wird die dazugehörige Befehlssequenz abgearbeitet (und das Flag auf 0 gesetzt - bis zum nächsten Interrupt).
Lesezeichen