Problème écriture EEPROM dans un pic 16f84

Fermé
Cédric_T_74 - Modifié par Cédric_T_74 le 29/03/2011 à 15:14
Bonjour,

Voici mon problème, je souhaite conserver la valeur d'une variable dans la mémoire EEPROM]de mon pic16f84 après une coupure d'alimentation.

Le but global de mon programme et de pouvoir changer le sens de rotation d'un moteur après une coupure.

Le problème est que lorsque je rajoute la fonction Ecriture_EEPROM(), le programme a un déroulement incompréhensible.

En effet, il ne reste pas dans la boucle infinie while(1).
le programme s'exécute de nouveau depuis le début toutes les 5 secondes environs.
La conséquence est que mon moteur change de sens de rotations toute les 5 secondes.

Je constate que la lecture et l'écriture fonctionne, mais c'est deux fonctions affectent le bon fonctionnement de mon programme.

Avez-vous des idées sur le problème ?

j'utilise le compilateur CC5X, programmager ICD2.

Merci d'avance

Cédric
-----------------------------------------------------------------------------------------------------

#pragma cdata[0x2100]

// Protocotype des fonctions
void InitPIC(void);
unsigned char Lecture_EEPROM(char cAdres);
void Ecriture_EEPROM(char cAdres, unsigned char cVal);

// Déclarations des variables$
unsigned char cData; // donnée à conserver en mémoire
char adresse; //adresse en Eeprom

void main(void)
{

// Initialisation du PIC
InitPIC();
adresse=0x00;

// Lecture dans l'EEPROM
cData= Lecture_EEPROM(adresse);

cData= (!cData); // Inverse l'état
RB4 = cData; // Teste de l'état avec une led

// Ecriture dans l'EEPROM
Ecriture_EEPROM(adresse, cData);

//Ecriture des actionneurs
while(1){
if( cData == 1){ // SENS 1
RB2= 1;
RB3= 0;

}else{ // SENS 2
RB2= 0;
RB3= 1;
}
}
}

void InitPIC(void)
{

TRISA.0 =1;
TRISA.1 =1;
TRISA.2 =1;
TRISA.3 =1;
TRISA.4 =1;

TRISB.0 =1;
TRISB.1 =0;
TRISB.2 =0;
TRISB.3 =0;
TRISB.4 =0;
TRISB.5 =0;
TRISB.6 =0;
TRISB.7 =0;

EECON1=0b00000000 ;
INTCON =0b10001000 ;
OPTION =0b10000011 ;

RB4=0;
}

//------------------------Fonction ecriture dans L'EEprom de donnée--------------------

void Ecriture_EEPROM(char cAdres, unsigned char cVal)
{
while(WR); // Dès le passage de ce bit à 0,
EEADR=cAdres; // placer l'adresse d'écriture dans EEADR
EEDATA=cVal; // Placer l'octet a mémoriser dans EEDATA
WREN=1; // Ce bit à 1 autorise l'écriture
GIE=0; // Bloque les interruptions
EECON2=0x55;
EECON2=0xAA;
WR=1; // Active l'écriture
GIE=1; // autorise les interruptions
WREN=0; // interdit écriture dans eeprom
}

//------------------------Fonction lecture dans L'EEprom de donnée--------------------
char Lecture_EEPROM(char cAdres)
{
while(RD); // Dès le passage de ce bit à 0,
EEADR=cAdres; // placer l'adresse à lire dans le registre EEADR
RD=1; // Après placement de ce bit à 1
return EEDATA; // la donnée lue est mise dans EEDATA.
}
A voir également: