Forum: Compiler & IDEs Taster entprellen aus dem Wiki


von mode (Gast)


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

von Rahul (Gast)


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

von Rahul (Gast)


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.

von mode (Gast)


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

von mthomas (Gast)


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

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.