pages

26 avr. 2016

Lecture / Ecriture mémoire EEPROM interne

Un petit billet pour étudier la lecture et l'écriture de valeurs dans la mémoire eeprom du PIC.

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.

Le premier EECON1 est le registre de configuration :

eeprom registre eecon1


  • 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 EECON2 est un registre particulier car ce n'est pas un registre physique et sert pour sécuriser l'écriture dans l'eeprom.

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 :

eeprom organigramme lecture

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 :

eeprom organigramme ecriture

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





  • 1 commentaire: