Necesitas un pequeño capacitor en el circuito para crear una constante de tiempo. Use un capacitor cerámico de 0.1uF de 25 voltios a través de las líneas del interruptor lo más cerca posible del PIC IC. Las entradas PIC tienen una impedancia muy alta y sin amortiguación captarán cualquier fuente de ruido, lo que provocará falsos disparadores.
También puede bajar su resistencia de pull-up a 2.2K para disminuir la sensibilidad de la entrada al reducir efectivamente la impedancia de entrada a 2.2K. Eso y un condensador de filtro deberían reducir mucho los falsos disparadores. El condensador podría ser tan alto como 1uF. Si es muy alta (> 10uF), la corriente de descarga quemará lentamente los contactos del interruptor.
Si está de acuerdo con el código, también puede implementar un filtro digital simple de 2 o 4 polos (Toma 3 bytes. Uno para contar si el interruptor está cerrado, otro para contar si el interruptor está abierto, otro para almacenar el verdadero / falso resultados).
El siguiente código del ensamblador es parte de lo que utilicé para filtrar entradas de contacto de relé y conmutador. No pude extraer el código principal, ya que está incrustado en muchos lugares en 13,000 líneas de código. Lea lo que he insertado, ya que detalla los procedimientos para implementar el filtro. El código es de 2001, por lo que no funcionaría en las MPU de Microchip de hoy. Ni siquiera puedo cargar mi viejo MPLAB en Windows 7, se rechaza.
FILTRO DIGITAL:
EL PIN DE ENTRADA SE LEERÁ EN UNA TASA DE 1KHZ O 100 HZ. SI EL PIN ES ALTO, 'INPUT_FIL_H' SE PRESENTA UN PASO UNO Y 'INP_FIL_L' ESTÁ DESPEJADO HASTA CERO.
SI 'INPUT_FIL_H' REACH'S 'MAX_CNT_A' THEN 'INP_FIL_STA' BIT 0 ESTÁ AJUSTADO ALTO Y BIT 1 SE ESTABLECE A BAJO Y 'INPUT_FIL_H' SE CUENTA EL VALOR CONT.
SI EL PIN ESTÁ BAJO, 'INPUT_FIL_L' SE CUENTA UNO POR UNO Y 'INP_FIL_H' ESTÁ BORRADO HASTA CERO. SI 'INPUT_FIL_L' REACH'S 'MAX_CNT_A' THEN-'INP_FIL_STA 'BIT 1 SE ESTABLECE A ALTO Y BIT 0 SE ESTABA BAJO Y' INPUT_FIL_L 'COUE VALUE SE CANCELA.
SI LA TASA DE MUESTRA ES OTRO DE 1KHZ O DE 100 HZ ENTONCES 'MAX_CNT_A / B' DEBE AJUSTARSE PARA OBTENER EL MISMO RETARDO. AJUSTE 'MAX_CNT_A / B' DOBLANDO VALORES.I.E. EL PIN DEBE MANTENER EL ESTADO PARA QUE 80MS SE ACEPTE COMO ALTO O BAJO. A 4 VECES SU VALOR TOMA 160mS PARA SER ACEPTADO COMO ALTO O BAJO.
EL SIGUIENTE BLOQUEO DEL CÓDIGO DE USUARIO LEE LOS BITS ALTOS / BAJOS DEL REGISTRO 'INP_FIL_STA' PARA DETERMINAR LA SIGUIENTE ACCIÓN.
RESERVAR RAM PARA EL FILTRO:
RES BYTE INP_FIL_STA
RES BYTE INP_FIL_H
RES BYTE INP_FIL_L
VALORES DE INICIALIZACIÓN:
HIGH EQU 0x01
LOW EQU 0x00
ZERO EQU 0x00
FULL EQU 0xFF
BIT_0 EQU 0x00; BIT '0' OF INP_FIL_STATUS REGISTRO (RAM)
BIT_1 EQU 0x01; BIT '1' DE INP_FIL_STATUS REGISTRO (RAM)
MAX_CNT_A EQU 0x28; IGUALES 40mS SI LA TASA DE LA MUESTRA ES 1KHZ, 40 LAS MUESTRAS CONTINUADAS DEBEN SER VERDADERAS O FALSAS
MAX_CNTZ__CAC ; IGUAL A 40 mS SI LA TASA DE MUESTRA ES DE 100 HZ, 4 MUESTRAS CONTINUAS DEBEN SER VERDADERAS O FALSAS
INP_FIL_STA EQU 0x00; ESTADO DEL FILTRO DE ENTRADA. SOLO SE UTILIZAN PRIMEROS 2 BITS.
INP_FIL_H EQU 0x00; CUENTA ARRIBA SI LA ENTRADA ES ALTA
INP_FIL_L EQU 0x00; CUENTA ARRIBA SI LA ENTRADA ES BAJA