Hallo meddie.
Taster kann man völlig getrennt vom Hauptprogramm betreiben. Einmal gäbs die Pollingmethode von PICture mit dem Effekt dass ein Druck zwischen zwei Timerinterrupts unbeachtet bliebe (ein Glitsch). Nun macht man solche Timerroutinen aber recht schnell. Eine andere Methode ist bei mir üblich.
Ein Timer für die "Boardzeit" mit 50 µs läuft bei praktisch allen meinen Controllern für solche und ähnliche Messungen, für Heartbeat (blinkende LED als Zeichen dass fast alles ok ist) und eben die Boardzeit = Gesamtzeit "Board seit Einschalten".
Taster hänge ich an einen externen Interrupt. Die gibts "separat" als INT0 and INT1. Die sind beispielsweise beim mega328 auf Pinn PD2 und PD3 mit der höchsten Priorisierung nach dem /RESET, sehr ähnlich bei vielen anderen Controllern. Diese Interrupts können auf steigende oder fallende Flanke oder beide eingestellt werden.
Bei vielen anderen Controllern gibt es noch die Möglichkeit jeden anderen Pinn als PCINT23...0 (wieder m328 als Beispiel) zu konfigurieren. Die Priorisierung der PCINTnn ist gleich nach den INT0 und INT1. Nicht möglich ist ein PCINTnn naturgemäß bei VCC, GND und Ähnlichen. Die PCINTnn-Interrupts triggern bei jedem Wechsel des Pinzustandes.
Was geschieht? Sobald der Interrupt anspricht lese ich den Timer aus. Timerstand wird gespeichert als z.B. "PINT1an" - Pinn von Taste 1 ist an. Man wird nach Deiner Aufgabenstellung dann noch nen Messwert bei der komplementären Flanke holen und mit dem Vergleich der beiden Messwerte die Fallunterscheidung nach "lang" oder "kurz" gedrückt machen. Etwas tricky KÖNNTE es werden, wenn Du Tastenprellen beachten MUSST - ist bei mir in mehreren Jahren eigentlich nie vorgekommen. Weiß aber nicht warum.
Thats all *ggg*. Wenn mans mal gemacht hat, total easy. Hilfen zur arduino-Umgebung gibts bei mir nicht, weil ich direkt in C programmiere.
Lesezeichen