Gast
#181007
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