Programació en C del PIC 16F690

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

Exemple MP - Dades a la memòria de programa

En el programa següent (similar al de l'exemple EP) guardem uns valors a la memòria de programa (flash) en el moment de programar (definits com a constants) i després els llegim de la memòria de programa.

Guardarem els 16 codis Gray a la memòria flash. El programa esperarà que premem el polsador. Quan el premem llegirà un valor de la flash i el copiarà sobre els LED. Si tornem a prémer el polsador en llegirà un altre i així fins que hagi copiat els 16 valors sobre els LED. Després tornarà a començar.

Valor
decimal
Binari
natural
Binari
Gray
Valor
hexadecimal
          Valor
decimal
Binari
natural
Binari
Gray
Valor
hexadecimal
0 0000 0000 0 8 1000 1100 C
1 0001 0001 1 9 1001 1101 D
2 0010 0011 3 10 1010 1111 F
3 0011 0010 2 11 1011 1110 E
4 0100 0110 6 12 1100 1010 A
5 0101 0111 7 13 1101 1011 B
6 0110 0101 5 14 1110 1001 9
7 0111 0100 4 15 1111 1000 8

La memòria de programa és de 14 bits i posarem un byte a cada posició. Hem escrit doncs un nombre hexadecimal format per tres zeros i el valor que hi ha a la taula anterior. El programa és el següent:

#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
#include <xc.h>					// Carrega el fitxer de funcions necessari per al compilador XC8
#define Polsador   RA3		// Li assigna un nom a l'adreça del polsador
#define inici 0x600
unsigned short adressa;				// Variable de 16 bits per a l'adreça
unsigned char Posicio;  			// Variable de 8 bits per a la posició
const unsigned char LlistaMP[16] __at(0x600) = {0x0000, 0x0001, 0x0003, 0x0002, 0x0006, 0x0007, 0x0005, 0x0004,
                                                0x000C, 0x000D, 0x000F, 0x000E, 0x000A, 0x000B, 0x0009, 0x0008};
						// Definició de les funcions que farem servir 
unsigned char llegir_MemProg(unsigned short adre);
						// Llegeix el contingut de la memòria de programa
						// a la posició indicada per l'adreça
void main (void){
	TRISC = 0b00000000; 			// Posa el port C com a sortida
	TRISA = 0b00001000; 			// Posa RA3 com a entrada
	Posicio = 0;				// Comencem a la posició 0
	while (1) {				// Bucle infinit 
		adressa = inici + Posicio++;	// Calcula l'adreça i incrementa la posició
		while(Polsador == 1)		// Esperem a que el polsador es premi
			;			// No fem res
		PORTC = llegir_MemProg(adressa);	// llegeix memòria de programa i ho posa als LED
		if (Posicio == 16)
			Posicio = 0;		// Quan haguem fet els 16, tornem a començar
		while(Polsador == 0)		// Esperem a que el polsador es deixi anar
			;			// No fem res
		_delay(20000);	    		// Retard per evitar rebots
	}
}
unsigned char llegir_MemProg(unsigned short adre) {
						// Llegeix el contingut de la memòria de programa
						// a la posició indicada per l'adreça
	EEADRH = adre/256;			// Part més significativa de l'adreça que volem llegir
	EEADR = (unsigned char) adre%256;			// Part menys significativa de l'adreça que volem llegir
	EECON1bits.EEPGD = 1;			// Seleccionem memòria de programa i no EEPROM
	EECON1bits.RD = 1;			// Activa la lectura
	_delay(5);				// Donem temps a fer la lectura
	return EEDAT;				// Llegeix i retorna el resultat
}

Si després de picar a la icona Program Device fem:

View Program Memory

Obtindrem:

és a dir, els valors que hem posat a const unsigned char LlistaMP[16] encara que, si ens fixem bé, amb els primers dos dígits hexadecimals canviats. El motiu del canvi és que a la finestra s'està interpretant el que es llegeix a la memòria de programa com si fossin instruccions. Però no té cap importància perquè els vuit bits que fem servir sí els guarda correctament.

 

 

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