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? 

17 comentarios:

  1. Recomendada lectura, sobre todo para quienes arrancan con microcontroladores. El tema del triestado de los pines también se toma en el charlyplexing, bastante usado en letreros pequeños de led. Un abrazo desde Córdoba y esperamos con ansias el ampli de 30w x 3!

    ResponderEliminar
  2. Hola Francisco!

    Gracias por el comentario.
    Es verdad, al comenzar es difícil encontrarle la vuelta al tema de los pulsadores, pero con este método se aprovechan todos los pines digitales!

    OK al tema del Amplificador. Tengo que comprar algo para usarlo como gabinete y quisiera hacerlo de aluminio. Apenas lo tenga, seguimos con la construcción. Falta eso y el preamplificador + control de tonos.

    Fuí al que vende aluminios y le dije que era para usar en la panadería, pero no me lo quisieron regalar ... :(

    Jaja!!!
    Abrazo!
    Mario

    ResponderEliminar
  3. Mario, muy bueno el articulo, la verdad es que nunca vi nada en basic, pase de assembler a C directo, pero entiendo el punto. tambien es bueno mencionar, que ciertos puertos de ciertos microcontroladores poseen pull-up internos, que se puede activar y de esta forma ahorrar espacio en el PCB y algunas resistencias. mi implemantacion en hardware: agrego una resistencia de 100 ohms en serie entre gnd el pulsador...
    software: en gral pregunto el estado, si es valido espero 20 ms y si vuelve a ser valido actuo en cuestion....
    muchas gracias por compartir, te encontre de nuevo sin querer... neoteo ya no es lo mismo sin vos, una verdadera lastima... saludos también desde Córdoba :)

    ResponderEliminar
  4. Gracias por el comentario y por compartir tus métodos de trabajo ante algo que parece ser muy sencillo: "sólo un pulsador", sin embargo, merece cuidados que no pueden faltar.
    Me alegra que nos encontremos nuevamente.
    Saludos Martin!

    Mario

    ResponderEliminar
  5. Excelente tu trabajo Mario.

    Neoteo cayó muchísimo luego de tu ida. Si sigue así en 1 año están cerrando ese sitio.

    ResponderEliminar
  6. Jaja, hoy en día no regalan ni las virutas. En su momento necesitaba algunas cajitas de aluminio, y acá directamente no se consiguen. Siguiendo tus consejos, investigue quién mandara samples. Me enviaron de ROLEC (Alemania) unas cajas muy buenas, no sé el tamaño que ocuparás, pero puede ser una alternativa: http://www.rolec.de/aluboxes_en.html

    Saludos Mario!

    ResponderEliminar
  7. Hola Mario , tus artículos son buenisimos, porque ya no haz publicado mas? Te agradezco por tu trabajo , la verdad es que me haz enseñado muchisimo. Neoteo cayo en completa decadencia desde que te saliste. Saludos

    ResponderEliminar
  8. Hola Mario. En linea con los comentarios que me preceden, deseo expresarte mi admiración por tu trabajo divulgativo, y tu actitud pulcra y educada que es todo un ejemplo. Yo también soy uno de los que hemos aprendido muchísimo contigo, tu forma didáctica de exponer los distintos temas, es simplemente magistral.
    Y también he dejado de visitar neoteo, por lo mismo, el formato es imposible, y ya no estás tu ( y conste que no soy homosexual, ja ja¡).
    Un abrazo desde Madrid. Gracias.

    PD. ¿hay posibilidad de enviarte un correo por privado? he desarrollado un equipo basado en PIC y me gustaría saber tu opinión, quizás pudiésemos colaborar a nivel profesional, estoy montando empresa ahora para comercializarlo.
    Chao.

    ResponderEliminar
  9. Hola Mario, espero que estes bien. ya tienes tiempo sin postear ojala solo se deba al exceso de trabajo. animo y saludos desde mexico. he aprendido mucho de vos y ya soy un poco menos boludo, je.

    ResponderEliminar
  10. Que pasa con Mario que ya no publica más?

    ResponderEliminar
  11. Esperemos que esté bien, y que pueda seguir publicando y dándonos ejemplo de ingenio y practicidad en electrónica

    ResponderEliminar
  12. Mario parece que esta bien, que ese era el pendiente que yo tenia. He hechado un vistazo al sitio http://www.servisystem.com.ar/foro/index.php y el ha estado contestando varios topicos.

    ResponderEliminar
  13. hace mucho que mario no responde en el foro ni aqui

    ResponderEliminar
  14. Volviste Mario, notable.

    Abrazo desde Montevideo

    saludos Pancho

    ResponderEliminar

  15. Hola Mario , quisiera proponerte un trabajo , como puedo hacer para tener tu email o escribirte por privado ?
    saludos
    yuri

    ResponderEliminar
  16. Fuerza Mario! queremos que vuelvas con tus videos!!

    ResponderEliminar
  17. que pasó con Mario? renunció a lo electrónico? lo último que subió al canal de youtube son dos perros y el con una manguera. Si alguien sabe algo avise. Saludos

    ResponderEliminar