En el PIC 18F45K20 és possible guardar i llegir dades a la memòria de programa però el funcionament és diferent de com ho fem amb la memòria de dades.
El més habitual és que en el moment de programar guardem dades a la memòria de programa i després les llegim. Això és molt útil per aquelles variables que tenen sempre el mateix valor. Per fer-ho, definim les variables com a constants:
... const unsigned char Var = 12; // Constant de 8 bits unsigned char Valor; // Variable de 8 bits ...
... Valor = Var; // Ara Valor val 12 Var = 2; // Això no és correcte i no es compilarà ...
Per a llegir directament (sense haver declarat una constant) la memòria de programa necessitem un punter que s'ha de declarar com a const ja que sinó apuntaria a la memòria de dades. La següent funció llegeix un valor a la memòria de programa:
unsigned char llegir_MP(unsigned int adre) // Llegeix el contingut de la memòria de programa
{ // a la posició indicada per l'adreça
const unsigned char *Punter; // Declarem una variable de tipus punter a memòria de programa
Punter = (const unsigned char *)adre; // Convertim l'adreça indicada a format de punter
// i ho guardem a la variable Punter
return *Punter; // Llegeix i retorna el resultat
}
Observem que li passem l'adreça d'on volem llegir i la funció la converteix en punter que el fa servir per llegir el valor.
La memòria de programa es pot llegir byte a byte però no es pot escriure byte a byte. Escriure a la memòria de programa el que fa és posar a 0 els bits que ho han de ser però no pot posar a 1 els que han de ser 1. Cal fer primer un esborrat (posar tots els bits a 1) del tros de memòria i després fer l'escriptura. L'escriptura de la memòria de programa es fa en blocs sencers de 32 bytes i l'esborrat en blocs sencers de 64 bytes.
Disposem d'un conjunt de funcions ja preprogramades que podem fer servir. En el document pic18_plib.pdf que probablement trobareu a un directori similar a C:\Archivos de programa\Microchip\xc8\v1.12\docs (la situació exacta depèn de com hagueu instal·lat el XC8 i quina versió tingueu) hi ha informació sobre totes les funcions disponibles.
Probablement les més útils (que hem fet servir a l' exemple MP) són les següents:
void ReadFlash(unsigned long Adre_Ini, unsigned int Num_bytes, unsigned char *Vector) // Llegeix la memòria de programa // Adre_Ini és l'adreça inicial // Num_bytes és el número de posicions a llegir // Vector és la variable (Vector[llarg]) // on guardarà el que llegeixi // Hauria de ser Num_bytes <= llarg void EraseFlash(unsigned long Adre_Ini, unsigned long Adre_Fi) // Esborra la memòria de programa // Adre_Ini és l'adreça inicial // però si no és múltiple de 64 agafarà // la múltiple de 64 immediatament anterior // Adre_Fi és l'adreça final // però si el nombre de bytes a esborrar no és múltiple de 64 // augmentarà la mida del tros esborrat fins que ho sigui void WriteBytesFlash(unsigned long Adre_Ini, unsigned int Num_bytes, unsigned char *Vector) // Escriu a la memòria de programa // Cal que hagi estat esborrada abans // Adre_Ini és l'adreça inicial // però si no és múltiple de 32 agafarà // la múltiple de 32 immediatament anterior // Num_bytes és el número de posicions a escriure // Vector és la variable (Vector[llarg]) // d'on agafarà el que escrigui // Hauria de ser Num_bytes <= llarg
Aquestes funcions es troben a la biblioteca flash.h que hauria d'estar a un directori similar a C:\Archivos de programa\Microchip\xc8\v1.12\include\plib. En principi, el compilador llegeix directament les funcions. Si no ho fes, caldria carregar-les picant amb el botó dret sobre Header Files i triant Add Existing Item.

Al MPLAB X no li agraden els directoris amb espais en blanc a la ruta. Si cal carregar el fitxer, és millor fer una còpia del directori C:\Archivos de programa\Microchip\xc8\v1.12\include al directori on tenim els programes (potser C:\PIC\programes\).
Si no ha trobat la biblioteca flash.h potser tampoc trobarà altres fitxers que aquesta biblioteca carrega. Si l'obrim, veurem que carrega GenericTypeDefs.h i pconfig.h; aquest darrer necessita p18cxxx.h. Al final, la configuració completa pot quedar:


Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.