TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: black_flowers en 22 de Marzo de 2007, 20:19:13

Título: codigo antirrebotes
Publicado por: black_flowers en 22 de Marzo de 2007, 20:19:13
hola ando intentando hacer un pequeño codigo antirrebotes (para evitar los rebotes de los interruptores). ¿Cómo se debe hacer, con un retardo quizás? si es así... de cuanto suele ser el retardo?.

un saludo.   :mrgreen:
Título: Re: codigo antirrebotes
Publicado por: Vayadespiste en 22 de Marzo de 2007, 20:26:19
Suele ser como dices realizando un pequeño retraso, he visto muchos proyectos en el que ese retraso es de 20 milisegundos, pero claro, esto mejor que el que desarrolla el proyecto no lo sabe nadie.

Un saludo.
Título: Re: codigo antirrebotes
Publicado por: Veguepic en 22 de Marzo de 2007, 20:47:08
A parte del retardo luego puedes comprobar si el boton continua pulsado, con esto evitas que cualquier ruido pase como un disparo.

Salduos

Título: Re: codigo antirrebotes
Publicado por: manwenwe en 22 de Marzo de 2007, 20:51:24
Hola, lo que yo hacia era:

1. Cargar 128 en un registro
2. Leer la linea del interruptor... si leía un "1" incrementaba el registro en una unidad y si leía un "0" decrementaba el registro en una unidad.
3. Iba testeando el flag "C", si desbordaba por arriba estaba seguro de que había un "1" en la línea y si desbordaba por abajo había un "0" en la linea.

Nunca me falló. Y es bastante más rápido que los retardos de x milisegundos... el rizado de la señal suele ser bastante más corto...

Saludos!
Título: Re: codigo antirrebotes
Publicado por: maunix en 23 de Marzo de 2007, 11:33:05
Yo hago algo muy similar a lo de manwenwe, ocupa más variables pero es lo más efectivo.

Además, las entradas no las leo continuadamente sino cada x mili segundos porque para que la aplicación sea multitarea (requerimiento en el tipo de aplicaciones que desarrollo) el pic está haciendo muchas cosas todo el tiempo y no puedo dedicarle un tiempo de rebote a un pin de entrada cuando se deben atender otras cosas urgentes.

Título: Re: codigo antirrebotes
Publicado por: black_flowers en 23 de Marzo de 2007, 11:35:26
no entiendo como funciona este ultimo codigo, parece que está mejor que el del retardo pero la verdad no entiendo como funciona. (si pudieses explicar un poco de que va a graces rasgos sería muy útil)
con respecto al del retardo, en principio no importa mucho ya que todavía estoy probandolo, pero cuando monte el circuito utilizare unos pulsadores de estos que tienen como una goma por debajo (los que se usan en todos los aparatos digitales, relojes, teclados, telefonos mobiles, mandos...) y me imagino que tienen poco tiempo de rebote. Alguien que los haya utilizado sabe cual podría ser un delay adecuado (para no entorpecer demasiado el programa). el cristal que uso es de 4mhz pero eso no importa mucho lo unico sería saber el tiempo de rebote que suelen tener este tipo de pulsadores.


un saludo.
Título: Re: codigo antirrebotes
Publicado por: maunix en 23 de Marzo de 2007, 11:43:23
Funciona mas o menos asi

1) Cada x mseg lees los puertos. Por ej 5 mseg
2) Si el puerto está en 'alto' o 'bajo' (el nivel de señal que estas esperando), incrementas un contador.  Por ej. incf ENTRADA1,f
Si el puerto está en el valor contrario, revisas si la cuenta ENTRADA1 <> 0, si es así, lo decrementas 1.
3) Cuando la cuenta llega a 10 (ya pasaron 50 mseg en el mejor caso) das por activada la señal


Saludos
Título: Re: codigo antirrebotes
Publicado por: PalitroqueZ en 23 de Marzo de 2007, 14:29:26
también he visto que se puede hacer el retardo pero externo, a través de un circuito R-C, pero este no lo he comprobado
Título: Re: codigo antirrebotes
Publicado por: maunix en 23 de Marzo de 2007, 14:49:21
también he visto que se puede hacer el retardo pero externo, a través de un circuito R-C, pero este no lo he comprobado

Si, se usa en general para eliminar para rebotes con teclas pero la técnica de lectura que yo menciono sirve para todo tipo de señales.  A veces filtrar con RC una señal determinada no es la mejor opción por eso lo aclaro.
Título: Re: codigo antirrebotes
Publicado por: black_flowers en 23 de Marzo de 2007, 18:11:10
Funciona mas o menos asi

1) Cada x mseg lees los puertos. Por ej 5 mseg
2) Si el puerto está en 'alto' o 'bajo' (el nivel de señal que estas esperando), incrementas un contador.  Por ej. incf ENTRADA1,f
Si el puerto está en el valor contrario, revisas si la cuenta ENTRADA1 <> 0, si es así, lo decrementas 1.
3) Cuando la cuenta llega a 10 (ya pasaron 50 mseg en el mejor caso) das por activada la señal


Saludos

o sea que es algo parecido al delay pero sin dejar el programa colgado. bueno despues de todo creo que voy a optar por lo más fácil, un delay de 50mseg

gracias x vuestra ayuda.
Título: Re: codigo antirrebotes
Publicado por: maunix en 26 de Marzo de 2007, 12:01:01
o sea que es algo parecido al delay pero sin dejar el programa colgado. bueno despues de todo creo que voy a optar por lo más fácil, un delay de 50mseg

gracias x vuestra ayuda.

Jeje, es parecido pero no lo es...

Esa simple diferencia de no dejar el programa colgado , es la diferencia entre un software que atienda muchas cosas a la vez y velozmente y uno que no.

De todas formas, si no es necesario para tu aplicación puedes optar por la vía fácil sin ningún problema.