Zählen von Tastenbetätigungen
Das Problem "Prellen"
Beim Betätigen einer Taste berühren sich im Inneren der Taste
zwei Schaltkontakte aufeinander zu. Das Problem dabei ist das
sogenannte Prellen der beiden Schaltkontakte. Sie bewegen sich in
federnder Weise mehrfach aufeinander zu und wieder weg. Die geschieht
so schnell, daß ein Mensch dies kaum merkt. Unser Mikrocontroller ist
jedoch schnell genug, um jeden einzelnen Preller mit zu zählen.
Los geht's:
Wir benutzen unser Experimentierboard und schließen eine Taste an
PC0 und GND an (wie man eine Taste an den Mikrocontroller anschließt,
hast Du hier gelernt)..
Wird die Taste betätigt, soll ein LED-Punkt einen
Schritt weiter wandern.
Das Entprellen erledigen wir mit zwei 100ms Zeitverzögerungen und einer while-Schleife.
Schau Dir den Code an:
#include <avr/io.h>
#define F_CPU 1000000UL // 1 MHz
#include <util/delay.h>
#include "boarddefs.h"
int main(void){
//Zaehlvariable
int z=0;
//alle PORTS sind Ausgaenge
DDRB = 255; DDRC = 255; DDRD = 255;
//PC0 wieder loeschen -> PC0 ist nun Eingang
DDRC &= ~_BV(PC0);
//alle LEDs aus bzw. alle PULL UPs an, wo Eingänge
definiert
PORTB = 255; PORTC =
255; PORTD = 255;
while (1){
//Wenn Taste gedrueckt
if (bit_is_clear(PINC,0)) {
z++;
if (z==15) z=1;
PORTB=255;
PORTC=255; PORTD=255;
if (z==1)
led1on;
if (z==2)
led2on;
if (z==3)
led3on;
if (z==4)
led4on;
if (z==5)
led5on;
if (z==6)
led6on;
if (z==7)
led7on;
if (z==8)
led8on;
if (z==9)
led9on;
if (z==10)
led10on;
if (z==11)
led11on;
if (z==12)
led12on;
if (z==13)
led13on;
if (z==14)
led14on;
//warten, bis
Taste losgelassen wird
while
(bit_is_clear(PINC,0)) {_delay_ms(100);}
}
//nochmal warten
_delay_ms(100);
}
return(0);
}
Hier gibts die Code-Ordner
- Versuch doch mal, ein Vorwärts- und ein Rückwärtszählen (also
mit zwei angeschlossenen Tasten) zu programmieren!
|