MEMORIA EEPROM El contenido de la EEPROM se puede cambiar durante el funcionamiento (similar a la RAM), pero se queda permanentemente guardado después

de la pérdida de la fuente de alimentación (similar a la ROM). Por lo tanto, la EEPROM se utiliza con frecuencia para almacenar los valores creados durante el funcionamiento, que tienen que estar permanentemente guardados. Por ejemplo, si usted ha diseñado una llave electrónica o una alarma, sería estupendo permitir al usuario crear e introducir una contraseña por su cuenta. Por supuesto, la nueva contraseña tiene que estar guardada al apagar la fuente de alimentación. En tal caso una solución perfecta es el microcontrolador con una EEPROM embebida. El PIC16F887 dispone de 256 localidades de memoria EEPROM controlados por los bits de los siguientes registros:  EECON1 (registro de control);  EECON2 (registro de control);  EEDAT (almacena los datos listos para escritura y lectura); y  EEADR (almacena la dirección de la EEPROM a la que se accede). Además, el registro EECON2 no es un registro verdadero, no existe físicamente en el chip. Se utiliza sólo durante la escritura de los datos en la memoria. Los registros EEDATH y EEADRH se utilizan durante la escritura y lectura de la EEPROM. Los dos se utilizan también durante la escritura y lectura de la memoria de programa (FLASH). Registro EECON1

EEPGD - Program/Data EEPROM Select bit (bit de selección de memorias)  1 - Acceso a la memoria Flash de programa.  0 - Acceso a la memoria de datos EEPROM. WRERR - EEPROM Error Flag bit (bit de error de escritura)  1 - Se produce un error de escritura de forma prematura y ha ocurrido un error.  0 - Se ha completado la operación de escritura. WREN - EEPROM Write Enable bit (bit de habilitación de escritura)  1 - Escritura de datos en la EEPROM habilitada.  0 - Escritura de datos en la EEPROM deshabilitada. WR - Write Control bit (bit de control de escritura)  1 - Se ha iniciado una operación de escritura de datos en la EEPROM.  0 - Se ha completado una operación de escritura de datos en la EEPROM. RD - Read Control bit (bit de control de lectura)  1 - Inicia una lectura de la memoria EEPROM.  0 - Lectura de la memoria EEPROM deshabilitada.

LECTURA DE LA MEMORIA EEPROM Para leer los datos de la memoria EEMPROM, siga los siguientes pasos:  Paso 1: Escribir la dirección (00h - FFh) en el registro EEADR.

