> Da ich nicht alle millisekunde überprüfen will, ob ein Taster gedrückt
> ist,...
Und was spricht dagegen? Du musst es ja nicht selber machen, und der
Controller wird dafür bezahlt, dass er es macht;-) Bei den üblichen
Verarbeitungsgeschwindigkeiten ist es für den µC (ob das jetzt ein AVR,
ein PIC oder sonstwas ist) praktisch keine Belastung, alle 10-20 ms
(öfter macht keinen Sinn) abzufragen, welche der angeschlossenen Taster
gedrückt sind. Dafür einen Hardware-Interrupt zu verwenden ist aus zwei
Gründen unsinnig:
1. Externe Interrupts sind i.d.R. kostbares Gut, auch wenn es µCs gibt,
die ganze Ports über sog. Pin Change Interrupts (oder "Interrupt on
Change") abfragen können.
2. Einen Timer braucht man für die Entprellung sowieso (außer man macht
die mit Warteschleifen, was aber noch unsinniger für den Programmfluss
ist), also kann man den auch direkt durchlaufen lassen und eben alle
paar zig ms die Taster einlesen. Als Dreingabe hat man noch ein genau
vorhersagbares Verhalten, weil man genau weiß, wann der Timer-Interrupt
auftritt und keine Probleme mit der Bearbeitung anderer Sachen bekommt,
die sonst durch die asynchron auftretenden Ereignisse unterbrochen
werden könnten.
Außerdem braucht man nach meiner Erfahrung eh in fast jeder Anwendung
irgendeinen Basistakt für bestimmte Abläufe. Und den kann man dann
zusätzlich für eine Tasterabfrage nutzen. Wenn man z.B. für irgendwas
einen Millisekunden-Takt hat, kann man in dem entsprechenden
Timer-Interrupt eine Zählvariable hochzählen und z.B. beim Zählerstand
von 20 die Taster einlesen. Wenn man den Zustand der Taster dann mit
demjenigen von der letzten Abfrage vergleicht, erkennt man sofort, wo
sich etwas geändert hat. Für den Vergleich bietet sich eine
Exklusiv-ODER-Verknüpfung an.
Die eigentlich einzige sinnvolle Anwendung für Taster an externen
Interrupts ist das Aufwecken aus einem Stromsparmodus (zumindest bei
AVRs, weiß nicht, wie das bei den PICs geht).