Programació en C del PIC 18F45K20

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Memòria de programa

Constants a la memòria de programa

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à
...

Lectura de la memòria de programa

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.

Llegir i escriure a la memòria de programa

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.

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:

Header Files

 

 

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