Leer botones e interruptores con microcontroladores PIC.




Los botones e interruptores son dispositivos que nos sirven para introducir datos a algun sistema eléctrico o electrónico. Leer botones (e interruptores) es una tarea muy sencilla, solamente hay que tener en cuenta que estos, al ser dispositivos mecanicos, no cierran (ni abren) instantaneamente sino que presentan un fenomeno conocido como rebote, que no es otra cosa mas que un ruido electrico que genera errores en al detectar que se presionó un botón y que hace que parezca que el botón se presiono muchas veces.

Teniendo en cuenta eso podemos programar algunas rutinas anti-rebotes con el pic. Dos maneras sencillas de lograrlo son: crear un ciclo para verificar el estado de un bit y no salir de este hasta que el estado sea estable; o verificar el estado de un bit, llamar a un retardo (de alrededor de 10ms, aunque este retardo depende del tipo de interruptor y no es un valor fijo) y despues volver a verificar el estado del bit, si el estado es el mismo entonces el boton se presiono.

Para el primer ejemplo vamos a utilizar el primer tipo de anti-rebote. Tenemos conectado un push-button al pin 0 del puerto A (RA0) y ocho leds al puerto B (RB0 a RB7). Para conectar el push-button se utiliza una resistencia de pull-up de 4.7k (es decir una resistencia de 4.7k conectada a Vcc), el push-button se conecta de un lado a la resistencia de pull-up y del otro a tierra de modo que el pic siempre estará leyendo un 1 lógico y al presionar el botón el estado cambiará a un 0 lógico. El programa consiste en llevar la cuenta de cuantas veces se ha presionado el botón, misma que se desplegará en el puerto B del pic, cada vez que se presione el botón la cuenta se incrementará. El codigo es el siguiente:

Código de programa  para leer botones e interruptores

Lo único nuevo aqui es la rutina que detecta que se presiona el botón y  la rutina que elimina el rebote. Para detectar que se presionó el botón se está revisando el estádo del pin 0 del puerto A con la instrucción btfsc, mientras el estado del pin sea 1 la ejecución del programa quedará ciclada en el mismo punto, una vez que el estado cambia a 0, es decir se presionó el botón, el programa salta a la rutina antirrebote. Esta rutina lo que hace es permanecer ciclada hasta que el estado del pin de nuevo sea 1, de este modo se eliminan los rebotes. Una vez que sale de la rutina antirrebotes incrementa la cuenta incrementando el puerto B y de nuevo regresa a checar el botón. Ésta es una imágen del circuito esquemático:

Esquemático para leer botones con microcontroladores PIC

Ahora veamos otro ejemplo, esta vez se conectarán 4 push-buttons en el nibble bajo del puerto B y 4 leds en el nibble alto de modo que al presionar un botón se encienda el led correspondiente. Para eso se configura el nibble bajo del puerto como entrada y el nibble alto como salida. Las rutinas de chequeo de botón y de antirrebotes ahora cambian ya que se tienen que revisar cuatro botones. El código del programa principal cambia de la siguiente manera:

Código de programa para checar botones en el PIC

El programa va checando botón a botón para saber cual se presionó, una vez que detecta que uno fue presionado llama a la rutina antirrebotes, luego llama a la rutina que enciende el led correspondiente y al regresar continua checando los botones. El circuito esquemático es el siguiente:

Diagrama para checar botones en microcontroladores

Estos dos ejemplos tambien servirían si se usan interruptores en lugar de botones, utilizando el mismo código o efectuando alguna pequeña modificación, sobre todo en la rutina antirrebotes. Para el otro tipo de antirrebotes, en el que se utiliza un retardo, se eliminaria la rutina incluida en estos dos ejemplos ya que al momento de detectar el cambio de estado lógico se debe llamar a una rutina de retardo (como ya se dijo de aproximadamente 10ms) y después volver a comprobar el estádo, si sigue siendo el mismo entonces el botón fue presionado, si no es el mismo entonces la detección fue erronea y no se toma en cuenta.

Por ahora es todo, en proximas entradas hablaré sobre las interrupciones del pic, comenzando por las interrupciones externas del puerto B. Por el momento el código de estos dos ejemplos no se puede descargar, espero solucionar ese problema pronto.


3 comentarios:

RubensaiD dijo...

Hola, primero quisiera felicitarte por tu blog, de verdad es que es muy interesante y tiene material muy útil.

Luego, quisiera hacerte una pregunta sobre esta entrada.
Cuando aplicas el primer método, el que has desarrollado en el post, una vez que detectas que ha cambiado a 0 el pin, saltas a la rutina antirebote donde lo único que espera es que el estado retorne a 1. Sin embargo, en la explicacion del segundo método mencionas que se pone un retardo y se vuelve a verificar si el valor es el mismo pues de lo contrario seria una detección erronea.
¿Como es que se produce una detección erronea? y ¿Es posible que en el primer método también se puede producir una detección erronea? ¿Por que solo en el segundo metodo se analiza la certeza del cambio de estado?

Espero puedas ayudarme con esto, y disculpa si son muchas mis preguntas.
Saludos.

Anónimo dijo...

hola:

gracias por orientarnos y ser la luz para los que apenas vamos aprendiendo a programar,

Megustaria hacer pruevas con tu programa, pero me gustaria saver como puedo adaptarlo a un pic 16f628a
__CONFIG _CP_ON&_MCLRE_OFF&_WDT_OFF&_PWRTE_ON&_INTOSC_OSC_CLKOUT
y saver que otras cosas devo tomar en cuenta

por tu atencion y ayuda,
muchas gracias

Anónimo dijo...

hola
quisera saber porque
dentro de el lenguaje de programación
colocas el "goto $+3"
quisiera saber a que se debe el "$+3"
muchas gracias.....

Publicar un comentario en la entrada

Utiliza nuestro foro de electronica si tienes dudas no relacionadas con este tema.