Manejar bien el oscilador del PIC

Cierto, ahora funciona mejor.

Código:
;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte 
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0   1   0   0
;2) | 1   0   1   0
;3) | 0   1   1   0
;4) | 1   0   0   1
;
;ZONA DE DATOS*****************************************************************

    LIST P=12F629                          ; Procesador usado.
    INCLUDE <P12F629.INC>                  ; Fichero que definen las etiquetas.

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _FOSC_INTRCIO
    ERRORLEVEL -302

#DEFINE     Pulsador    GPIO,2      ; Pulsador.
#DEFINE     Leds        GPIO        ; Leds está conectado al GPIO.

VARIABLES    UDATA_SHR
ContadorEstado    RES    1
RAM_ret        RES    1
RAM_ret_1    RES    1
Contador    RES    1

;ContadorEstado     equ  20h
;RAM_ret         equ 21h
;RAM_ret_1       equ 22h
;Contador        equ 23h


;ZONA DE CÓDIGOS***************************************************************
    ORG     0                       ; El programa comienza en la dirección 0.
    goto    Inicio

Inicio
    bsf     STATUS,RP0                  ; Selecciona banco 1.
    call    0x3FF                    ; Lo el valor de la calibración que sera almacenada en W.
    movwf   OSCCAL                    ; Paso el valor de W a OSCCAL para calibrar el oscilador.
    movlw   b'00000100'
    movwf   TRISIO
    movlw   b'00001111'
    movwf   OPTION_REG              ; Activa Pull Up.
    movlw   b'0000100'
    movwf   WPU                     ; Activada Pull Up del GP0.
    bcf     STATUS,RP0                      ; Selecciona banco 0.
    movlw   b'00000111'             ; Desactivar comparadores.
    movwf   CMCON
    movlw    .3
    movwf    Contador
    clrf    GPIO
;***************************************************************************

Principal
    btfsc   Pulsador                ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Principal               ; No. Vuelve a leerlo.
;    call    Retardo_20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc   Pulsador                ; Comprueba si es un rebote.
    goto    Principal               ; Era un rebote y sale fuera.
    call    Incrementar             ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
    btfss    Pulsador                ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar         ; No. Espera que deje de pulsar.
Fin    goto    Principal

Incrementar
;***************************************************************************    
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
    incf    Contador,F                ; Incrementa el contador y comprueba si ha
    movlw     d'4'                    ; llegado a su valor máximo mediante una
    subwf    Contador,W                ; resta. (W)=(Contador)-4.
    btfsc    STATUS,C                ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
    clrf    Contador                ; No, era igual o mayor. Por tanto, resetea.
Visualiza
    movf    Contador,W
    call    Tabla                    ; Lo pasa a siete segmento para poder ser
    movwf    GPIO                    ; visualizado en el display.
    return


Tabla                
    addwf     PCL,F                      ; Sumo W al contador de programa. ;
    retlw     b'00000010'  ;1 
    retlw     b'00010001'  ;2         
    retlw     b'00010010'  ;3               ; Retorno con el valor correspondiente.  
    retlw     b'00100001'  ;4
    
;Subrutina Retardo_20ms ************************************************************
 ; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.

Retardo_20ms
            ;19993 ciclos.
    movlw    0x9E
    movwf    RAM_ret
    movlw    0x10
    movwf    RAM_ret_1
Retardo_20ms_0
    decfsz    RAM_ret, f
    goto    $+2
    decfsz    RAM_ret_1, f
    goto    Retardo_20ms_0
            ;3 ciclos.
    goto    $+1
    nop
            ;4 ciclos (incluyendo call).
    return

    END
Otra pregunta tonta.

En la configuración:
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO

Tengo el _PWRTE_OFF, antes en _PWRTE_ON.

¿Ocurre algo?




Edito:


No se si la EEPROM está en lectura y escritura bien hecho.

Código:
;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte 
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0   1   0   0
;2) | 1   0   1   0
;3) | 0   1   1   0
;4) | 1   0   0   1
;
;ZONA DE DATOS*****************************************************************

    LIST P=12F629                          ; Procesador usado.
    INCLUDE <P12F629.INC>                  ; Fichero que definen las etiquetas.

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO
    ERRORLEVEL -302