PORTC = 0x00.0xAA). ESCRITURA EN LA MEMORIA EEPROM Antes de escribir los datos en la memoria EEPROM es necesario escribir la dirección en el registro EESADR y los datos en el registro EESAT. char ii.   Paso 2: Seleccionar el bloque de memoria EEPROM al poner a cero el bit EEPGD del registro EECON1. ii++) { // Leer el bloque de 32 bytes de la dirección PORTD = EEPROM_Read(0x80+ii). Delay_ms(1000). TRISD = 0. Delay_ms(1000). // La variable ii utilizada en el bucle void main(){ ANSEL = 0. ANSELH = 0. // El ejemplo muestra cómo utilizar la librería EEPROM en el compilador mikroC PRO for PIC. PORTC = 0xFF. ii < 32. TRISB = 0. // Leer los datos de la dirección 2 de la EEPROM y // Llenar el búfer con los datos // Escribir los datos en la dirección 0x80+ii // Escribir un dato en la dirección 2 de la EEMPROM // Escribir un dato en la dirección 0x5 de la EEMPROM // Diodos en los puertos PORTB y PORTC // para indicar el comienzo de la lectura // Configuración de los pines AN como E/S digitales // Visualizarla en el puerto PORTB PORTC = EEPROM_Read(0x50). PORTB = EEPROM_Read(0x02). Sólo ha quedado seguir a una secuencia especial para iniciar la escritura para cada byte.0x55). Delay_ms(1000). PORTB = 0xFF. ii). // 0x80 y visualizarla en el puerto PORTD Delay_ms(250). PORTD = 0. for(ii = 0. TRISC = 0. ii < 32. } } . ii++) EEPROM_Write(0x80+ii. EEPROM_Write(0x50. Paso 4: El dato se almacena en el registro EEDAT y está listo para su uso. PORTB = 0x00. Paso 3: Poner a uno el bit RD del mismo registro para leer el contenido de la localidad. PORTC = 0. for(ii = 0. Durante el proceso de escritura las interrupciones deben estar deshabilitadas. EEPROM_Write(0x02. // Leer los datos de la dirección 0x50 de la EEPROM y // Visualizarla en el puerto PORTC Delay_ms(1000). PORTB = 0.

Librería de Memoria Flash Esta biblioteca proporciona rutinas para acceder a la memoria flash del microcontrolador. Todas las instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan colectivamente Conjunto de instrucciones.  Leer. Tenga en cuenta que la operación de escritura que se ejecuta como borrado y escritura. Importante: Debido a las características específicas de memoria flash de las familias P16/P18. Cada palabra se interpreta por la CPU como una instrucción a ser ejecutada durante el funcionamiento del microcontrolador. Ya que es posible escribir y borrar el contenido de esta memoria prácticamente un número ilimitado de veces. el bloque de memoria flash tiene que ser borrado antes de la escritura (la operación de escritura no se ejecuta como borrado y escritura). escribir y borrar las funciones estan implementadas. los microcontroladores con memoria Flash son perfectos para estudiar. Tenga en cuenta que los prototipos difieren para las familias PIC16 y PIC18. Como es más fácil trabajar con el sistema de numeración hexadecimal. Para este grupo de MCU ls funciones de leer y escribir están implementan. el segmento de memoria que se borran puede ser mayor que el tamaño del bloque de datos que se escribirán (MCU dependiente). Adicionalmente. tmp = FLASH_Read(0x0D00) . dim byref Data as word[4]) Escribe los bloques de datos en la memoria Flash. el código ejecutable se representa con frecuencia como una serie de los números hexadecimales denominada código Hex. la librería flash es MCU dependiente. P16: Esta función puede borrar un segmento de memoria antes de escribir bloques de datos en él (MCU dependiente). puede escribir menos bytes que los que borra. main: . end. por lo que debe ser llamado tantas veces como sea necesario para cumplir con el tamaño del bloque de datos que se va a escribir. ..MEMORIA FLASH El microcontrolador ejecuta el programa cargado en la memoria Flash. se recomienda escribir tantos bytes como se van a borrar..  Leer y escribir operaciones soportadas (escritura se ejecuta como borrado y escritura). Consulte hoja de MCU datos antes de utilizar la biblioteca flash. FLASH_Read Para PIC16: sub function FLASH_Read(dim Address as word) as word Regresa los datos desde una dirección especifica de la memoria flash. Operaciones de memoria Flash que son MCU dependientes:  La operación de lectura es compatible. FLASH_Write Para PIC16: sub procedure FLASH_Write(dim Address as word. Además. Esto se denomina el código ejecutable.. Para este grupo de MCU sólo leer la función está implementado.. Por lo tanto. Para este grupo de lectura MCU. experimentar y para la fabricación en pequeña escala. Tamaño del bloque es MCU dependiente. dim tmp as byte . escribir y borrar operaciones apoyadas... FLASH_Write escribe 4 posiciones de memoria flash en una fila.

. toWrite) . luego.dim toWrite as byte[64] .. FLASH_Erase_64($0D00) EJEMPLO: Esta es una simple demostración de cómo utilizar la memoria flash interna del PIC16 para almacenar datos. Por lo tanto. las mismas ubicaciones se leen y los datos se muestran en PORTB y PORTC. Por P16 Familly se aplica sólo para los de MCU cuya memoria flash no soporta operaciones de borrado y escritura (consulte la hoja de datos). end. se recomienda realizar escrituras de flash en pedazos de 16 palabras.. La operación de escritura se borde alineado y no puede ocurrir a través de fronteras. main: . ' initialize array: for i = 0 to 63 toWrite[i] = i next i . data_ as word dataAR as word[4][4] main: ANSEL = 0 ' Configure AN pins as digital ' Disable comparators ' Initial PORTB value ' Set PORTB as output ' Initial PORTC value ' Set PORTC as output ANSELH = 0 C1ON_bit = 0 C2ON_bit = 0 PORTB = 0 TRISB = 0 PORTC = 0 TRISC = 0 Delay_ms(500) ‘Todos los bloques escritos en la memoria del programa se realizan como palabras de 16 borrado por las operaciones de escritura de ocho palabras. FLASH_Erase Para PIC16: sub procedure FLASH_Erase(dim address as word) Borra bloques de memoria a partir de una dirección dada. program Flash_Write dim counter as byte addr. ' write contents of the array to the address 0x0D00: FLASH_Write_64(0x0D00.. Desde que la rutina FLASH_Write escribe en trozos de 4 palabras.... tenemos que llamarlo 4 veces en una fila. Esa es la razón por la que los bits de la dirección de inicio menores de 4 [0:3] deben ser cero. Los datos se escriben a partir de la ubicación dada.. dataAR[0][0]= 0x3FAA+0 dataAR[0][1]= 0x3FAA+1 .

. Con tal propósito. se pierde el contenido de la memoria RAM. además están fabricados de la misma forma y se comportan de la manera similar. ' ' two MSB's will always be '00' and PORTC MS Byte ' display data on PORTB LS Byte ' P16's FLASH is 14-bit wide. En este caso consiste en dos partes: en registros de propósito general y en los registros de funciones especiales (SFR). valid for P16F887 ' write some data to Flash MEMORIA RAM Es la tercera y la más compleja parte de la memoria del microcontrolador. Todos estos registros se dividen en cuatro bancos de memoria. Aunque los dos grupos de registros se ponen a cero al apagar la fuente de alimentación. Por ejemplo. uno de los registros de la RAM es denominado “suma” y se utiliza para almacenar los resultados de la adición. si el programa ejecuta la adición (de cualquier cosa) es necesario tener un registro que representa lo que se llama “suma” en vida cotidiana. Al apagar la fuente de alimentación. sus funciones no tienen muchas cosas en común.dataAR[0][2]= 0x3FAA+2 dataAR[0][3]= 0x3FAA+3 dataAR[1][0]= 0x3FAA+4 dataAR[1][1]= 0x3FAA+5 dataAR[1][2]= 0x3FAA+6 dataAR[1][3]= 0x3FAA+7 dataAR[2][0]= 0x3FAA+8 dataAR[2][1]= 0x3FAA+9 dataAR[2][2]= 0x3FAA+10 dataAR[2][3]= 0x3FAA+11 dataAR[3][0]= 0x3FAA+12 dataAR[3][1]= 0x3FAA+13 dataAR[3][2]= 0x3FAA+14 dataAR[3][3]= 0x3FAA+15 addr = 0x0430 for counter = 0 to 3 Delay_ms(100) FLASH_Write(addr+counter*4. Se utiliza para almacenar temporalmente los datos y los resultados inmediatos creados y utilizados durante el funcionamiento del microcontrolador. dataAR[counter]) next counter Delay_ms(500) addr = 0x0430 for counter = 0 to 15 data_ = FLASH_Read(addr) Inc(addr) Delay_us(10) PORTB = data_ PORTC = word(data_ >> 8) Delay_ms(500) next counter end. so ' starting Flash address.

Sign up to vote on this title
UsefulNot useful