a nivel de hardware de la rutina básica de eliminación de rebotes ha de tener en cuenta los siguientes segmentos del (o de interruptor) el comportamiento de una llave física:
clave sentados quietly-> dedo toca la tecla y comienza a empujar Down-> alcances clave la parte inferior del recorrido y el dedo lo sostiene allí-> el dedo comienza a soltar la tecla y el resorte empuja la tecla hacia atrás-> el dedo suelta la tecla y la tecla vibra un poco hasta que se detiene
Todas estas etapas involucran 2 piezas de metal raspado y frotado chocando entre sí, moviendo la tensión hacia arriba y hacia abajo de 0 a máximo durante períodos de milisegundos, por lo que hay ruido eléctrico en cada paso del camino:
(1) Ruido cuando no se toca la tecla, causada por problemas ambientales como humedad, vibración, cambios de temperatura, etc.causando cambios de voltaje en los contactos clave
(2) el ruido causado que la tecla está siendo presionada hacia abajo
(3) de ruido como la tecla está siendo presionada
(4) de ruido como la clave es de ser liberado
(5) el ruido como las claves vibra después de ser liberado
Aquí está el algoritmo por el cual, básicamente, suponemos que la clave está siendo presionado por una persona:
lee el estado de la tecla, que puede ser "presionada", "definitivamente está presionada", "definitivamente no está presionada", "podría no presionarse" (nunca estamos seguros)
loop mientras que la tecla "podría ser" presionada (si se trata de hardware, esta es una muestra de voltaje mayor que algún valor de umbral), hasta que "definitivamente no" esté presionada (menor que el voltaje de umbral) (esto es inicialización, esperando ruido a inmovilización, la definición de "podría ser" y "definitivamente no" depende de la aplicación específica)
bucle while clave es "definitivamente no" presionado, hasta que la tecla "podría ser" presionado
cuando se presiona la tecla "might", comience a repetir y muestrear el estado de la tecla, y lleve un registro de cuánto tiempo se "presionó" la tecla - si la tecla vuelve a "might not be" o "definitely is not" "estado comprimido antes de una cierta cantidad de tiempo, reinicie el procedimiento - en un momento determinado (en número de milisegundos) que haya elegido (generalmente mediante la experimentación con diferentes valores) usted decide que el valor de la muestra ya no es causado por el ruido, sino es muy probable que sea causado por la clave realmente está sujetado por un dedo humano y que devuelva el valor "presionado"
while(keyvalue = maybepressed){
//loop - wait for transition to notpressed
sample keyvalue here;
maybe require it to be "notpressed" a number of times before you assume
it's really notpressed;
}
while(keyvalue = notpressed){
//loop - wait for transition to maybepressed
sample keyvalue
again, maybe require a "maybepressed" value a number of times before you
transition
}
while(keyvalue=maybepressed){
presstime+=1;
if presstime>required_presstime return pressed_affirmative
}
}
return pressed_negative
encontraron realidad, unos 10 minutos después de hacer la pregunta. Muy útil. Estoy de acuerdo con la solución de HW ... si solo ... – Benoit
@Benoit: ¡Bien, marqueme la respuesta! ;) – GEOCHET