**** Actualización de desplazamiento hacia abajo para obtener más información ****
He estado experimentando con un PIC12F509 y he estado escribiendo un código simple en el ensamblaje. Estoy usando el oscilador RC interno de 4 MHz.
He configurado GP3 como entrada (MCLR está desactivado) con una resistencia de subida de 10k conectada entre GP3 y VDD. Luego, un interruptor de botón pulsador empuja GP3 a tierra para encender un LED conectado a GP1, que se configura como salida y el LED se cambia a ánodo.
El siguiente código no funciona como se esperaba por alguna razón. Yo esperaría que el programa haga un bucle con el LED apagado hasta que se presione el botón y GP3 se apague, momento en el que el LED se encenderá pero no se apagará. En su lugar, se enciende tan pronto como se enciende el PIC.
La instrucción btfss debe omitir la instrucción bsf para establecer GP1 alto siempre que GP3 sea alto.
;***** MAIN PROGRAM *****************************************************
;***** Initialisation
start
movlw b'111101' ; configure GP1 (only) as an output
tris GPIO ; (GP3 is an input)
;***** Main loop
main_loop
btfss GPIO,3
bsf GPIO,1
goto main_loop
END
Pensé que era porque GPIO inicialmente no estaba definido, pero agregar clrf GPIO después de que la instrucción tris no resolviera el problema.
¿Se debe a que cuando el PIC se está encendiendo (este pequeño circuito está siendo alimentado por el programador de PICkit3) GP3 está inicialmente por debajo del umbral lógico alto para una fracción de segundo, lo que hace que se ejecute la instrucción bsf?
Por supuesto, agregando dos líneas más como esta:
main_loop
btfss GPIO,3
bsf GPIO,1
btfsc GPIO,3
bcf GPIO,1
goto main_loop
El LED se encenderá y apagará con el interruptor.
Si bien el código anterior no es muy útil, tengo curiosidad por saber por qué se enciende el LED.
Gracias de antemano.
**** Actualización ****
Probé un nuevo código que enciende y apaga el LED con una subrutina de rebote de 20 ms como se muestra. Quité el resistor de resistencia de 10k y habilité los pullups débiles internos como se ve en el código.
start
movlw b'111101'
tris GPIO
movlw b'10111111'
option
main_loop
waitdn btfsc GPIO,3
goto waitdn
movf sGPIO,w
xorlw b'000010'
movwf sGPIO
movwf GPIO
movlw .2
pagesel delay10r
call delay10r
pagesel $
waitup btfss GPIO,3
goto waitup
movlw .2
pagesel delay10r
call delay10r
pagesel $
goto main_loop
END ; directive 'end of program'
Este código también se comporta de la misma forma peculiar en que el LED se enciende cuando el PIC se enciende inicialmente. Luego se puede activar o desactivar con una sola pulsación y liberación del interruptor.