Eliminar rebotes en interruptores

#21
Hay vistos varios ejemplos puntuales empleando distintas técnicas diferentes en software tratando de no mal gastar elementos físicos que sin conocimientos puede ser un dolor de cabeza.
Ahora bien de todas las soluciones propuestas para software sucede que para el principiante también es un dolor de cabeza.

Voy a dejar varias alternativas y las iremos evaluando:
#1:
Código:
while(!input(PIN_B4));
En este caso el problema es que solo toma un rebote y se quedaría en ese bucle hasta tanto se presione/suelte el pulsador. Poco conveniente para interrupciones distantes.

#2:
Código:
boton[0]=input(PIN_a0);
     delay_ms(250);
     boton[0]=input(PIN_a0);
Este caso se emplea, por ejemplo en el PIN RA0, con un retardo preguntando luego de un instante en que estado esta el pulsador.

Ejemplo: si estoy en 1, espero (aquí suceden los rebotes de alternancia entre 1/0/1..) luego de un delay pregunto de nuevo por el pulsador, si continua en 1 es porque lo estoy pulsando y con mas retardo se puede preguntar si ya esta en 0 lo que pone en evidencia que se presiono el pulsador (es como el mouse cdo espera a que soltemos el botón al hacer click para generar el evento)
En ese caso empleo un retardo lo que puede generar conflictos en tareas en tiempo real: procesos de filtrado, audio, muestreos en Conv. A/D.

Aparentemente a velocidades de 4MHz no se producen problemas con las INTERRUPCIONES debido a que estas toman el primer cambio de estado, ahora bien si lo analizamos minuciosamente podrías tomar el rebote como muchos cambios y si la interrupción se ejecutase a esas velocidades es posible que se atienda la int tantas veces como rebotes haya.
Pero no es conveniente poner delay en INT's ya que detienen el main. Habrá que recurrir a otro algoritmo.
Soy todo oídos a mejores soluciones propuestas :apreton:
 
Última edición por un moderador:
#22
Pero no es conveniente poner delay en INT's ya que detienen el main. Habrá que recurrir a otro algoritmo.
Soy todo oídos a mejores soluciones propuestas :apreton:
Hace algún tiempo, buscando una buena solución para el problema de los rebotes en los pulsadores, encontré una librería escrita en C para PIC C Compiler.
Esta librería surge de una instrucción de PICBasic "BUTTON Pin,Down,Delay,Rate,BVar,Action,Label" que sirve muy bien para este propósito y lo que hace esta librería es muy similar, pues fue realizada para imitar a la instrucción de PICBasic, pero sin el salto a otra subrutina "Label".
El autor, del cual ya no recuerdo su nombre ni el sitio, describe detalladamente las funciones que usó para crear la rutina button, y también los parámetros a usar.

Adjunto esta librería que es de libre distribución y un ejemplo sencillo de su uso.

Suerte.
 

Adjuntos

Temas similares

Arriba