sábado, 6 de julio de 2013

Rutina Anti-Rebote para Pulsador

Una de las complicaciones que se presenta a la hora de crear una rutina anti-rebotes para pulsador, al trabajar con microcontroladores, es evitar los impulsos múltiples, los (valga la redundancia) “rebotes” que insertan dos, tres, diez impulsos en lugar de uno sólo, como sería nuestro deseo. Las soluciones que los programadores aplican son incontables. Hay decenas de ejemplos por toda la web de estas rutinas y como es lógico; cada uno de nosotros utiliza la que entiende como “la mejor” de acuerdo al lenguaje de programación que estamos utilizando.

 Un simple ejemplo de un sistema que necesita un método "Anti-Rebotes"

Mucha gente coloca un retardo de tiempo, luego de la acción de pulsar el botón y calculan un tiempo “medio” de activación para una acción “normal”. Por supuesto, el resultado es que no existen dos personas que pulsen un botón de igual modo. A unos no les actuará la acción y a otros (que se pasarán en tiempo) les avanzará, por ejemplo un menú, en varias secciones. De manera irremediable, cuando a un equipo lo manipulan muchas personas, es imperioso incorporar un sistema que no falle y nos garantice que el sistema actúe sin errores, ante todo tipo de usuarios. Hay una rutina (que es mi preferida) que utilizo en BASIC y que es la siguiente:


 La rutina del lazo infinito para asegurar el momento en que el botón deja de ser pulsado

Utilizando un pin I/O cualquiera, en este caso el pin 7 del Puerto B, aprovecho a darle tres funciones al pin. Lo utilizo para trabajar con el programador mediante el modo ICSP, para activar un LCD alfanumérico (D7) y, como lo mencionamos, para un pulsador. Esta acción vale tanto para el pin RB7 como para el RB6. Claro está, de este modo puedes utilizar cualquier pin I/O del microcontrolador que esté configurado como salida (LED, Dispaly, Relé, etc.). La rutina es sencilla y se corresponde con el siguiente circuito:

 Circuito clásico, multifunción, con entradas y salidas simultáneas.

Lo primero que hacemos es crear un punto en la estructura del programa donde SW1 tenga la posibilidad de ser pulsado y de generar un estado lógico bajo que actúe del modo en que deseamos. Podemos hacer un “barrido”, o una lectura secuencial de múltiples pulsadores, conectados a diferentes pines I/O del microcontrolador en esa parte del software, nosotros te mostramos una. Con la instrucción TRISB.7 = 1 transformamos el pin en entrada y luego observamos su estado lógico. Si es “activo”, es decir, si está presionado, nos mantenemos dentro del lazo infinito hasta que cambie de estado. En nuestro caso, que retorne a un “1” lógico mientras está configurado como entrada. Cuando ello ocurre, el programa sale del lazo infinito y retorna (RETURN) al punto donde fue ejecutada la rutina de “observación de nivel lógico” del pulsador. 

Por supuesto, la explicación vale para conmutar el pin a un estado alto o bajo. Nosotros empleamos la técnica de hacerlo a GND, pero sin problemas se puede hacer a Vcc, invirtiendo las resistencias. Esto es: 47K a GND y 4K7 a Vcc intercalando allí el pulsador. La situación de “activo” se presenta entonces como un “1” lógico en la entrada. Debemos tener muy presente de asegurarnos la configuración TRIS del pin para no cometer errores y lograr que todo funcione de manera adecuada, sin errores. Por último, también puedes lograr el mismo resultado utilizando la siguiente combinación:

 Si el GOTO no es de tu agrado, aquí tienes el mismo ejemplo con WHILE-WEND

La solución es la misma, se realiza en un solo renglón y no utiliza la "endemoniada" instrucción GOTO, que muchos no admiten, y que se adecúa más a una rutina para utilizar en lenguaje C. También se puede adaptar una rutina con REPEAT-UNTIL para este mismo propósito y muchos otros métodos que seguramente tú habrás ensayado con éxito.¿Qué método utilizas para realizar un sistema “Anti-Rebote” de un pulsador mediante la programación? ¿Te manejas con un Timer que controlar el estado del pulsador en forma repetitiva? Hay tantas preguntas como opciones de trabajo cuando hablamos de pulsadores. ¿Deseas compartir tus rutinas con nosotros y los lectores?