Tengo una pregunta con respecto al debouncing del switch. Estoy usando un PIC12F509 y el oscilador RC interno que funciona a 4 MHz.
Enciendo y apagando un LED conectado a GP1 (salida) a través de un interruptor de botón momentáneo en GP3 (entrada) que se mantiene alto a través de una resistencia de 10 K cuando el interruptor está abierto. Estoy usando la siguiente macro y el siguiente código para deshacer el interruptor de botón pulsador. Utiliza el temporizador 0 configurado a una escala 1: 256.
Espera hasta que los contactos hayan permanecido en el mismo estado (abierto en este caso) durante 10 milisegundos antes de ejecutar el resto del código. Si rebotan (bajan) el temporizador 0 se reinicia.
DbnceHi MACRO port,pin
local start,wait,DEBOUNCE
variable DEBOUNCE=.10*.1000/.256 ; debounce count = 10ms/(256us/tick)
pagesel $ ; select current page for gotos
start clrf TMR0 ; button down, so reset timer (counts "up" time)
wait btfss port,pin ; wait for switch to go high (=1)
goto start
movf TMR0,w ; has switch has been up continuously for
xorlw DEBOUNCE ; debounce time?
btfss STATUS,Z ; if not, keep checking that it is still up
goto wait
ENDM
main_loop
; wait for button press
wait_dn btfsc GPIO,3 ; wait until button low
goto wait_dn
; toggle LED
movf sGPIO,w
xorlw b'000010' ; toggle shadow register
movwf sGPIO
movwf GPIO ; write to port
; wait for button release
DbnceHi GPIO,3 ; wait until button high (debounced)
; repeat forever
goto main_loop
END
Ahora en mi pregunta hasta ahora, he estado lanzando y soltando el botón. Me ha llamado la atención en el tutorial que sigo, que normalmente no es necesario rebatir tanto al presionar como al soltar un interruptor.
Puedo entender por qué, en teoría, porque después de que el interruptor se lee tan bajo a través de la instrucción btfsc (incluso si es momentáneo porque los contactos están rebotando). El LED se enciende y el código alto de rebote esperará hasta que los contactos se abran y dejen de rebotar antes de ejecutar el goto para hacer un bucle del código desde el principio.
En el lado positivo esto guarda la memoria del programa. Pero si algo parece demasiado bueno para ser verdad, generalmente, ¿cuáles son los peligros potenciales de este método?
Obviamente, para una aplicación simple como esta, el código es excesivo. Pero para algo más crítico, como poner el PIC en modo de suspensión y despertarse de un cambio de pin, debe eliminarse cualquier rebote para que el micro ingrese al modo de suspensión de manera confiable.
¿Cuáles son sus opiniones sobre el debouncing de conmutadores: rebote la prensa y el lanzamiento o solo uno?
Mis agallas me dicen que me ponga el cinturón y los tirantes y que solo los rebote para estar a salvo, pero no tengo ninguna razón lógica para ello.