Necesito detectar si se presionó un interruptor durante más de un tiempo establecido, sin usar ningún registro de temporizador en mi código incrustado.
Estoy usando el software debouncing de la siguiente manera para detectar un interruptor normal presionando.
int buttonPress (void)
{
static int downCount= 0; // static = value isn't lost between calls.
int currentButton = ((IO0PIN & 0x00000200) == 0x00000200);
if (currentButton ) { // button is down
if (downCount == 5) { // button has been down for 5 counts
downCount++; // increase the count so we don't trigger next time
return 1;
} else { // some count other than 5
if (downCount < 5) // increase if it's less than 5
downCount++;
}
} else { // button is up
downCount = 0;
}
return 0;
}
Sin embargo, me gustaría detectar si este botón se ha presionado durante 5 segundos o más. El problema al que me enfrento es que parece que no puedo contar hasta 300,000 y, si no se alcanza, recurra al downCount
original de 5 para marcar como una pulsación normal del botón.
(Dado que la velocidad de reloj de mi microcontrolador es de 60 MHz, tardará 5 segundos en llegar a 300,000).
He jugado un poco con la lógica de la siguiente manera, sin embargo, en el caso que se muestra a continuación, debido a la introducción de la declaración while
, cuento hasta 300,000 independientemente de cuánto tiempo se ha presionado el botón.
if (currentButton ) { // button is down
if (downCount == 5) { // button has been down for 5 counts
downCount++; // increase the count so we don't trigger next time
while (downCount > 5) {
if (debounce == 300000) {
flag_5SEC = 1;
} else if (debounce < 300000) {
debounce++;
}
}
return 1;
} else { // some count other than 5
if (downCount < 5) // increase if it's less than 5
downCount++;
}
}
¿Algún consejo o sugerencia sobre cómo realizar esta tarea?
Nota : quiero detectar un interruptor más largo presionando explícitamente en el código de rebote anterior, ya que hacer cualquier otra cosa puede tener efectos secundarios adversos en el resto del código, que otra persona había previamente escribió.
He logrado completar la tarea mencionada anteriormente utilizando temporizadores, sin embargo, desde entonces, he usado todos los registros de temporizadores (y resistencias de coincidencia disponibles) para tareas más importantes dentro del mismo proyecto.
No necesito detectar un retraso de tiempo preciso, simplemente si el botón ha estado inactivo durante más de, por ejemplo, 2-3 segundos.
El comentario de @DiBosco aclara aún más:
Entonces, lo que estás diciendo es que si presionas un interruptor, por ejemplo, veinte cuentas y se libera, actúa como una presión normal que hace una función, y si se presiona y se mantiene presionada durante dos segundos aproximadamente. realiza una función diferente ...