Entprellen, beispiel und frage

Gast #966914
Lesenswert?

Hi,

ich wollte mal wissen ob folgender code:
void entprell (void) {
_delay_ms(10);
if ( (PINC & _BV(PC0)) == 1 ) {
       _delay_ms(5);
    if ( (PINC & _BV(PC0)) == 1){
        T_HAS_BEEN_PUSHED!();
                }
        }

}

aufgerufen durch :
if ( (PINC & _BV(PC0)) == 0 ){
entprell();
}


In Ordnung ist, um eine Taste zu entprellen.
Der Taster ist aktiv Low und der Pullup aktiviert.

Wenn die Taste gedrückt wird, wird in die entprell Funktion gesprungen 
und dort 10ms gewartet. Wenn der Taster Pin dann wieder high ist, wird 
5ms gewartet und wenn er dann immernoch high ist, wird in eine funktion 
gesprungen, die bei mir, eine register mit leds inkrementiert.



Ist das vom Prinzip her korrekt programmiert?
Es funktioniert nämlich...


Danke.
Gast #966944
Lesenswert?

Nein. So meinte ich das nicht.

Meine ersten Entprell-versuche waren auch etwa so:

wenn taste gedrückt, kurz warten und wenn immernoch gedrückt wirds als 
gedrückt erkannt.
Für die ersten Erfahrungen am µC ist das ok.
Aber man sollte sich alsbald mit besseren Entprellungen beschäftigen:
Die Tasten werden zyklisch (zB alle 10ms) abgefragt. Ist diese nicht 
gedrückt, wird ein Zähler genullt. Wird diese als gedrückt erkannt, den 
Zähler um eins erhöhen.
Ist der Zähler größer als X1 wird "Taste gedrückt" ausgegeben und vom 
Zählwert ein Zahlenwert etwas kleiner als X1 abgezogen.
Gast #966962
Lesenswert?

joi...

bisher hatte ich nur assembler...

Nun lern ich C und wir haben dort noch nicht gerlernt einen interrupt zu 
benutzen...
Sonst hätte ich mir einen Timer ISR geschrieben und alle 10ms den status 
eingelesen...Dann hätte ich nebenher noch was anderes machen können.

Aber aufgabenstellung ist halt es so zu lösen ;)



Trotzdem danke.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren