Autor Tema: Sobre lectura en EEPROM  (Leído 1036 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Sobre lectura en EEPROM
« en: 23 de Mayo de 2013, 18:12:00 »
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

Código: [Seleccionar]
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