Muchos PIC18 tienen memoria EEPROM, de hasta 1K de tamaño. Desafortunadamente 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 ciclos de borrado / escritura, y el flash es 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 los programas y los datos (es decir, puede tener una dirección de programa 4 y una dirección de datos 4, y no son la mismo). Por lo tanto, no puede leer ni escribir en la memoria flash utilizando los métodos normales en C o en lenguaje ensamblador.
En cambio, en la familia PIC18, configura una dirección de inicio en un registro de 22 bits llamado TBLPTR. Para leer bytes desde 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 memoria flash de 64 bytes que se escribirá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 erróneo borre accidentalmente la memoria. Finalmente, se ejecuta el comando para realizar el borrado, y luego se vuelven 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 el incremento / decremento automático como la instrucción TBLRD.
Además de guardar los datos de configuración, la escritura en la memoria flash permite actualizar el firmware en el campo utilizando lo que se denomina "firmware por aire". Debe tener un bloque fijo de firmware, generalmente al inicio de la memoria del programa, que puede 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 que se completa la actualización, se inicia un reinicio y el nuevo código se pone en uso.
Muchos otros microcontroladores, además de la familia PIC, tienen la capacidad de actualizar su memoria flash; la mayoría utiliza alguna combinación de registros de configuración, un puntero de dirección e instrucciones especiales para llevar a cabo la tarea.