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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.