Línea de base PIC12F509 Problema con la instrucción BTFSS

0

**** 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.

    
pregunta Krankshaft

1 respuesta

1

Bueno, lo descubrí y la respuesta fue bastante tonta.

Como dije antes, estaba alimentando este pequeño circuito desde PICKit3 y mi interruptor estaba en el pin MCLR deshabilitado, que cuando se desactiva se convierte en una entrada.

La respuesta es GP3 FALTAMOS, pero no por mí por PICKit3. Después de la programación, el PICKIT baja momentáneamente la línea MCLR para reiniciar el microcontrolador (la misma línea que estaba usando para mi entrada) por una fracción de segundo. Esa lógica baja fue suficiente para encender el LED en mi primer bit de código y también para encender el LED en mi segundo bit de código.

La solución fue desconectar el PICKIT después de programar y alimentar el PIC desde una fuente de alimentación externa. Cuando se alimenta externamente, el código PIC funciona como se esperaba con el LED inicialmente apagado. Eso me enseñará a tratar el pin MCLR como cualquier otra entrada.

    
respondido por el Krankshaft

Lea otras preguntas en las etiquetas