Muchos PIC18 tienen memoria EEPROM, hasta 1K de tamaño. Lamentablemente, el PIC18F46J50 al que hace referencia no lo hace. Si EEPROM está disponible, es una opción mucho mejor si es lo suficientemente grande para sus datos, ya que la EEPROM tiene un mínimo de 1,000,000 de ciclos de borrado / escritura, y el flash es de solo 10,000.
El PIC18, como la mayoría de los otros microcontroladores, utiliza lo que se llama una arquitectura de Harvard, lo que significa que hay un área direccionable físicamente separada para programas y datos (es decir, puede tener una dirección de programa 4 y una dirección de datos 4, y no son lo mismo). Por lo tanto, no puede leer ni escribir memoria flash utilizando los métodos normales en lenguaje C o ensamblador.
En cambio, en la familia PIC18, configura una dirección de inicio en un registro de 22 bits llamado TBLPTR. Para leer bytes de la memoria flash, utiliza una instrucción TBLRD. Hay una opción para aumentar o disminuir automáticamente la dirección después de una lectura, no tiene que hacerlo manualmente.
Para escribir en la memoria flash, primero debe borrar uno o más bloques de 64 bytes de memoria flash que se sobrescribirán. Después de configurar la dirección de inicio nuevamente en TBLPTR, y los valores en algunos otros registros para inicializar la operación de borrado, las interrupciones se desactivan y luego debe escribir 0x55 inmediatamente seguido de 0xAA en un registro; Esto desbloquea el comando de borrado y es necesario para evitar que el código errante borre accidentalmente la memoria. Finalmente, se ejecuta el comando para borrar realmente, seguido de volver a habilitar las interrupciones.
Escribir en la memoria flash es similar a borrar, excepto que el tamaño del bloque es más pequeño. La escritura se ejecuta realmente usando una instrucción TBLWT, que también permite un incremento / decremento automático como la instrucción TBLRD.
Además de guardar los datos de configuración, escribir en la memoria flash le permite a uno actualizar su firmware en el campo utilizando lo que se denomina "firmware por aire". Debe tener un bloque fijo de firmware, generalmente al comienzo de la memoria del programa, que pueda recibir la actualización de un módulo Bluetooth, Wi-Fi, módulo celular o incluso una conexión por cable, y actualizar el flash por encima de cierto punto en el programa (por ejemplo, una "cerca") con un nuevo código. Una vez completada la actualización, se inicia un restablecimiento y se pone en uso el nuevo código.
Muchos otros microcontroladores además de la familia PIC tienen la capacidad de actualizar su memoria flash; la mayoría usa alguna combinación de registros de configuración, un puntero de dirección e instrucciones especiales para llevar a cabo la tarea.