Problema con la función GP2/T0CKI del PIC12F508

Hola, necesito ayuda con la función GP2/T0CKI del pic12F508
Quiero programar ese pin como una salida para encender un LED, he leído un poco y dicen que hay que configurarle su función para deshabilitar el reloj interno, pero no sé como declararla en ensamblador.

He aquí un poco del código
Código:
ORG 0X1FF                ;VECTOR DE RESET
    ORG 0X00                        ;INICIO DEL CODIGO
    MOVWF OSCCAL                      ;RECUPERAR VALOR DE OSCILADOR
    MOVLW b'111011'            ;0 = salida, 1 = entrada
    TRIS GPIO
    CLRF  GPIO,0                ;BORRO LA SALIDA
    
INICIO

PARPADEO
    BSF              GPIO,2
    CALL      TIEMPO
    BCF       GPIO,2
    CALL      TIEMPO    
GOTO INICIO

TIEMPO                                
                movlw     .34            
                       movwf     TIEMPO3        
            MOVLW      .1            
            MOVWF      TIEMPO4         
DECREMENTO  clrwdt                    
                    decfsz    TIEMPO3,1      
                   goto      DECREMENTO    
                DECFSZ      TIEMPO4,1        
            GOTO      DECREMENTO    
               clrwdt                    
            return 
END
 
Última edición por un moderador:
Para utilizar GP2 como salida, debes configurar el registro OPTION
Algo así:
movlw b'11000000' ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
option

Debes leer la hoja de datos para conocer bien el PIC con el que vas a trabajar.

Nota que tienes un error en la instrucción CLRF GPIO,0
Porque la instrucción CLRF solo acepta un operando y aparte GP0 lo tienes configurado como entrada.
Debe ser así: BCF GPIO,2
Ó así: CLRF GPIO ; Pone en 0 los bits configurados como salida.

Un código funcional para hacer parpadear un LED cada 500Ms, por GP2 sería de esta forma:

Código:
    list    p=12f508
    include    p12f508.inc
    __config    _IntRC_OSC & _WDT_OFF & _MCLRE_OFF

    cblock    0x07
    cnt1,cnt2,cnt3
    endc

    org        0x1FF            ; Vector de reset.
    org        0x00            ; vector de inicio del código.

inicio
    movwf    OSCCAL            ; Recuperar el valor de fábrica para el oscilador interno.
    movlw    b'11000000'        ; GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
    option
    movlw    b'111011'        ; GP2 como salida.
    tris    GPIO

programa
    bsf        GPIO,2            ; Enciende LED
    call    retardo_500ms    ; Retardo de 500Ms.
    bcf        GPIO,2            ; Apaga LED
    call    retardo_500ms    ; Retardo de 500Ms.
    goto    programa        ; Bucle infinito.

retardo_500ms
; 499994 ciclos
    movlw    0x03
    movwf    cnt1
    movlw    0x18
    movwf    cnt2
    movlw    0x02
    movwf    cnt3
retardo_500ms_0
    decfsz    cnt1,f
    goto    $+2
    decfsz    cnt2,f
    goto    $+2
    decfsz    cnt3,f
    goto    retardo_500ms_0
; 2 ciclos
    goto    $+1
; 4 ciclos (incluyendo call)
    retlw    0x00

    end
Suerte.
 
Última edición:
Gracias D@rkbytes, ya esta funcionando tal cual como dices, pero ahora tengo un problema con GP3, que es el mismo pin de MCLR y Vpp, quiero hacer funcionar en ese pin un pulsador para indicarle que vuelva a encender el LED, pero realmente no puedo hacer que se espere el ciclo hasta que reciba la señal.


Código:
ORG 0X1FF                ;VECTOR DE RESET
    ORG 0X00                ;INICIO DEL CODIGO
    MOVWF OSCCAL
    MOVLW b'11000000'
    OPTION
    MOVLW b'111010'            ;0 = salida, 1 = entrada
    TRIS GPIO
    CLRF GPIO                ;BORRO LAS SALIDAS
    
INICIO
    CALL     RETARDO
    GOTO     CICLO
CICLO
   BSF        GPIO,2            ; Enciende LED
    CALL    RETARDO
    BCF      GPIO,2            ; Apaga LED
    CALL    RETARDO
GOTO BOTON
BOTON
    BTFSS    GPIO,3
    GOTO     $-1
    GOTO       CICLO
END
 
Última edición por un moderador:
Gracias D@rkbytes, ya esta funcionando tal cual como dices, pero ahora tengo un problema con GP3, que es el mismo pin de MCLR y Vpp, quiero hacer funcionar en ese pin un pulsador para indicarle que vuelva a encender el LED, pero realmente no puedo hacer que se espere el ciclo hasta que reciba la señal.
Por aquí ya te había mostrado cómo comprobar el estado de un pin y no volver a repetir el ciclo hasta que se libere el pulsador.
Lo único que tenías que hacer, era adaptar esa rutina a tu programa pero de forma inversa para aprovechar la resistencia pull-up de GP3.
A los pines 7, 6 y 4 (GP0, GP1 y GP3 respectivamente) se les puede habilitar resistencias pull-up.

De esta forma quedaría el código para usar GP3 usando la resistencia pull-up interna.
Nota que ahora el ciclo se producirá cuando el pin 4 (GP3) esté a nivel lógico 0.
Código:
    list        p=12f508
    include        p12f508.inc
    __config    _IntRC_OSC & _WDT_OFF & _MCLRE_OFF

    cblock    0x07
    cnt1,cnt2,cnt3
    endc

    org        0x1FF            ; Vector de reset.
    org        0x00            ; vector de inicio del código.

inicio
    movwf    OSCCAL            ; Recuperar el valor de fábrica para el oscilador interno.
    movlw    b'10000000'        ; GPWU = 1, GPPU, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
    option
    movlw    b'111011'        ; GP2 como salida.
    tris    GPIO
    clrf    GPIO

programa
    btfsc    GPIO,3
    goto    $-1
    call    rutina
    btfss    GPIO,3
    goto    $-1
    goto    programa

rutina
    bsf        GPIO,2            ; Enciende LED
    call    retardo_500ms    ; Retardo de 500Ms.
    bcf        GPIO,2            ; Apaga LED
    retlw    0x00

retardo_500ms
; 499994 ciclos
    movlw    0x03
    movwf    cnt1
    movlw    0x18
    movwf    cnt2
    movlw    0x02
    movwf    cnt3
retardo_500ms_0
    decfsz    cnt1,f
    goto    $+2
    decfsz    cnt2,f
    goto    $+2
    decfsz    cnt3,f
    goto    retardo_500ms_0
; 2 ciclos
    goto    $+1
; 4 ciclos (incluyendo call)
    retlw    0x00

    end
Suerte.
 
Última edición:
Ah ok, no entendia la parte de la declaracion de esos puertos.

inicio
movwf OSCCAL ; Recuperar el valor de fábrica para el oscilador interno.
movlw b'10000000' ; GPWU = 1, GPPU, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0

Tienes algun material donde pueda saber que significa cada uno de esos valores??
no sabia que con eso podia activar y desactivar instrucciones!!
 
Atrás
Arriba