Hallo,
du solltest niemals in Interrupts solche Sachen wie Warteschleifen
o.ä. einbauen. Interrupts müssen eigentlich so schnell wie möglich
fertig sein, ausserdem blockst du damit unnötig andere Interrupts. Bei
kleinen Projekten mag dies nicht ins Gewicht fallen, aber wenns mal
komplexer wird, wunderst du dich dann, warum die Interrupts so langsam
abgearbeitet werden oder womöglich Interrupts verloren gehen.
Du kannst wie bereits von Thomas B. erwähnt per Polling arbeiten, das
heisst, an bestimmten Stellen im Hauptprogramm prüfen, ob der Eingang
aktiv ist. Wenn ja, dann wartest du 20ms, und prüfst nochmal. Wenn der
Eingang dann immer noch aktiv ist, änderst du die Funktion. Das lässt
sich in ein Unterprogramm packen, welches du dann immer per CALL-Befehl
aufrufst.
Eine Alternative mit Interrupts gibts natürlich auch, allerdings ist der
INT0/1-Interrupt (=Externer Interrupt) dafür ungeeignet. Nimm besser
einen der Timer-Interrupts. Du stellst den Timer-Interrupt auf 20ms ein.
Wenn der Interrupt zuschlägt, prüfst du den Eingang, setzt/löschst
entsprechend ein Bit und verlässt den Interrupt. Beim nächsten
Timer-Interrupt prüfst du das Bit. Ist es gesetzt und der Eingang immer
noch aktiv, dann signalisierst du über ein weiteres Bit dem
Hauptprogramm, dass sich die Funktion geändert hat. Ist der Eingang
nicht mehr aktiv gewesen, dann gibts auch keine Nachricht ans
Hauptprogramm, und das "Merk"-Bit innerhalb des Interrupts wird gelöscht
(Wird natürlich auch gelöscht, wenn das Hauptprogramm die Nachricht
erhalten hat, denn dann hat es seinen Zweck erfüllt). Das Entprellen ist
damit auch gelöst.
Es gibt natürlich weitere Ansätze, die eben anders arbeiten. Ich
verwende eben immer den Timer-Interrupt, wobei dieser eine kleinere
Zeitbasis hat. Bei mir sind es etwa 138 µs. Über eine Vorteiler-Variable
teile ich die Interrupt-Zeit in drei Abschnitte von jeweils 3,33ms.
Jeder Abschnitt hat eine andere Aufgabe: Matrix-Tastatur-Abfrage,
Software-Timer (10ms Auflösung) und Aktualisierung der Software-RTC. Da
bei jedem Interrupt ein anderer Abschnitt drankommt, sind diese 3,33ms
zueinander versetzt. Jeder Abschnitt kommt alle 10ms dran (3x3,33ms).
Du siehst, jeder hat da so seine Lösungsart :)
Wenn du Fragen dazu hast, ruhig zu.
Ralf