www.mikrocontroller.net

Forum: Compiler & IDEs Taster entprellen aus dem Wiki


Autor: mode (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mode (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.