Lecture et écriture EEPROM Pic
Nous utiliserons comme d'habitude le pic 18F4525 et la platine de test avec un afficheur lcd 2 * 16, il est bien sûr possible d'utiliser un autre pic.
Le paragraphe du datasheet qui nous intéresse est le paragraphe 6 qui contient toutes les informations et également les routines en assembleur pour la lecture et l'écriture.
Les fonctions décrite ici sont l'adaptation en "C" des routines assembleurs.
Registres EEPROM
Les différents registres sont :
- EECON1
- EECON2
- EEDATA
- EEADR
- EEADRH
Les registres d'interruption ne sont pas mentionnés ici.
- EEPGD : mis à 0 pour un accés à la mémoire eeprom, 1 pour mémoire flash programme
- CFGS : mis à 0 pour un accés à la mémoire eeprom ou flash programme
- FREE : concerne l'écriture en mémoire flash programme
- WERR : ce bit est mis à 1 si erreur lors d'une écriture
- WREN : mis à 0 interdit l'écriture
- WR : mis à 1 permet l'écriture d'un octet, remis à 0 quand l'écriture est terminée
- RD : mis à 1 permet la lecture d'un octet
Le registre EEDATA est le registre qui contient la donnée à lire ou à écrire.
Les registres EEADR et EEADRH sont les registres qui contiennent l'adresse, le pic 18F4525 disposant de 1024 octets de mémoire eeprom, le registre EEADRH est utilisé.
Attention ces registres sont communs avec la possibilité de lire et d'écrire dans la mémoire flash.
MPLAB X XC8 : Fonctions EEPROM
La procédure pour la lecture est représenté par l'organigramme :
La traduction en langage C donne :
while(EECON1bits.WR);
EEADR = adresse & 0xFF;
EEADRH = (adresse>>8) & 0x03 ;
EEPGD = 0;
EECON1bits.RD = 1 ;
return EEDATA;
Par rapport à la procédure en assembleur il est rajouté un test pour ne faire la lecture que si une procédure d'écriture n'est pas en cours.
La procédure pour la ecriture est représenté par l'organigramme :
La traduction en langage C donne :
char flag_int; while(PIR2bits.EEIF == 0); EEADR = adresse & 0xFF; EEADRH = (adresse>>8) & 0x03 ; EEDATA = donnee; EEPGD = 0; WREN = 1; flag_int = INTCONbits.GIE; EECON2 =0x55; EECON2 = 0xAA; EECON1bits.WR = 1; PIR2bits.EEIF = 0; INTCONbits.GIE = flag_int; WREN = 0;
Par rapport à la procédure en assembleur il est rajouté une gestion du bit "GIE" et le test du bit "EEIF" qui permet de savoir si une écriture est en cours.
Petite remarque le test est effectué sur le bit "EEIF" au lieu du bit "WR", cela revient pratiquement au même.
Le fichier zip exemple eeprom.
Il existe une autre possibilité pour écrire ou lire l'eeprom , l'utilisation de la librairie "EEP.h" que l'on trouve dans le répertoire "plib" (voir le billet concernant l'installation de ces librairies dans le compilateur).
Trois fonctions disponibles :
Busy_eep
Read_b_eep
Write_b_eep
Petite remarque le test est effectué sur le bit "EEIF" au lieu du bit "WR", cela revient pratiquement au même.
Le fichier zip exemple eeprom.
Il existe une autre possibilité pour écrire ou lire l'eeprom , l'utilisation de la librairie "EEP.h" que l'on trouve dans le répertoire "plib" (voir le billet concernant l'installation de ces librairies dans le compilateur).
Trois fonctions disponibles :
est ce que ce la meme chose avec pic 16f877a
RépondreSupprimer