Eliminar rebotes en interruptores

He leido por ahi que para eliminar los rebotes que se producen al cerrar un interruptor conectado a la entrada de un microcontrolador hay poner un condensador en paralelo con el interruptor. La pregunta es: De que valor deberia ser este condensador??

Y otra duda que tengo es si en un PIC 16F877A puedo conectar el pin MCLR directamente a 5 V o debería pasarlo primero por una resistencia para limitar la corriente?? En principio no tengo intención de ponerle ningun pulsador de reset. Así simplifico algo el circuito.
 
Para eliminar rebotes lo puedes hacer de dos formas, una es si estas trabajando en lenguaje assembler es preguntar primero por el activo de tu sensor y despues que se haya pulsado preguntar hasta que se haya soltado. Ejemplo, tengo por RC0 un interruptor activo alto

pregunta1 btfss portc,0
goto pregunta1
pregunta2 btfsc portc,0
goto pregunta2
goto lo_que_quieras_hacer

Otra forma de eliminar los rebotes sobre todo si se trata de sensores y los mismos generan una interrupcion es llamar a un tiempo de aprox 200mseg justo a la entrada de la interrupción, así se eliminan los falsos activos de los sensores/interruptores.

El MCLR lo puedes probar con una resistencia a VCC, esta resistencia puede ser de 10k por ejemplo. Saludos.
 
Eliminarlos por software ya lo habia pensado pero si se puede por hardware con solo un condensador lo prefiero. Respecto a lo del MCLR me referia a si es obligatorio poner esa resistencia o tambien puedo conectarlo prescindiendo de ella??
 
Para el MCLR es necesario la resistencia precisamente para limitar la corriente y proteger el pic, sobre los rebotes, por supuesto que los puedes eliminar con capacitores pero yo digo que si puedes eliminar hardware mediante programacion lo hagas
 
hawk360 dijo:
He leido por ahi que para eliminar los rebotes que se producen al cerrar un interruptor conectado a la entrada de un microcontrolador hay poner un condensador en paralelo con el interruptor. La pregunta es: De que valor deberia ser este condensador??
100 nF funcionaría bien pero depende también del tipo de pulsadores que tengas.

Por software es también aconsejable pero yo pondría un delay de unos 5mseg entre deteccion y detección porque si lo haces asi sin más, un pic puede procesar eso en 1useg (a 4Mhz) o 0.2useg (a 20MHz) y realmente no habrás eliminado ningún rebote.


hawk360 dijo:
Y otra duda que tengo es si en un PIC 16F877A puedo conectar el pin MCLR directamente a 5 V o debería pasarlo primero por una resistencia para limitar la corriente?? En principio no tengo intención de ponerle ningun pulsador de reset. Así simplifico algo el circuito.

El RESET se debe dar cuando el pic está alimentado. El reset consiste en poner el pin MCLR en bajo. Si tu pic está alimentado y el reset está unido a esa alimentación, no tendrá tiempo de resetearse. Alguna vez lo hará, alguna vez no.

Consejo, una una resistencia de 4k7 de Vdd a MCLR. Y un capacitor de 0.1uF de MCLR a GND. Eso no fallará.

Además te evitas que cualquier ruido en la fuente resetee tu pic.

saludos
 
maunix dijo:
El RESET se debe dar cuando el pic está alimentado. El reset consiste en poner el pin MCLR en bajo. Si tu pic está alimentado y el reset está unido a esa alimentación, no tendrá tiempo de resetearse. Alguna vez lo hará, alguna vez no.

Consejo, una una resistencia de 4k7 de Vdd a MCLR. Y un capacitor de 0.1uF de MCLR a GND. Eso no fallará.

Además te evitas que cualquier ruido en la fuente resetee tu pic.

saludos


Quieres decir que si yo desconecto el PIC no se resetea??? Un poco raro no? Todos los registros del PIC se guardan en memoria RAM y esta cuando no esta alimentada se borra.
 
hawk360 dijo:
Quieres decir que si yo desconecto el PIC no se resetea??? Un poco raro no? Todos los registros del PIC se guardan en memoria RAM y esta cuando no esta alimentada se borra.

hawk360, yo no he dicho tal cosa, ¡No se como has hecho para interpretar mi post de esa forma!


pic-man dijo:
maunix se refiere al reset que se da por el MCLR, pero si, cuando se desconecta el micro tambien se hace un reset

gracias pic-man por interceder jeje, No me conecto seguido a este foro, pero es así.
 
hola a todos

estoy programando un 16f877. tengo dudas sobre la actuacion del reset en el pic. he estado trasteando con el datasheet pero no encuentro respuesta. cuando pulso el reset del circuito se manda una señal al pic, pero que pasa dentro del pic??

la pregunta en cuestion es:

yo tengo un reset inicial que siempre se lleva a cabo cuando se inicializa el pic. dentro de ese reset considero la configuracion de puertos y del pic en general, ya que sino el pic no tendria estrucutra creada.

hasta ahi creo que todo bien, pero si ademas tengo un pulsador para resetear en cualquier momento..... ¿como puedo hacerlo? igual no me explico bien, pero es que no entiendo bien si tengo que crear una subrutina especial o q.

gracias.
 
Un saludo para todos, en verdad no creo que por software sea la mejor forma de desacernos de los rebotes. PREGUNTO: en tal caso que estuvieramos enviando, controlando, comunicando o recibiendo información, esta demora por software no interrumpiria algun proceso?

