Paso 2: Software contra rebotes
Así que ¿por qué necesitamos ir sobre un nuevo método cuando uno parece funcionar bien? Bien, el método de software debounce es esencialmente libre si lo permite el ciclo de programa espacial y el microcontrolador. Con sólo unas pocas líneas de código, puede proporcionar mucho más control sobre cómo los métodos debouncing funcionan con el botón te está usando. Contra rebotes en hardware pueden añadir costes adicionales a cada tablero desarrollado, y es más difícil de determinar una buena contra rebotes para todos los interruptores de botón que se utilizará. Sin embargo, si desea conservar los ciclos de ejecución del programa, es mejor ir con la ruta del hardware.
Mi método de contra rebotes con software utiliza solamente dos variables que miden el nivel de confianza de la prensa del botón actual. Con la ayuda de la variable presionada en el botón contra rebotes, habrá un flujo de 1 cuando se presiona el botón y una corriente de 0 cuando se suelta el botón. Si allí está rebotando en, la corriente de 1 o de 0 será muy corta, así que podemos aprovechar de este mediante la introducción de dos variables que miden la longitud de estas corrientes. Las variables se llaman, Pressed_Confidence_Level, para medir el estado presionado del botón y Released_Confidence_Level para medir el estado liberado del botón.
Así que, si se presiona el botón, el Pressed_Confidence_Level se levantará y lo mismo con Released_Confidence_Level cuando se suelta el botón. Sin embargo, estas variables también se convierten en restablecer a 0 si existe la condición opuesta. Por ejemplo, dicen que se presionó el botón por una vez y el Pressed_Confidence_Level se convirtió en un número muy grande, como 153.356. Si se suelta el botón (o un rebote sucedió), se reiniciará la variable a 0. El truco de estas variables es determinar un buen umbral para determinar una buena pulsación o liberación de estado. Decir, si la Pressed_Confidence_Level muestra que después de levantarse a 500, que este número s una fuerte indicación de una prensa del botón, a continuación, el LED cambiará una vez. Lo mismo pasa con el Released_Confidence_Level porque rebote podría suceder también en un comunicado de botón. Por lo tanto, vamos a ver cómo hacemos esto en el código:
int main(void) { DDRB |= 1 << PINB0; //For Notes on what these actions mean PORTB ^= 1 << PINB0; DDRB |= 1 << PINB2; DDRB &= ~(1 << PINB1); PORTB |= 1 << PINB1; int Pressed = 0; int Pressed_Confidence_Level = 0; //Measure button press confidence int Released_Confidence_Level = 0; //Measure button release confidence while (1) { if (bit_is_clear(PINB, 1)) { Pressed_Confidence_Level ++; //Increase Pressed Confidence Released_Confidence_Level = 0; //Reset released button confidence since there is a button press if (Pressed_Confidence_Level >500) //Indicator of good button press { if (Pressed == 0) { PORTB ^= 1 << PINB0; PORTB ^= 1 << PINB2; Pressed = 1; } //Zero it so a new pressed condition can be evaluated Pressed_Confidence_Level = 0; } } else { Released_Confidence_Level ++; //This works just like the pressed Pressed_Confidence_Level = 0; //Reset pressed button confidence since the button is released if (Released_Confidence_Level >500 { Pressed = 0; Released_Confidence_Level = 0; } } } }