Programació en C del PIC 16F690 amb PICkit 2

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 EE) guardem uns valors a la memòria de programa 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 EEPROM. El programa esperarà que premem el polsador. Quan el premem llegirà un valor de l'EEPROM 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 "pic16f690.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 16F690
#include <xc.h>					// Carrega el fitxer de funcions
#define Polsador   PORTAbits.RA3		// Li assigna un nom a l'adreça del polsador
unsigned short adressa;				// Variable de 16 bits per a l'adreça
unsigned char Posicio;  			// Variable de 8 bits per a l'adreça
const unsigned char LlistaMP[16] @ 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 = 0x600 + Posicio++;	// Calcula l'adreça
		while (Polsador == 1);		// Esperem a que el polsador es premi
			;			// No fem res
		PORTC = llegir_MemProg(adressa);	// llegeix memòria de programa, ho posa als LED i incrementa
		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 = 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.

 

 

Licencia de Creative Commons
Esta obra de Oriol Boix está licenciada bajo una licencia no importada Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0.