⚡ Descuentos en cursos en video - Lleva tu aprendizaje técnico al siguiente nivel y aprovecha precios especiales antes de que termine la oferta. 🔥 Aprovechar oferta ahora 🔥
Electrónica y Diseño de Circuitos

codigo antirrebote para pulsos de timer 555

tec.inca
hace 1 año
hace 1 año
Estimados buenas tardes, mi programa funciona en pic 16f84a; solo quiero mejorar el codigo antirrebotes que es causa de los pulsos del timer 555.
Les muestro el codigo.
 if(input(PIN_A0)==1)
    {
        while(input(PIN_A0)==1);
        delay_ms(100);
         if((input(PIN_A0) == 1) && (x==1))
        {
         contador1++;    
*a pesar del antirrebote, se sigue filtrando rebotes, estoy utilizando al 02 timer 555 como entrada en el puerto A1 y A0. los pulsos son de 0.5 segundos aprox.
como podria mejorar el codigo, e realizado varias pruebas  a mejorado pero no tengo el resultado esperado.
agradeciendo de antemano sus consejos.

Hernan Cass
Hernan Cass
17.886
hace 1 año

Comenta lo que quieres hacer. Estas usando un 555 como generador de pulsos y eso los quieres contar con un PIC?

Responder
tec.inca
hace 1 año

buenas noches, si ; el timer 555 genera pulsos y son entradas en los puerto A0 y A1, estoy contando los pulsos para una secuencia.
solo quiero mejorar la parte de antirrebote; ya que los pulsos del timer genera rebotes

Responder
Hernan Cass
Hernan Cass
17.886
hace 1 año

Tienes un solo timer conectado a 2 puertos?

Responder
tec.inca
hace 1 año

son 02 timer cada uno en un puerto

Responder
Hernan Cass
Hernan Cass
17.886
hace 1 año
hace 1 año
Vos estas programando en C y no te pregunté con cual compilador. Yo hice poco en Pic y en Assembler allá por el 2002 y hace años que no hago nada, así que no me acuerdo mucho...
Por el tema de los Timers 555 en si, estos generan una buena onda cuadrada a su salida así que no precisarían ningún tipo de antirrebote (esto se usa en botones mecánicos porque los contactos SI rebotan a nivel microscopico). 
Se supone que los pulsos llegan al Pic con la amplitud requerida de 5V, no sea que estés tomando señal entre una resistencia y un led y esté llagado 3 voltios y el Pic no pueda distinguir si es pulso alto o bajo. También puede que haya interferencia de algún tipo, une bien las masas de todos los integrados y setea como salida TODOS los pines que NO USES para que no actúen como antenas que puedan corromper los registros internos.

Ese tipo de entradas normalmente se resuelve mejor por interrupciones, creo que se podía configurar el puerto B4 a B7 para que atiendan interrupciones https://www.teachmemicro.com/pic-interrupt-pic16f84a/ fijate en "RB Change" de esta manera cuando hay un cambio de flanco, o sea el pulso sube o baja se genera una interrupción que la resolves rápidamente en un código corto. No se como se maneja eso en tu compilador.
El problema que veo al hacer Pooling es que mientras un timer  tiene un pulso alto te quedas dando vuelta en el while y no atiendes lo que ha pasado con el otro timer. 
Por ejemplo mientras el timer 1 estuvo con el pulso alto, estuviste dentro del while y tal vez no viste 10 pulsos que ocurrieron en el timer 2. Este es el tipo de problemas que ocurren con el pooling, es la razón por la cual si tienes un boton apretado y aprietas otro no lo reconoce es como que el pic se cuelga mientras tengas apretado uno de los botones. 

En el caso de hacerlo con interrupciones la idea básica es que si hubo un cambio (subió o bajó el pulso) en alguno de los pines B4 a B7 se llama a interrupción, sospecho que el código quedaría algo así (solo la idea no es código funcional):

En el programa principal tenes que tener guardado el estado del pin.
(variables ValB4, ValB5, etc)

Rutina ISR {
//Revisas uno por uno en cual de los pines hubo cambio  (ves el valor almacenado de B4 contra inputB4) y  ves que hacer si discrepa, si hubo cambio almaceno el nuevo valor y veo si el nuevo valor es 0 (flanco descendente) entonces aumento el contador.
  
If input(PIN_B4) != ValB4) { ValB4=Input(PIN_B4); If ValB4==0 {ContadorB4 ++;} ;}
If input(PIN_B5) != ValB5) { ValB5=Input(PIN_B5); If ValB5==0 {ContadorB5 ++;} ;}
 
}//cerras la rutina así el programa continua.