#DEFINE     Pulsador    GPIO,2      ; Pulsador.
#DEFINE     Leds        GPIO        ; Leds está conectado al GPIO.

VARIABLES    UDATA_SHR
ContadorEstado    RES    1
RAM_ret        RES    1
RAM_ret_1    RES    1
Contador    RES    1

;ContadorEstado     equ  20h
;RAM_ret         equ 21h
;RAM_ret_1       equ 22h
;Contador        equ 23h

    ORG    0x2100                ; Corresponde a la dirección 0 de la zona EEPROM de datos.
    DE    0x00                ; El contador en principio a cero.

;ZONA DE CÓDIGOS***************************************************************
    ORG     0     
                  ; El programa comienza en la dirección 0.
    goto    Inicio

Inicio
    bsf     STATUS,RP0                  ; Selecciona banco 1.
    call    0x3FF                    ; Lo el valor de la calibración que sera almacenada en W.
    movwf   OSCCAL                    ; Paso el valor de W a OSCCAL para calibrar el oscilador.
    movlw   b'00000100'
    movwf   TRISIO
    movlw   b'00001111'
    movwf   OPTION_REG              ; Activa Pull Up.
    movlw   b'0000100'
    movwf   WPU                     ; Activada Pull Up del GP0.
    bcf     STATUS,RP0                      ; Selecciona banco 0.
    movlw   b'00000111'             ; Desactivar comparadores.
    movwf   CMCON
    movlw    .3
    movwf    Contador
    clrf    GPIO
;***************************************************************************

Principal
    btfsc   Pulsador                ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Principal               ; No. Vuelve a leerlo.
;    call    Retardo_20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc   Pulsador                ; Comprueba si es un rebote.
    goto    Principal               ; Era un rebote y sale fuera.
    call    IncrementaVisualiza             ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
    btfss    Pulsador                ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar         ; No. Espera que deje de pulsar.
Fin    goto    Principal

;***************************************************************************    
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
    incf    Contador,F                ; Incrementa el contador y comprueba si ha
    movlw     d'4'                    ; llegado a su valor máximo mediante una
    subwf    Contador,W                ; resta. (W)=(Contador)-4.
    btfsc    STATUS,C                ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
    clrf    Contador                ; No, era igual o mayor. Por tanto, resetea.
Visualiza
    call    Lee_Dato_EEPROM
    movf    Contador,W
    call    Tabla                    ; Lo pasa a siete segmento para poder ser
    movwf    GPIO                    ; visualizado en el display.
    call    Escribe_Dato_EERPOM
    return


Tabla                
    addwf     PCL,F                      ; Sumo W al contador de programa. ;
    retlw     b'00000010'  ;1 
    retlw     b'00010001'  ;2         
    retlw     b'00010010'  ;3               ; Retorno con el valor correspondiente.  
    retlw     b'00100001'  ;4
;Subrutina EEPROM ******************************************************************

Lee_Dato_EEPROM
    bsf     STATUS,RP0                 ; Banco 1
    movlw   0x00                       ; Primera posición de la tabla
    movwf   EEADR                     ; Apunta ahí
;    movf    Contador,W                 ; Coge el contador
;    addwf   EEADR                     ; Suma el contador para apuntar al dato que nos interesa
    bsf     EECON1,RD                 ; Lee el valor de la tabla
    movf    EEDATA,W                 ; Pasa el valor a W para trabajar con él.
    bcf        STATUS,RP0
    return



;Guarda en la EEPROM el valor del contador
Escribe_Dato_EERPOM
    bsf      STATUS,RP0             ; Banco 1.
    movlw    0x00                    ; Elijo esta dirección de la EEPROM y
    movwf    EEADR                  ; lo cargo en EEADR con el dato a escribir.
    movlw    Contador
    movwf    EEDAT                  ; Cargo el registro EEDAT con el dato a escribir.
    bsf      EECON1,WREN            ; Habilitar
    bcf     INTCON,GIE              ; Deshabilitar intercepciones.
    movlw     0x55                  ; Desbloquear escritura.
    movwf     EECON2
    movlw     0xAA
    movwf     EECON2
    bsf     EECON1,WR               ; Inicie la escritura.
    bsf     INTCON,GIE              ; Habilitar INTS.
    bcf        STATUS,RP0
    return
    