Pues esta claro que el que anda en este mundo de los pic ya todo lo hace en microsegundos, pero algunas veces estas demoras con bucles por software o por poolling no son recomendadas. Imaginense ustedes controlando una carga con respecto a una señal de cruce por cero, y de repente el usuario modifica el programa, me refiero a que cambia el programa, (interactua), el pic lo que debe saber es que eso paso y cambiar su proceso, pero se imaginan mientras que espera a que termine el rebote para no recibir ordenes que el usuario no desea.

Ojala no alla sido tan espesa la comunicacion. Anexo un informe sobre estos rebotes y como tratarlos con integrados discretos.

Un saludo desde la bella capital de Colombia.


La pereza anda tan despacio, que la pobreza no demora en alcanzarla.
Benjamin Franklin
 

Adjuntos

  • rebotes_581.doc
    61.5 KB · Visitas: 1,199
Hola a todos, he estado leyendo sus comentarios y necesito ayuda para mi tesis. El que me pueda ayudar se lo agradecere mucho.
Mi tesis trata entre otras cosas de programar el kit de entrenamiento de mp 8085 , para el cual tengo que usar las interrupciones especificamente una cualquiera, mi duda esta en como eliminar el rebote,podria hacerlo por software?, tengo que tener en cuenta que el mp debe leer un puerto el cual es el que produce dicha interrupcion.
 
La verdad que no lei todo el tema pero estas son mis recomendaciones:

Hardware:
Si usas capacitor, te comento que yo use entre 10nF y 100nF y andan joya.

Software:
Si estas programando en assembly tenes dos posibilidades:
-Una es que presionar el pulsador sea el evento de interrupcion, por lo que al entrar en servicio de interrupcion haces esto:

Código:
call Retardo_20ms
btfss Pulsador     ;o btfsc si estas usando logica negativa
retfie
.
.
resto del servicio de interrupcion
.
.
retfie

y si estas encuestando constantemente al pulsador (polling) haces esto:

Código:
Polling
    btfss Pulsador     ;o btfsc si estas usando logica negativa
    goto $-1         ;como no esta presionado vuelve un paso atras
    call Retardo_20ms   
    btfss Pulsador     ;o btfsc si estas usando logica negativa
    goto Polling
    .
    .
    resto del programa
    .
    .

saludos
mano.
 
:LOL:
Gracias por la ayuda , pero
voy a explicar con mas detalle a lo que me refiero.
la cuestion es que tengo 4 pulsadores acoplados a un puerto,lo que necesito es que al presionar un de estos se genere una interrupcion la cual llamara una subrutina que recoja el dato que hay en ese puerto.
Mi idea es hacer un circuito que active la interrupcion, y como me elimino el efecto rebote del que les hable.
denme una manito en eso

saludos a todos
 
se entra en servicio de interrupcion cuando sucede un evento especifico, por ejemplo, cuando finaliza de escribir la eeprom, cuando se rebalsa el timer o cuando hay una interrupcion externa por cambio de nivel.

un circuito para activar la interrupcion es simplemente un pulsador y una pull-up/down (en el caso de que el puerto del pic no tenga pull-ups integradas) conectados a los terminales de interrupcion.

el rebote de los pulsadores, cuando estas hablando de un diseño con pics, se recomienda eliminar por software (retardo de 20ms que le da tiempo para que el pulsador se estabilice mecanicamente).

el tema de las interrupciones en pic es que este tiene solo un servicio de interrupcion y para saber la fuente de la misma tenes que hacer una encuesta entre todas las posibles fuentes (las que tengas activadas, sino tenes activada la interrupcion por finalizacion de escritura de eeprom, no vale la pena incluirla en la encuesta), una vez identificada la fuente, actuar en consecuencia.

bueno... cualquier cosa escribi...
 
despues de tener implementado los circuitos para eliminar el rebote,le puse condensadores de 100nf .La pregunta es si ya con esto activo la interrupcion,para leer el puerto realizo un retardo de 20 ms y ya , el problema mio es como lograr la interrupcion.
Aqui va el manual del kit para que veas mas claro a lo que me refiero.
como veras en el circuito tengo acceso a la interrupcion RST 6.5 del micro , el puerto que tiene que leer es el pto A del 8155
para generar la int atraves de cualquiera de los cuatro pulsadores tengo un cto con tres OR conectadas a la salida al pin 49
del J1 del cto que esta en el manual.
Saludos a todos y disculpa que moleste tanto.
 

Adjuntos

  • up2000_usersmanual_178.pdf
    281.2 KB · Visitas: 250
he aquí un código en lenguaje assembler para eliminar el efecto rebote aplicando lo que dice el amigo CYKARIO, en este programa la entrada RC0 es activo baja, sin embargo en esta aplicación esta entrada controlada por un switch hace las veces de un pulsador, es decir, sólo se activa si el switch está en cero y además este circuíto tiene la particularidad que se deseaba que al resetear el PIC el valor de la salida fuera 1 como valor inicial (Led encendido, por ejemplo), la salida se asignó al pin RA5 y el PIC utilizado un 16f877, el código está en lenguaje ASSEMBLER

list p=16f877
include "p16f877.inc"

org 0x00
goto inicio
org 0x05
inicio
bsf status,RP0
movlw 0x20
movwf TRISA
movlw 0x06
movwf adcon1
movlw 0x00
movwf trisc
bcf status,RP0
bsf portc,0
CICLO1 btfsc porta,5
goto CICLO1
CICLO2 btfsc porta,5
goto CICLO2
movlw 0x01
xorwf portc,1
goto CICLO1
goto CICLO2
END
 
Simple, lees el pin y esperas un tiempo (250ms quizas) y luego vuelves a leer. Si las dos lecturas estan en 1 esta presionado, si no es falso positivo.

atte
jvk85321
 
Atrás
Arriba