Como te dije no se que compilador usas, estoy re-oxidado al respecto y no tengo forma alguna de probar nada de esto, así que solo te tiro un par de ideas. Espero te sirvan.
Saludos
aneto
aneto
3.785
hace 1 año

Hola, buenos días
Con vuestro permiso y por intentar ayudar, decir que estoy de acuerdo con Hernan que la señal de salida del 555 no debería tener rebotes. No sea que provengan de ruidos, interferencias o harmónicos de la alimentación que utilizas.
También preguntar, ¿cómo estás acoplando la salida del 555 con los inputs del pic? Podría mostrarlo? Tienes bien las referencias a masa? En algún estado se queda la entrada abierta? Sin referencia a masa o Vcc?
Y en cuanto a las intrucciones...

Responder
aneto
aneto
3.785
hace 1 año

... yo haría un loop durante unos milisegundos para confirmar que es un pulso y no una interferencia. O sea, tienes un pulso de 500ms y puedes leer durante 300ms, (haciendo lecturas consecutivas de ése input) por ejemplo, después del cambio de estado y si se mantiene, puedes confirmar que es un pulso.
No se, es una idea más
Saludos

Responder
tec.inca
hace 1 año

Gracias Hernan entiendo tu comentario, voy a hacer las pruebas respectivas, buena perspectiva.

Responder
tec.inca
hace 1 año

Aneto, esta muy buena la idea que tienes, los pulsos van directo a la entrada A1 y A0; explico un poco: el programa consiste en contar una cantidad de pulsos determinada en el programa y condicionada a través de una secuencia y variable; osea contara cuando continué la siguiente secuencia; solo tengo problemas cuando extiendo el tiempo de cada pulso en el potenciometro del timer. al parecer el tiempo del mientras osea el while; queda corto. por que al extender ese tiempo del while, funciona.

Responder
tec.inca
hace 1 año

Pero el detalle es que una ves que la tarjeta este lista cada vez que se regule el tiempo de cada pulso tendrá problemas en un determinado rango. por eso pido consejos que son muy buenos por parte de ustedes.

Responder
aneto
aneto
3.785
hace 1 año

Hola. Por si acaso, algunas consideraciones. En la salida tienes que conectar una resistencia a masa para que no quede al aire. Comprueba con el osciloscopio si se generan ruidos en la señal de trigger o la señal de threshold en el 555 al mover el potenciómetro.
También, por dar otra idea, yo a veces, en lugar de leer un nivel alto como variable =1, utilizo la instrucción de ADC (conversión analógico a digital) y el valor se lo asigno a una variable de manera que un estado bajo es un valor ....

Responder
aneto
aneto
3.785
hace 1 año

... analógico bajo (50 por ejemplo) y un estado alto, el pulso, es un valor alto (230 por ejemplo).

Responder

¿Conoces una solución?

¡Aprende a reparar con estos cursos YoReparo!

4.84
(25)

Curso Práctico de Reparación y Bobinado de Motores Eléctricos

Héctor Castiñeira
$ 60 USD
$ 20 USD
4.71
(7)

Curso TV OLED y QLED con el Ing. Picerno

Ing. Alberto H. Picerno
$ 29 USD
$ 10 USD
4.64
(45)

Curso Tecnología Inverter - Fabricación de probadores y herramientas

Yamil Alarcón
$ 240 USD
$ 40 USD
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos?
Regístrate gratis