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!