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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.