Muchos PIC18 tienen memoria EEPROM, de hasta 1K de tamaño. Desafortunadamente, el PIC18F46J50 al que haces referencia no la tiene. Si la EEPROM está disponible, es una opción mucho mejor si es lo suficientemente grande para tus datos, ya que la EEPROM tiene un mínimo de 1.000.000 de ciclos de borrado/escritura, y la flash sólo 10.000.
El PIC18, como la mayoría de los otros microcontroladores, utiliza lo que se llama una arquitectura Harvard, lo que significa que hay áreas direccionables físicamente separadas para programas y datos (es decir, usted puede tener una dirección de programa 4 y una dirección de datos 4, y no son lo mismo). Por lo tanto, no se puede leer o escribir en la memoria flash utilizando los métodos normales, ya sea en C o lenguaje ensamblador.
En cambio, en la familia PIC18, se establece una dirección de inicio en un registro de 22 bits llamado TBLPTR. Para leer bytes de la flash, se utiliza una instrucción TBLRD. Hay una opción para incrementar o decrementar automáticamente la dirección después de una lectura, no tienes que hacerlo manualmente.
Para escribir en la memoria flash, primero hay que borrar uno o varios bloques de 64 bytes de la memoria flash sobre la que se escribirá. Después de configurar de nuevo la dirección de inicio en TBLPTR, y los valores en algunos otros registros para inicializar la operación de borrado, las interrupciones se desactivan y entonces debes escribir 0x55 inmediatamente seguido de 0xAA en un registro; esto desbloquea el comando de borrado y es necesario para evitar que código errante borre accidentalmente la memoria. Finalmente se ejecuta el comando para realizar el borrado, seguido de la reactivación de las interrupciones.
La escritura en la memoria flash es similar al borrado, con la diferencia de que el tamaño del bloque es menor. En realidad, la escritura se ejecuta mediante 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 sobre el terreno mediante lo que se denomina "firmware over the air". Es necesario tener un bloque fijo de firmware, normalmente al principio de la memoria de programa, que pueda recibir la actualización desde un módulo Bluetooth, Wi-Fi, módulo celular o incluso una conexión por cable, y actualizar la flash por encima de un determinado punto del programa (por ejemplo, una "valla") con nuevo código. Una vez completada 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.