Muchos saludos...
Una vez más, comparto mi inquietud con ustedes los del foro, para ver si me dan una orientación. Resulta que tengo un programa, que al presionar un botón me guarda en la EEPROM un dato. Cuando el micro enciende, lee los datos que están en la EEPROM. El asunto es que cuando enciendo el micro, no pasa nada... Quizás haya algo que se me escapa. ¿Alguien con experiencia que pueda, por favor, darme una ayuda? Les agradezco mucho por adelantado...
El código es el siguiente, a ver si me pueden dar una mano
list p=16F84A
#INCLUDE <P16F84A.INC>
#DEFINE BANCO0 BCF STATUS,5
#DEFINE BANCO1 BSF STATUS,5
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
ORG 00h
GOTO f_init
ORG 05h
f_init BANCO1 ;Paso al banco 1 para realizar las configuraciones de los puertos.
MOVLW B'10000' ;0 indica que son salidas. 1 indica entradas. El orden es RA4, RA3, RA2, RA1, RA0
MOVWF TRISA
BCF OPTION_REG,INTEDG ;Ponemos 'cero' en el bit INTEDG (RB0/INT) del registro OPTION_REG para
;indicar que las interrupciones se detectarán en el flanco descendente.
MOVLW B'00001101' ;0 indica que son salidas. 1 indica entradas. El orden es RB7, RB6, ..., RB0
MOVWF TRISB
BANCO0 ;Paso al banco 0 para comenzar a trabajar.
CLRF PORTA ;Limpio todo el puerto A.
CLRF PORTB ;Limpio todo el puerto B.
;Aquí, el procedimiento para leer los datos guardados en le EEPROM. Si es primera vez que corre el programa, supongo que devolverá cero.
MOVLW 20h ;Ponemos en W la dirección que vamos a leer, que es la 20h.
MOVWF EEADR ;Pasamos W al registro EEADR, definiendo la dirección a leer.
CALL f_read ;Llama la rutina de lectura, para leer en la dirección que anteriormente cargamos en W.
MOVWF 20h ;Finalmente introducimos el valor cargado en W al registro 20h
MOVF 20h,W
XORLW .0 ;Verifica si el registro 20h vale 0.
BTFSC STATUS,Z ;Si no es así salta una línea para continuar.
GOTO f_exre0 ;Pero si es alrevés, vamos a f_exre0 para continuar con otras operaciones
MOVLW .253 ;Ya que el registro 20h vale cero, colocamos .253
MOVWF 20h
f_exre0 MOVLW 22h ;Ponemos en W la dirección que vamos a leer, que es la 22h.
MOVWF EEADR ;Pasamos W al registro EEADR, definiendo la dirección a leer.
CALL f_read ;Llama la rutina de lectura, para leer en la dirección que anteriormente cargamos en W.
MOVWF 22h ;Finalmente introducimos el valor cargado en W al registro 22h
MOVLW 23h ;Ponemos en W la dirección que vamos a leer, que es la 23h.
MOVWF EEADR ;Pasamos W al registro EEADR, definiendo la dirección a leer.
CALL f_read ;Llama la rutina de lectura, para leer en la dirección que anteriormente cargamos en W.
MOVWF 23h ;Finalmente introducimos el valor cargado en W al registro 23h
MOVF 22h,W
CALL tbl_und
MOVWF PORTA
MOVF 23h,W
CALL tbl_dec
MOVWF PORTB
;.... Aquí continúa el programa
;Estas son las rutinas de lectura y escritura
f_save
BANCO1
BSF EECON1,WREN ;HABILITA ESCRITURA EN EEPROM
BCF INTCON,GIE ;DESHABILITA INTERRUPCIONES
MOVLW H'55' ;PREPARA SECUENCIA DE SEGURIDAD
MOVWF EECON2 ;ESCRIBE PRIMER DATO DE SECUENCIA
MOVLW H'AA' ;SEGUNDO DATO
MOVWF EECON2 ;ESCRIBE SEGUNDO DATO DE SECUENCIA
BSF EECON1,WR ;INICIA CICLO DE ESCRITURA
f_ew BTFSC EECON1,WR ;Espera final de escritura
GOTO f_ew ;SI WR=1, CICLO DE ESCRITURA AUN NO TERMINA
BCF EECON1,WREN ;DESHABILITA ESCRITURA
BSF INTCON,GIE ;HABILITA INTERRUPCIONES
BANCO0
RETURN
f_read
BANCO1 ;SELECCIONAMOS EL BANCO 1
BSF EECON1,RD ;HACEMOS LA LECTURA COLOCANDO RD A 1
f_ee BTFSC EECON1,RD ; Espera final de lectura
GOTO f_ee ; a que baje la bandera
BANCO0 ;Y REGRESAMOS AL BANCO 0
MOVF EEDATA,W ;PARA FINALMENTE RESCATAR EL DATO DESDE EEDATA HACIA W
RETURN