Hallo,
hiermit möchte ich versuchen, die grundsätzliche Funktion dieser
Interrupt Service Routine ( ISR ) für das Tasterentprellen zu erklären.
In meinem Beispiel wird die Timer0 Overflow Interrupt eines ATmega8
welcher mit seinem internen 1Mhz RC-Oszillator arbeitet unter anderem
zur Tasterentprellung genutzt. Diese IRQ wird dazu ca. alle 2ms
aufgerufen, dementsprechend natürlich auch die dazugehörige ISR.
Das Prinzip beruht auf dem Inkrementieren eines Arbeitsregisters
( key_reg ), dessen einzelnen Bits unterschiedliche Funktionen erfüllen.
Dieses Arbeitsregister sollte eines ab r16 sein, damit kompfortabel mit
den Bitmanipulations,- und Auswertebefehlen cbr/sbr sowie sbrc/sbrs
gearbeitet werden kann.
In diesem Fall dienen die Bits 1&0 als Zählerbits. Es könnten aber auch
die Bits 5...0 dazu genutzt werden. Das darauf folgende Bit 2
( key_state ) dient der Erkennung das der Taster nicht betätigt ist.
Dieses Bit wird nur gesetzt, wenn 3x direkt hintereinander in der ISR
ein nicht betätigter Taster erkannt wurde ( 4x nach POR bzw. Reset ).
Das auf dieses Bit folgende Bit 3 ( key_press ) wird gesetzt, wenn auch
hier wieder 3x direkt hintereinander in der ISR ein diesmal betätigter
Taster dedektiert wurde. Es gilt zu beachten, das hierbei nur einmalig
eine Aktion ausgeführt wird. Das heißt eine Dauerbetätigung löst keine
weitere Aktion aus, da die Zählerbits immer zurückgesetzt werden.
Nach einem Power On Reset ( POR ), Watch Dog Reset, Reset oder sonstigen
Resets, wird ein bereits davor betätigter Taster also nicht erkannt.
Dies könnte allerdings nach Ablauf der Entprellzeit durch das nicht
gesetzte Bit 2 ( key_state ) erkannt werden, da dieses ja bei
Nichtbetätigung des Taster gesetzt wird. Allerdings darf das nicht mit
Taster " losgelassen " gleichgesetzt werden, denn " Taster losgelassen "
setzt vorraus das der Taster vorher betätigt war, aber Bit 2 wird auch
gesetzt, wenn der Taster vorher nicht betätigt wurde.
Typische Prellzeiten bei elektromechanischen Schaltern und Tastern
liegen laut Wikipedia zwischen 100µs bis 10ms
*( Reaktionszeit Mensch 300-400ms ).*
Deshalb sollte die Zeit so eingestellt werden, das das Bit 3
( key_press ) bei > = 10ms gesetzt wird. Hier in dem Beispiel, wo in
der ISR welche ca. alle 2ms aufgerufen wird, unter anderem auch die
Tasterentprellung vorgenommen wird, gilt der Taster bereits nach ca. 6ms
( 3x 2ms ) als entprellt.
Falls es also widererwarten doch hin und wieder zu Tasterprellen kommt,
steht der Erweiterung des Zählers auf 3-Bit oder noch mehr nichts im
Wege. Ein 3-Bit Zäher ( Bit 2...0 ) würde also bis das Bit 4
( key_press ) gestzt wird, ein sieben maliges aufrufen der ISR
benötigen. Dadurch wird eine Prellzeit von ca. 14ms überdeckt, was immer
noch weit entfernt von der Reaktionszseit des Menschen ist.
Zur Verdeutlichung sollte unbedingt ein eigener PAP
( Programmablaufplan ) erstellt werden, oder evtl. ein Logikplan, wenn
man damit besser zurecht kommt.
Bernd_Stein