De nombreux PIC18 ont une mémoire EEPROM, jusqu'à 1 Ko. Malheureusement, le PIC18F46J50 auquel vous faites référence ne le fait pas. Si l'EEPROM est disponible, c'est un bien meilleur choix si elle est suffisamment grande pour vos données, car l'EEPROM a un minimum de 1000000 de cycles d'effacement / écriture et le flash n'est que de 10000.
Le PIC18, comme la plupart des autres microcontrôleurs, utilise ce qu'on appelle une architecture Harvard, ce qui signifie qu'il existe une zone adressable physiquement distincte pour les programmes et les données (c'est-à-dire que vous pouvez avoir une adresse de programme 4 et une adresse de données 4, et ce ne sont pas les mêmes). Par conséquent, vous ne pouvez pas lire ou écrire de mémoire flash à l'aide des méthodes normales en langage C ou en assembleur.
Au lieu de cela, sur la famille PIC18, vous configurez une adresse de départ dans un registre 22 bits appelé TBLPTR. Pour lire les octets du flash, vous utilisez une instruction TBLRD. Il existe une option pour incrémenter ou décrémenter automatiquement l'adresse après une lecture, vous n'avez pas à le faire manuellement.
Pour écrire dans la mémoire flash, vous devez d'abord effacer un ou plusieurs blocs de mémoire flash de 64 octets qui seront écrasés. Après avoir configuré à nouveau l'adresse de départ dans TBLPTR et les valeurs dans certains autres registres pour initialiser l'opération d'effacement, les interruptions sont désactivées, puis vous devez écrire 0x55 immédiatement suivi de 0xAA dans un registre; cela déverrouille la commande d'effacement et est nécessaire pour empêcher un code erroné d'effacer accidentellement la mémoire. Enfin, la commande pour réellement effacer est exécutée, suivie de la réactivation des interruptions.
L'écriture dans la mémoire flash est similaire à l'effacement, sauf que la taille du bloc est plus petite. L'écriture est en fait exécutée à l'aide d'une instruction TBLWT, qui permet également une incrémentation / décrémentation automatique comme l'instruction TBLRD.
En plus d'économiser les données de configuration, l'écriture dans la mémoire flash permet de mettre à jour leur micrologiciel sur le terrain à l'aide de ce qu'on appelle un "micrologiciel en direct". Vous devez avoir un bloc fixe de micrologiciel, généralement au début de la mémoire du programme, qui peut recevoir la mise à jour d'un module Bluetooth, Wi-Fi, module cellulaire ou même d'une connexion filaire, et mettre à jour le flash au-dessus d'un certain point dans le programme (par exemple une "clôture") avec un nouveau code. Une fois la mise à jour terminée, une réinitialisation est lancée et le nouveau code est mis en service.
De nombreux autres microcontrôleurs en plus de la famille PIC ont la possibilité de mettre à jour leur mémoire flash; la plupart utilisent une combinaison de registres de configuration, un pointeur d'adresse et des instructions spéciales pour effectuer la tâche.