;Subrutina Retardo_20ms ************************************************************
 ; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.

Retardo_20ms
            ;19993 ciclos.
    movlw    0x9E
    movwf    RAM_ret
    movlw    0x10
    movwf    RAM_ret_1
Retardo_20ms_0
    decfsz    RAM_ret, f
    goto    $+2
    decfsz    RAM_ret_1, f
    goto    Retardo_20ms_0
            ;3 ciclos.
    goto    $+1
    nop
            ;4 ciclos (incluyendo call).
    return

    END
 
Última edición:
Creo y solo creo que lo tengo. No tengo el PIC12F629 físicamente para probarlo, si un simulador Proteus pero no surge efecto.

¿Se puede hacer con el Proteus guardar datos en la EEPROM?

Código:
;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte 
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0   1   0   0
;2) | 1   0   1   0
;3) | 0   1   1   0
;4) | 1   0   0   1
;
;ZONA DE DATOS*****************************************************************

    LIST P=12F629                          ; Procesador usado.
    INCLUDE <P12F629.INC>                  ; Fichero que definen las etiquetas.

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO
    ERRORLEVEL -302

#DEFINE     Pulsador    GPIO,2      ; Pulsador.
#DEFINE     Leds        GPIO        ; Leds está conectado al GPIO.

VARIABLES    UDATA_SHR
ContadorEstado    RES    1
RAM_ret        RES    1
RAM_ret_1    RES    1
Contador    RES    1

;ContadorEstado     equ  20h
;RAM_ret         equ 21h
;RAM_ret_1       equ 22h
;Contador        equ 23h

    ORG    0x2100                ; Corresponde a la dirección 0 de la zona EEPROM de datos.
    DE    0x00                ; El contador en principio a cero.

;ZONA DE CÓDIGOS***************************************************************
    ORG     0     
                  ; El programa comienza en la dirección 0.
    goto    Inicio

Inicio
    bsf     STATUS,RP0                  ; Selecciona banco 1.
    call    0x3FF                    ; Lo el valor de la calibración que sera almacenada en W.
    movwf   OSCCAL                    ; Paso el valor de W a OSCCAL para calibrar el oscilador.
    movlw   b'00000100'
    movwf   TRISIO
    movlw   b'00001111'
    movwf   OPTION_REG              ; Activa Pull Up.
    movlw   b'0000100'
    movwf   WPU                     ; Activada Pull Up del GP0.
    bcf     STATUS,RP0                      ; Selecciona banco 0.
    movlw   b'00000111'             ; Desactivar comparadores.
    movwf   CMCON
    movlw    .3
    movwf    Contador
    clrf    GPIO
    call    Lee_Dato_EEPROM
;***************************************************************************

Principal
    btfsc   Pulsador                ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Principal               ; No. Vuelve a leerlo.
;    call    Retardo_20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc   Pulsador                ; Comprueba si es un rebote.
    goto    Principal               ; Era un rebote y sale fuera.
    call    IncrementaVisualiza             ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
    btfss    Pulsador                ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar         ; No. Espera que deje de pulsar.
Fin    goto    Principal

;***************************************************************************    
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
    incf    Contador,F                ; Incrementa el contador y comprueba si ha
    movlw     d'4'                    ; llegado a su valor máximo mediante una
    subwf    Contador,W                ; resta. (W)=(Contador)-4.
    btfsc    STATUS,C                ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
    clrf    Contador                ; No, era igual o mayor. Por tanto, resetea.
Visualiza
    movf    Contador,W
    call    Tabla                    ; Lo pasa a siete segmento para poder ser
    movwf    GPIO                    ; visualizado en el display.
    call    Escribe_Dato_EERPOM
    return


Tabla                
    addwf     PCL,F                      ; Sumo W al contador de programa. ;
    retlw     b'00000010'  ;1 
    retlw     b'00010001'  ;2         
    retlw     b'00010010'  ;3               ; Retorno con el valor correspondiente.  
    retlw     b'00100001'  ;4
;Subrutina EEPROM ******************************************************************

Lee_Dato_EEPROM
    bsf     STATUS,RP0                 ; Banco 1
