Forum: Mikrocontroller und Digitale Elektronik Entprellen, beispiel und frage


von dude (Gast)


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.

von Matthias L. (Gast)


Lesenswert?

>In Ordnung ist, um eine Taste zu entprellen.

Nach Analyse des Codes:
1
_delay_ms
folgt ein: NEIN

Beitrag "Tasten entprellen - Bulletproof"

von dude (Gast)


Lesenswert?

Hi,

danke das du es dir angeschaut hast.



Was genau ist an delay nicht in ordnung?

Mir ist klar, dass diese art des entprellens den kompletten uC 
blockiert!
Ist aber immoment nicht schlimm...

von Matthias L. (Gast)


Lesenswert?

>Ist aber immoment nicht schlimm..

Naja, dann kannst es erstmal lassen.
(Hab mir den COde im Detail nicht angesehen)

von dude (Gast)


Lesenswert?

Ah das ist ja sehr lustig ;)


Dann empfiehlst du mir es erstmal so zu lassen, ohne zu wissen ob es 
seinen zweck erfüllt...

von holger (Gast)


Lesenswert?

>Dann empfiehlst du mir es erstmal so zu lassen, ohne zu wissen ob es
>seinen zweck erfüllt...

DU sagst doch es geht ;) Wenn du Zeit hast zu warten
dann ist das so ok.

von Matthias L. (Gast)


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.

von dude (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.