Programació en C del PIC 18F45K20

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

Exemple EE - Memòria EEPROM

El programa que proposem escriurà els següents vuit valors a la memòria EEPROM:

	   LED			Valor
	76 54 32 10
	00 11 00 11		 51
	10 10 10 10		170
	11 11 00 00		240
	11 00 11 00		204
	01 01 01 01		 85
	00 00 11 11		 15
	10 01 10 01		153
	01 10 01 10		102

Llavors 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 vuit valors sobre els LED. Després tornarà a començar.

#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF				// CONFIG1H
#pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30				// CONFIG2L
#pragma config WDTEN = OFF, WDTPS = 32768					// CONFIG2H
#pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC		// CONFIG3H
#pragma config STVREN = ON, LVP = OFF, XINST = OFF				// CONFIG4L
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF			// CONFIG5L
#pragma config CPB = OFF, CPD = OFF						// CONFIG5H
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF			// CONFIG6L
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF				// CONFIG6H
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF		// CONFIG7L
#pragma config EBTRB = OFF							// CONFIG7H
#include "p18f45k20.h"				// Carrega el fitxer d'adreces i paràmetres del PIC 18F45K20
#include <xc.h>					// Carrega el fitxer de funcions
unsigned char Posicio;  			// Variable de 8 bits per a l'adreça
						// Definició de les funcions que farem servir 
unsigned char llegir_EEPROM(unsigned char adre);
						// Llegeix el contingut de l'EEPROM
						// a la posició indicada per l'adreça
void escriu_EEPROM(unsigned char adre, unsigned char dada);
						// Escriu el valor donat a l'adreça EEPROM indicada
void main (void)
{
	TRISD = 0b00000000;     		// El port D és de sortida
	ANSEL = 0;				// Desactiva totes les entrades analògiques
	ANSELH = 0;	
	INTCON2bits.RBPU = 0;			// Habilita el control de resistències de pull-up al port B
	WPUBbits.WPUB0 = 1;			// Activa la resistència de pull-up a RB0
	TRISBbits.TRISB0 = 1;       		// RB0 és entrada
						// Configuració d'interrupció a INT0 (RB0)
	INTCON2bits.INTEDG0 = 0;		// Interrupció quan es desactiva (quan es prem el polsador)
						// INT0 sempre és de prioritat alta, no cal definir-ho
	INTCONbits.INT0IF = 0;			// Inicialitzem amb el bit de control desactivat
	INTCONbits.INT0IE = 1;			// Habilitem la interrupció IN0
	RCONbits.IPEN = 0;			// Només un nivell d'interrupció
	escriu_EEPROM(0, 51);			// Escriu el primer valor
	escriu_EEPROM(1, 170);			// i el segon...
	escriu_EEPROM(2, 240);
	escriu_EEPROM(3, 204);
	escriu_EEPROM(4, 85);
	escriu_EEPROM(5, 15);
	escriu_EEPROM(6, 153);
	escriu_EEPROM(7, 102);			// Escriu el vuitè valor
	Posicio = 0;				// Comencem a la posició 0
	LATD = 1;				// Inicialment només el LED 0
	INTCONbits.PEIE = 1;			// Permet les interrupcions de perifèrics
	INTCONbits.GIE = 1;			// Permet les interrupcions globalment
	while (1)				// Bucle infinit sense fer res
		;
}
unsigned char llegir_EEPROM(unsigned char adre)
{						// Llegeix el contingut de l'EEPROM
						// a la posició indicada per l'adreça
	EECON1bits.EEPGD = 0;			// Seleccionem EEPROM i no memòria de programa
	EECON1bits.CFGS = 0;			// Seleccionem EEPROM i no configuracions
	EEADR = adre;				// Adreça que volem llegir
	EECON1bits.RD = 1;			// Activa la lectura
	return EEDATA;				// Llegeix i retorna el resultat
}
void escriu_EEPROM(unsigned char adre, unsigned char dada)
{						// Escriu el valor donat a l'adreça EEPROM indicada
	EECON1bits.EEPGD = 0;			// Seleccionem EEPROM i no memòria de programa
	EECON1bits.CFGS = 0;			// Seleccionem EEPROM i no configuracions
	EEDATA = dada;				// Valor que volem escriure
	EEADR = adre;				// Adreça que volem escriure
	EECON1bits.WREN = 1;			// Habilita l'escriptura
	INTCONbits.GIE = 0;			// Desactiva interrupcions
	EECON2 = 0x55;				// Cal escriure uns valors predeterminats (55h i AAh)
	EECON2 = 0xAA;				// a EECON2 per activar el procés d'escriptura
	EECON1bits.WR = 1;			// Activa l'escriptura
	INTCONbits.GIE = 1;			// Reactivem interrupcions
	while (EECON1bits.WR == 1)		// Esperem a que l'escriptura acabi
		;
	EECON1bits.WREN = 0;			// Deshabilitem l'escriptura
}
void interrupt polsador(void)			// funció d'interrupcions
{
	if (INTCONbits.INT0IF)			// Comprovem que hi ha interrupció per INT0
	{
		_delay(20000);	    		// Retard per evitar rebots
		INTCONbits.INT0IF = 0;		// Desactivem el bit que indica la interrupció
	if (PORTBbits.RB0 == 0)			// Si el polsador encara està premut
		{
			LATD = llegir_EEPROM(Posicio++);	// llegeix EEPROM, ho posa als LED i incrementa
			if (Posicio == 8)
				Posicio = 0;	// Quan haguem fet els 8, tornem a començar
		}
	}
}

 

 

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