;    movlw   0x00                       ; Primera posición de la tabla
;    movwf   EEADR                     ; Apunta ahí
;    movf    Contador,W                 ; Coge el contador
;    addwf   EEADR                     ; Suma el contador para apuntar al dato que nos interesa
    bsf     EECON1,RD                 ; Lee el valor de la tabla
    movf    EEDATA,W                 ; Pasa el valor a W para trabajar con él.
    bcf        STATUS,RP0
    return

;Guarda en la EEPROM el valor del contador
Escribe_Dato_EERPOM
    bsf      STATUS,RP0             ; Banco 1.
    movlw    0x00                    ; Elijo esta dirección de la EEPROM y
    movwf    EEADR                  ; lo cargo en EEADR con el dato a escribir.    
    movlw    Contador
    movwf    EEDAT                  ; Cargo el registro EEDAT con el dato a escribir.
    bsf      EECON1,WREN            ; Habilitar
;    bcf     INTCON,GIE              ; Deshabilitar intercepciones.
    movlw     0x55                  ; Desbloquear escritura.
    movwf     EECON2
    movlw     0xAA
    movwf     EECON2
    bsf     EECON1,WR               ; Inicie la escritura.
;    bsf     INTCON,GIE              ; Habilitar INTS.
    bcf        STATUS,RP0
    return
    
;Subrutina Retardo_20ms ************************************************************
 ; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.

Retardo_20ms
            ;19993 ciclos.
    movlw    0x9E
    movwf    RAM_ret
    movlw    0x10
    movwf    RAM_ret_1
Retardo_20ms_0
    decfsz    RAM_ret, f
    goto    $+2
    decfsz    RAM_ret_1, f
    goto    Retardo_20ms_0
            ;3 ciclos.
    goto    $+1
    nop
            ;4 ciclos (incluyendo call).
    return

    END
Saludo.
 
¿Se puede hacer con el Proteus guardar datos en la EEPROM?
Si. Solo debes de cargar el archivo *.cof en reemplazo del *.hex. y correr la simulación paso a paso (botón "Step" al lado de "Play").
Por defecto aparecen las ventanas del "Source Code" y "Variables". Para ver la memoria eeprom debes de ir a la opción del menú "Debug -> PIC CPU EPROM Memory".

Saludos.
 
Para la simulación, los datos de eeprom se renuevan cuando están incluidos en el código.
En ASM es algo así:

Código:
    org 0x2100
    de 1, 2, 3
Los valores 1, 2, 3, deben de aparecer en las direcciones 0x00, 01, 02 de la ventana EPROM Memory.
La dirección 0x2100 es para los PIC16, la dirección depende del tipo de PIC (ver hoja de datos)
 
Por lo que tengo entendido.
Código:
     ORG 0x2100       ; DATA

   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                
   Data   0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF  ;                

     ORG 0x2000       ; ID

       Data   0x3FFF
       Data   0x3FFF
       Data   0x3FFF
       Data   0x3FFF

     ORG 0x2007       ; CONFIG

       Data   0x3FFF

El 2100 también corresponde al 12F629. No lo encuentro en el datasheet, si en un grabador de PIC que te dice en que dirección empieza como Winpic800 y ic-prog. Me guío por ahí. :)

Gracias por la ayuda.
 
Hola:

He logrado grabar la EEPROM interna, lo que no se si funciona como debe ser. El que tenga PIC12F629 físicamente me puede hacer un favor, el simulador se le va la olla en algunos casos.

Código:
;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0   1   0   0
;2) | 1   0   1   0
;3) | 0   1   1   0
;4) | 1   0   0   1
;
;ZONA DE DATOS*****************************************************************

    LIST P=12F629                          ; Procesador usado.
    INCLUDE <P12F629.INC>                  ; Fichero que definen las etiquetas.

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO
    ERRORLEVEL -302

#DEFINE     Pulsador    GPIO,2      ; Pulsador.
#DEFINE     Leds        GPIO        ; Leds está conectado al GPIO.

VARIABLES        UDATA_SHR
ContadorEstado  RES    1
RAM_ret            RES    1
RAM_ret_1        RES    1
Contador        RES    1

;ContadorEstado     equ  20h
;RAM_ret         equ 21h
;RAM_ret_1       equ 22h
;Contador        equ 23h

    ORG    0x2100                ; Corresponde a la dirección 0 de la zona EEPROM de datos.
    DE    0x00                ; El contador en principio a cero.

