La memoria EEPROM (c) Domingo Llorente 2010 1 Características Los pics de la familia 16F87x disponen de una zona de memoria especial (EEPROM), donde podemos guardar nuestros datos sin temor a perderlos cuando dejamos de alimentar el dispositivo. La memoria EEPROM no está mapeada en el mapa de memoria y se accede a ella a través de unos registros especiales. También es posible acceder a la memoria flash de programa en tiempo de ejecución del programa. Cantidad de EEPROM implementada según el modelo de pic: (c) Domingo Llorente 2010 2 Registros asociados (I) Son un total de 8 registros los que intervienen, en mayor o menor medida en el control de la lectura/escritura de la memoria EEPROM. (c) Domingo Llorente 2010 3 El registro EECON1 (c) Domingo Llorente 2010 4 Leer datos de la EEPROM Procedimiento de lectura: 1º.- Escribir en el registro EEADR la “dirección” de la memoria que queremos leer. 2º.- Poner a cero el bit EEPGD del registro EECON1. 3º.- Poner a uno el bit RD del registro EECON1. 4º.- Leer el dato del registro EEDATA. (c) Domingo Llorente 2010 5 Escribir datos en la EEPROM 1º.- Escribir la dirección donde queremos escribir en el registro EEADR. 2º.- Escribir el dato en el registro EEDATA. 3º.- Poner a cero el bit EEPGD del registro EECON1. 4º.- Poner a uno el bit WREN del registro EECON1. 5º.- Deshabilitar las interrupciones (si están habilitadas). 6º.- Ejecutar la siguiente secuencia de instrucciones: • Escribir el dato 55h en el registro EECON2 en dos pasos, primero cargarlo en el acumulador y luego en el registro EECON2. • Escribir el dato AAh en el registro EECON2 en dos pasos, primero cargarlo en el acumulador y luego en el registro EECON2. • Poner a uno el bit WR del registro EECON1 para iniciar la escritura. 7º.- Habilitar las interrupciones (si se deshabilitaron). 8º.- Poner a cero el bit WREN del registro EECON1. Al término del ciclo de escritura (varios milisegundos) el bit WR se pone a cero y la bandera EEIF se pone a uno. (c) Domingo Llorente 2010 6 Lectura/Escritura EEPROM en CCS El compilador CCS se encarga de realizar los procedimientos de lectura / escritura de la EEPROM a través de dos funciones: Para leer de la EEPROM: valor=read_eeprom (dirección); // valor debe ser del tipo int8 Para escribir un dato en la EEPROM: write_eeprom (dirección,dato); Ej: write_eeprom(0x00,0x01); // Guarda el dato 1 en la pos. 0x00 Nota: Poner especial atención para no leer/escribir de/en una posición de memoria NO implementada. Para 16F877A, el rango es: 00-FF (256 posiciones) (c) Domingo Llorente 2010 7 Ejercicio de aplicación Diseñar un programa que incremente el valor decimal (0-9) del display de siete segmentos de la placa de periféricos con cada flanco descendente en RC0. Guardar el estado del display de forma que si se apaga el entrenador al volverlo a conectar mantenga el valor con el que se apagó. (c) Domingo Llorente 2010 8 Solución propuesta (c) Domingo Llorente 2010 9