Usando la EEPROM de los PICs (ejemplo PIC 16x84)
Hemos visto que en muchos de los post y discusiones de este foro, hablamos de guardar los datos en la memoria EEPROM de los microcontroladores.
En realidad no sabemos hasta donde llega el conocimiento de todos los que leemos esos escritos, por lo tanto trataremos de hacer una pequeña introducción de cómo proceder para usar la memoria EEPROM.
Entonces, este mini tutorial está orientado a aquellos que no conocen o nuncan han intentado usar esta memoria.
Muchas veces (si no la mayoría de ellas) subutilizamos el MP (microprocesadores) basándonos en el software de control desarrollado en nuestras PC para guardar y leer los datos necesarios para el correcto funcionamiento de nuestras interfaces y circuitos de control, en lugar de emplear a fondo las facilidades que nos prestan.
Existen muchas ventajas en guardar los datos en la memoria no volátil del MP. La más inmediata y evidente es disponer en forma instantánea de las condiciones iniciales o de arranque para el funcionamiento de la electrónica de control.
Por ejemplo, imagínense que hemos diseñado un circuito que utiliza un motor paso a paso para colocar en determinado lugar una banda transportadora. Sabemos que el motor deberá moverse desde 0 (inicio de la banda) hasta X pasos (final de la banda). Dentro de la memoria EEPROM podríamos almacenar el valor de X (numero de pasos totales para recorrer la banda) y el valor de Y (lugar o número de pasos en donde se detuvo por última vez el motor). De esta forma, el circuito podría usar su “memoria” para conocer estos datos al encenderlo en lugar de esperar que algún otro proceso externo se lo informe. Otros datos que pudiéramos guardar serían por ejemplo, el valor de corrección de “backslash” o de movimiento inercial de la banda para corregir ese error acumulativo.
Para explicar como usar la EEPROM, vamos a basarnos en nuestro PIC de pruebas que es el ya famoso 16x84. Para utilizar cualquier otro, haremos uso de las datasheets para conocer la equivalencia de los comandos, el tamaño de la EEPROM y sus direcciones de inicio y final. En el caso de 16x84 tenemos los siguientes datos:
Tamaño de la EEPROM: 64 bytes - 8 Bits por byte
Dirección de Inicio: 0h
Dirección Final: 3Fh
Para acceder a esos 64 bytes usamos un direccionamiento indirecto. Esto quiere decir que la DIRECCIÓN específica de la memoria EEPROM que nos interesa (de los 64 disponibles) estará almacenada en un registro determinado y por consiguiente, para que el programa del MP sepa donde leer o grabar tendremos que buscarlo en ese registro específico.
Este registro junto con otros cuatro que sirven para controlar todo el proceso de lectura y escritura, son los siguientes:
EEADR
EEDATA
EECON1
EECON2
1)
EEADR contiene la dirección o posición de la memoria EEPROM que queremos acceder bien sea para leerla o escribirla. Como este registro es un BYTE de 8 Bits, pudiéramos entonces representar 256 distintos valores sin embargo solo necesitamos 64 de ellos para acceder a toda la memoria por lo que, los bit 6 y 7 no se usan y deberán ser siempre cero (recuerden que los 8 bits los numeramos desde el 0 al 7).
2)
EEDATA va a contener como su nombre lo indica, el dato leido o el que deseamos guardar.
3) La misión de
EECON1 es controlar los procesos de escritura/lectura de la memoria. De sus 8 bits disponibles solo se usan los 5 de menos peso. Estos bits son:
a. Bit0:
RD de “Read Data”, se pone a 1 cuando se va a realizar un ciclo de LECTURA desde la EEPROM, y vuelve automáticamente a 0 cuando se temina ese proceso.
b. Bit 1:
WR de “Write Data”, se pone a 1 cuando se va a realizar un ciclo de ESCRITURA hacia la EEPROM, y vuelve automáticamente a 0 cuando se temina ese proceso.
c. Bit 2:
WREN de “Write Register ENable”. Si está a 1 PERMITE el proceso de escritura hacia la EEPROM y si está a 0, no lo permite.
d. Bit 3:
WRERR de “Write Register ERRor”. Se va a 1 cuando un proceso de ESCRITURA no se realizó correctamente y a 0 en caso contrario.
e. Bit 4:
EEIF de “EEprom Interrupt Finalization”. Al colocarse a 1, indica que la operación de ESCRITURA a finalizado con éxito. Si se quiere colocarla a 0, deberá hacerse por programa.
4)
EECON2 no está físicamente implementado y es empleado como un dspositivo de seguridad durante el proceso de escritura de la EEPROM. Si se lee, todos sus bits estarán a 0.
Un ciclo de escritura de una localidad de memoria de la EEPROM tarda aproximadamente para estos MP con cristales de 4 MHz, unos 10 ms. Este tiempo es muy largo comparado con la velocidad del MP y por esta razón se hacen tantos esfuerzos en controlar su escritura y lectura.
Leer los datos de la EEPROM:
Según lo que vimos anteriormente, para leer los datos de la EEPROM deberemos hacer lo siguiente:
1) Cargar la dirección que deseamos leer en EEADR
2) Poner a 1 el Bit RD del registro EECON1 indicándole al MP que lea la dirección
3) Y por último transferir al acumulador o al literal deseado el dato leído desde EEDATA
El código típico sería así (Recuerden que debemos de haber incluido el archivo 16F84A.INC donde se definen los registros del PIC). La variable DIRE debimos haberla declarado al comienzo del programa.
Código:
bcf ESTADO,RP0 ;Seleccionamos el Banco 0
movlw DIRE ;Ponemos en W la dirección que vamos a leer
movwf EEADR ;y pasamos W al registro EEADR, definiendo la dirección a leer
bsf ESTADO,rp0 ; Seleccionamos el Banco 1
bsf EECON1,RD ;Hacemos la lectura colocando RD a 1
bcf ESTADO,RP0 ;y regresamos al Banco 0
movf EEDATA,W ;para finalmente rescatar el dato desde EEDATA hacia W
Esta es una codificación básica que puede servir de modelo de arranque para sus diseños.
Escribir los datos en la EEPROM:
Anteriormente dijimos que EECON2 no estaba implementado en forma física y que si lo leíamos obtendríamos 0 pero, cumple funciones de control sobre la escritura que si deberemos considerar.
Para esto, usaremos dos valores específicos, el 55h y el AAh.
Dado el tiempo que tarda el proceso de escritura comparado con el tiempo de ejecución del MP, estos dos valores permitirán al MP realizar acciones de sincronismo y control en el proceso de escritura de la EEPROM, así es que el código deberá tener un par de instrucciones de escrituras en EECON2 que parecieran no tener sentido pero que siempre deberemos usar, al menos en esta gama de PICs.
El código sería el siguiente:
Las variables DIRE y ESCR la debimos de haber declarado al comienzo del programa.
Código:
bcf STATUS,RP0 ;Seleccionamos Banco 0
movlw DIRE ;Ponemos en W la dirección que vamos a escribir
movwf EEADR ;y la guardamos en EEADR
movlw ESCR onemos ahora el dato a escribir en W
movwf EEDATA ;y lo guardamos en EEDATA
bsf STATUS,RP0 ;Seleccionamos Banco 1
bsf EECON1,WREN ;Colocamos el permiso de escritura (WREN) en EECON1 a 1
;Aquí da inicio la secuencia de escritura
movlw 0x55 h ;Inicio de las intrucciones para EECON2
movwf EECON2
movlw 0xAA h
movwf EECON2 ;Fin de las intrucciones para EECON2
bsf EECON1,WR ;Comienza la escritura propiamente dicha.
Cuando se complete todo el proceso de escritura, el Bit WR se pondrá a 0 automáticamente y el señalizador de interrupciones EEIF pasará a valer 1 (y allí se quedará hasta que lo coloquemos a 0 por programa).
Si se quiere realizar un proceso simple de verificación de escritura adicional, podemos restar el dato que hemos escrito al valor actual del registro EEDATA. Si no hubo errores entonces esta resta debe dar 0 y por lo tanto el bit Z (cero) del registro de ESTADO se colocará a uno indicando esta condición, lo que nos servirá de bandera de comprobación.
Seguramente habrán diferencias notables en el manejo de lectura/escritura de otros modelos de PIC y de otra marca de microcontroladores pero su base de funcionamiento es prácticamente la misma.
Deberán tener en cuenta que el proceso de escritura de un byte, borra automáticamente la posición de memoria y luego escribe el dato es decir, borra antes de escribir, así es que tendrán que rescatar el dato anterior antes de su escritura si lo quieren utilizar para algo.
Las memorias EEPROM resisten hasta un millón de ciclos de Lectura/Escritura y además pueden almacenar sus datos en forma contínua sin degradación por alrededor de 40 años.
Para los que no lo saben, EEPROM significa: Electrically Erasable Programmable Read Only Memory, que en castellano podría ser algo como: Memoria Programable de Solo Lectura Borrable Eléctricamente (MPSLBE ?????
).
Espero les sea de utilidad esta explicación y comiencen a sacarle más provecho a sus MC.
Saludos,
Marcelo.