;ZONA DE CÓDIGOS***************************************************************
    ORG     0
                  ; El programa comienza en la dirección 0.
    goto    Inicio

Inicio
    bsf     STATUS,RP0                  ; Selecciona banco 1.
    call    0x3FF                    ; Lo el valor de la calibración que sera almacenada en W.
    movwf   OSCCAL                    ; Paso el valor de W a OSCCAL para calibrar el oscilador.
    movlw   b'00000100'
    movwf   TRISIO
    movlw   b'00001111'
    movwf   OPTION_REG              ; Activa Pull Up.
    movlw   b'0000100'
    movwf   WPU                     ; Activada Pull Up del GP0.
    bcf     STATUS,RP0                      ; Selecciona banco 0.
    movlw   b'00000111'             ; Desactivar comparadores.
    movwf   CMCON
    movlw    .3
    movwf    Contador
;    bcf        STATUS,RP0
    clrf    GPIO
    movf    EEDAT,W            ;Lee el valor actual del turno
    bcf        STATUS,RP0        ;Banco 0
    movwf    Contador
    call    Visualiza
;    call    Lee_Dato_EEPROM
;***************************************************************************

Principal
    btfsc   Pulsador                ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Principal               ; No. Vuelve a leerlo.
;    call    Retardo_20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc   Pulsador                ; Comprueba si es un rebote.
    goto    Principal               ; Era un rebote y sale fuera.
    call    IncrementaVisualiza             ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
    btfss    Pulsador                ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
    goto    EsperaDejePulsar         ; No. Espera que deje de pulsar.
Fin    goto    Principal

;***************************************************************************
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
    incf    Contador,F                ; Incrementa el contador y comprueba si ha
    movlw     d'4'                    ; llegado a su valor máximo mediante una
    subwf    Contador,W                ; resta. (W)=(Contador)-4.
    btfsc    STATUS,C                ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
    clrf    Contador                ; No, era igual o mayor. Por tanto, resetea.
Visualiza
    movf    Contador,W
    call    Tabla                    ; Lo pasa a siete segmento para poder ser
    movwf    GPIO                    ; visualizado en el display.
    bsf        STATUS,RP0                ;Banco 1.
    movwf    EEDAT                    ;Valor del contador a grabar en la EEPROM.
    clrf    EEADR                    ;Dirección 0x00 de la EEPROM.
    call    Escribe_Dato_EERPOM        ;Graba el nuevo valor del contador en la EEPROM.
    return


Tabla
    addwf     PCL,F                      ; Sumo W al contador de programa. ;
    retlw     b'00000010'  ;1
    retlw     b'00010001'  ;2
    retlw     b'00010010'  ;3               ; Retorno con el valor correspondiente.
    retlw     b'00100001'  ;4
;Subrutina EEPROM ******************************************************************

Lee_Dato_EEPROM
    bsf        STATUS,RP0
    bsf        EECON1,RD        ;Orden de lectura
    bcf        STATUS,RP0
    return

;Guarda en la EEPROM el valor del contador
Escribe_Dato_EERPOM
    bsf        EECON1,WREN        ;Permiso de escritura
    movlw      b'01010101'
    movwf      EECON2
    movlw      b'10101010'
    movwf      EECON2            ;Secuencia establecida por Microchip
    bsf        EECON1,WR        ;Orden de escritura
Espera
    btfsc      EECON1,WR        ;Testear flag de fin de escritura
    goto       Espera
    bcf        EECON1,WREN        ;Desconecta permiso de escritura
    bcf        EECON1,EEIF        ;Reponer flag de fin de escritura
    bcf        STATUS,RP0
    return

;Subrutina Retardo_20ms ************************************************************
 ; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.

Retardo_20ms
            ;19993 ciclos.
    movlw    0x9E
    movwf    RAM_ret
    movlw    0x10
    movwf    RAM_ret_1
Retardo_20ms_0
    decfsz    RAM_ret, f
    goto    $+2
    decfsz    RAM_ret_1, f
    goto    Retardo_20ms_0
            ;3 ciclos.
    goto    $+1
    nop
            ;4 ciclos (incluyendo call).
    return

    END

Ahora me toca investigar el tema de los 5 segundos.

Saludo.
 
Atrás
Arriba