Taster entprellen aus dem Wiki

Gast #181007
Lesenswert?

Moin,
Im Wiki steht folgender Code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>
...

// Schwellwerte
// Entprellung:
#define CNTDEBOUNCE 10
// "lange gedrueckt:"
#define CNTREPEAT 200

// hier z.B. Taste an Pin2 PortA "active low" = 0 wenn gedrueckt
#define KEY_PIN  PINA
#define KEY_PINNO PA2

// beachte: volatile!
volatile uint8_t gKeyCounter;

// Timer-Compare Interrupt z.B. alle 10ms
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
   // hier wird gKeyCounter veraendert, die uebrigen
   // Programmteile muessen diese Aenderung "sehen"
   // (volatile -> aktuellen Wert immer in den Speicher schreiben)
   if ( !(KEY_PIN & (1<<KEY_PINNO)) )
      if (gKeyCouter < CNTREPEAT) gKeyCounter++;
   else gKeyCounter = 0;
}

...

int main(void)
{
...
    /* hier: Initialisierung der Ports und des Timer-Interrupts */
...
   // hier wird auf gKeyCounter zugegriffen, dazu muss der in der
   // ISR geschrieben Wert bekannt sein.
   // (volatile -> aktuellen Wert immer aus dem Speicher lesen)
   if ( gKeyCounter > CNTDEBOUNCE ) { // Taste mind. 10*10 ms
"prellfrei"
       if (gKeyCounter == CNTREPEAT) {
          /* hier: Code fuer "Taste lange gedrueckt"
       }
       else {
          /* hier: Code fuer "Taste kurz gedrueckt"
       }
...
}



So weit so gut, aber heisst es nicht
if (gKeyCounter >= CNTREPEAT) {
in der 8. Zeile von unten?


Gruss Mode
Gast #181008
Lesenswert?

Das Repeat steht für einen langen Tastendruck. Wurde die Taste also
länger als 200 Timerintervalle gedrückt, wird ein langer Tastendruck
detektiert.
Wenn man nur Tasten enbtprellen will, kann man sich das "#define
CNTREPEAT" sparen.
Gruß Rahul
Gast #181009
Lesenswert?

boaa.. iss das früh am Morgen.
Ob man da nun ein == oder >= setzt, dürfte nicht wirklich einen
Unterschied machen, sofern die Durchlaufzeit der Hauptschleife geringer
als das Timerintervall ist. Prinzipiell wäre es besser.
Gast #181010
Lesenswert?

Aber wenn es doch == heisst wird der lange Tastendruck doch nur bei
genau 200 Timerzyklen aktiv.
Das ist doch falsch, es sollen doch mind. 200 Zyklen sein. Sonst
wuerde die lange Tastendruckfunktion in der Praxis wohl sehr sehr
selten aufgerufen
Gast #181011
Lesenswert?

Ok, das Codefragment ist von mir und ich will auch nicht behaupten, dass
es fehlerfrei ist (aus vorhandenem Code zusammengestutzt). Aber bevor
hier orakelt wird:
- Wie soll gKeyCounter groesser CNTREPEAT werden?
- Was ist denn an >= "besser"? Die Argument mit der "Durchlaufzeit"
bleibt mir verschlossen.
- Was passiert beim 256ten Timer-Hit bei "prellfrei" gedrueckter
Taste bei "eingespartem" CNTREPEAT?
- gKeyCounter != Timerzyklenzaehler
Verbesserungsvorschlaege/Korrekturen hier (werde ich dann einarbeiten)
oder aber den Code direkt korrigieren.
Schlussendlich ist es ein Beispiel, das "volatile" veranschaulichen
aber keine Musterloesung zum Entprellen sein soll.

Martin

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