La EEPROM tiene varios registros, y estan el el banco 1. Pensa en la EEPROM como otra memoria aparte la cual comienza en 0x00 y en ese PIC ocupa hasta la direccion 0x7F , es decir 128 posiciones de memoria o 128bytes.
Entonces para leer la EEPROM debemos:
- Asegurarnos que estemos en el banco 1 ya que ahi estan los registros
- Indicarle la direccion que queremos leer
- Luego decirle al modulo de la EEPROM que lea, para que tome el dato y lo ponga en el registro EEDATA
- Fin
Para escribir es un poco mas complejo ya que tiene unos mecanismos de proteccion de esa forma no cualquier ruido o mal manejo por parte del usuario puede cambiar esos datos.
- Nuevamente me aseguro que este en el banco 1
- Cargo el valor a escribir en EEDATA, y le digo en que direccion ponerlo con EEADR
- Algo crucial si es que usas interrupciones, es que esten desabilitadas al momento de escribir la EEPROM, para que no ocurra una interrupcion en el medio de la escritura, asi que la desactivamos
- Luego como dije hay un mecanismo de proteccion, que es escribir 0x55 y 0xAA ( en ese orden ) en EECON2 , solo para que esto no ocurra por "error", si no haces esto cuando le das la orden de escribir , no escribe nada.
- Finalmente le damos la orden que escriba en la memoria.
- De usar las interrupciones volvemos a activarlas, sino las dejamos asi
Eso que nombre esta en los codigos del datasheet:
Lo acomode un poco.. en este caso uso 2 registros ( definidos por vos ) que son llamdos:
DIRECCION y DATOEE
Leer:
LeeEEPROM:
MOVF DIRECCION,W ; CONFIG_ADDR = direccion del dato
BSF STATUS,RP0 ; Bank 1
MOVWF EEADR ; Direccion a leer
BSF EECON1,RD ; Avisamos que queremos leer asi EEDATA se carga con el valor
MOVF EEDATA,W ; ubicado en la direccion CONFIG_ADDR de la moemoria EEPROM
BCF STATUS,RP0 ; y guardamos en W, procedemos a volver al banco 0
MOVWF DATOEE
RETURN
Eso es para leer la EEPROM, como usarla ? Supongamos que guardas los valores asi:
Direccion 0x00 - Unidades
Direccion 0x01 - Decenas
Si quisiera leer las Decenas, lo que haria es lo siguiente:
MOVLW 0x01
MOVWF DIRECCION
CALL LeeEEPROM
El dato leido va a estar en DATOEE.
Si hubiera querido leer las Unidades, solo ponia un 0x00 en DIRECCION
Ahora para escribir:
EscribirEEPROM:
MOVF DATOEE,W ; Cargo el valor a escribir
BSF STATUS,RP0 ; Banco 1
MOVWF EEDATA
BCF STATUS,RP0 ; Banco 0
MOVF DIRECCION,W ; Cargo direccion a escribir
BSF STATUS,RP0 ; Banco 1
MOVWF EEADR
BSF EECON1,WREN ; Habilitamos la escritura de la EEPROM
;Codigo obligatorio
BCF INTCON,GIE ; Desabilitamos interrupciones ya que afectarian la escritura
MOVLW 0x55 ; Una proteccion que posee la EEPROM, es que antes de escribir
MOVWF EECON2 ; debe escribirse los valores 0x55 y 0xAA en orden
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR ; Finalmente podemos darle la orden que escriba en la EEPROM
;Fin codigo obligatorio
BSF INTCON,GIE ; De usar interrupciones las habilitamos de nuevo
BCF STATUS,RP0 ; Banco 0
RETURN
Y como usarlo ?, esta ves voy a guardar las unidades
MOVF Unidades,W
MOVWF DATOEE
MOVLW 0x00
MOVWF DIRECCION
CALL EscribirEEPROM
Lo que mover las unidades a DATOEE ( es decir el dato a guardar ) y le digo que lo ponga en la direccion 0x00 y llamo a la funcion que va a escribir el dato.
Nuevamente si no usas interrupciones esta linea al final de la escritura no hace falta.
BSF INTCON,GIE ; De usar interrupciones las habilitamos de nuevo
---------------------------------
Con respecto a los delays, si queres crear alguno, hay paginas online que lo hacen
http://www.piclist.com/techref/piclist/codegen/delay.htm- En Delay pones el tiempo en segundos ( o en ciclos de instruccion )
- Temporary Register podes dejarlo como esta, o cambiarle el nombre a unos registros creados por vos ( que los tengas tambien para usarlos de forma temporal )
- Luego pones bien el valor de frecuencia de cristal, si es 4Mhz, o si es que tiene oscilador interno le pones el valor del mismo, etc.
- Tilda donde dice "Generate Routine" , y le podes poner el nombre que quieras.
Un ejemplo:
Delay 1s
Dejo los registros como estan
Tengo un oscilador interno de 8Mhz
Y quiero que mi rutina se llama Delay_1s
Codigo creado:
Delay = 1 seconds
; Clock frequency = 8 MHz
; Actual delay = 1 seconds = 2000000 cycles
; Error = 0 %
cblock
d1
d2
d3
endc
Delay_1s
;1999996 cycles
movlw 0x11
movwf d1
movlw 0x5D
movwf d2
movlw 0x05
movwf d3
Delay_1s_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_1s_0
;4 cycles (including call)
return
Al comienzo el CBLOCK define esos "registros" y para usarlo directamente hago un
----------------------------------------------------------------------------
Lo mas importante de la EEPROMOJO que solo tiene 1.000.000 de grabaciones, si tu codigo se la pasa grabando la EEPROM vas a destruir la posicion de memoria.
Asi que asegurate que solo grabe cuando se necesite nada mas. Ejemplo no tendria sentido grabar el mismo valor que queres grabar.