Le PIC 16F84A dispose de 64 octets (64 x 8 bits) de mémoire EEPROM.
L'EEPROM (Electrically Erasable Programmable Read Only Memory) est une mémoire permanente, c'est à dire que les données sont conservées même si le microcontrôleur est longtemps hors tension (dans le cas de la mémoire RAM, les données sont perdues).
On peut réécrire jusqu'à 10 millions de fois dans la mémoire EEPROM du PIC 16F84A.
On rappelle qu'une opération d'écriture dans une mémoire de type EEPROM est très lente : plusieurs millisecondes (1 ms = 5 000 cycles avec un quartz de 20 MHz !).
L'EEPROM du PIC 16F84A est indirectement accessible à travers les registres EEADR, EEDATA, EECON1 et EECON2.
1- Registre EEADR
Il s'agit d'un registre spécial situé à l'adresse 0x09 (banque 0) de la mémoire des données (Data RAM).
Ce registre contient l'adresse de l'emplacement mémoire que l'on veut manipuler (pour une lecture ou une écriture).
Les 64 octets sont situés aux adresses 0x00 à 0x3F.
2- Registre EEDATA
Il s'agit d'un registre spécial situé à l'adresse 0x08 (banque 0) de la mémoire des données (Data RAM).
Ce registre contient la valeur (8 bits) de l'emplacement mémoire que l'on veut manipuler (pour une lecture ou une écriture).
3- Registre EECON1
Il s'agit d'un registre spécial situé à l'adresse 0x88 (banque 1) de la mémoire des données (Data RAM).
Nom
|
Description | |
bit 7
|
-
|
|
bit 6
|
-
|
|
bit 5
|
-
|
|
bit 4
|
EEIF
|
"EEPROM Write operation interrupt flag"
|
bit 3
|
WRERR
|
"EEPROM Error flag bit"
|
bit 2
|
WREN
|
"EEPROM Write Enable bit"
|
bit 1
|
WR
|
"Write Control bit"
|
bit 0
|
RD
|
"Read Control bit"
|
4- Registre EECON2
Il s'agit d'un registre spécial situé à l'adresse 0x89 (banque 1) de la mémoire des données (Data RAM).
Ce registre n'est pas un registre physique ...
5- Lecture d'une donnée en mémoire EEPROM
bcf STATUS , RP0 ; passage en banque 0
movlw 0x10
movwf EEADR ; 0x10 est l'adresse de l'emplacement mémoire
bsf STATUS , RP0 ; passage en banque 1
bsf EECON1 , RD ; lecture de l'EEPROM
bcf STATUS , RP0 ; passage en banque 0
movf EEDATA, W ; la valeur lue dans l'EEPROM est placée dans l'accumulateur
6- Ecriture d'une donnée en mémoire EEPROM
bcf STATUS , RP0 ; passage en banque 0
movlw 0x10
movwf EEADR ; 0x10 est l'adresse de l'emplacement mémoire
movlw 0xE3
movwf EEDATA ; 0xE3 est la donnée à écrire dans l'emplacement mémoire
bsf STATUS , RP0 ; passage en banque 1
bcf INTCON , GIE ; désactivation de toutes les interruptions (recommandation de Microchip)
bsf EECON1 , WREN ; autorisation de l'écriture
movlw 0x55 ; séquence spécifique (c'est comme ça, il faut le savoir)
movwf EECON2 ; séquence spécifique
movlw 0xAA ; séquence spécifique
movwf EECON2 ; séquence spécifique
bsf EECON1 , WR ; lance une opération d'écriture
bsf INTCON , GIE ; autorisation de toutes les interruptions
bcf EECON1 , WREN ; interdiction de l'écriture
...
A la fin de l'opération d'écriture (qui dure plusieurs millisecondes), le bit WR est automatiquement mis à 0 et le drapeau EEIF est automatiquement mis à 1.
Au lieu d'attendre la fin de l'opération d'écriture, on utilisera avec profit l'interruption de fin d'écriture de l'EEPROM.
Pour cela, il faut que le bit EEIE soit placé à 1 (pour autoriser cette source d'interruption).
Dans la routine d'interruption, on n'oubliera pas d'effacer le drapeau EEIF.
On ne peut écrire que dans un seul emplacement mémoire à la fois.
Pour écrire une nouvelle donnée, vous devez donc attendre la fin de l'écriture de la donnée précédente (ce que l'on gère facilement en utilisant l'interruption).
N.B. L'écriture complète des 64 octets de l'EEPROM demande environ 1/4 de seconde !
Par précaution, on peut vérifier l'écriture d'une donnée.
Il suffit de relire l'EEPROM et de comparer avec la valeur attendue :
bcf STATUS , RP0 ; passage en banque 0
movf EEDATA ,W ; la dernière valeur écrite dans EEDATA est placée dans l'accumulateur
bsf STATUS , RP0 ; passage en banque 1
bsf EECON1 , RD ; lecture de l'EEPROM
bcf STATUS , RP0 ; passage en banque 0
subwf EEDATA , W ; EEDATA contient maintenant la valeur lue dans l'EEPROM
btfss STATUS , Z ; test de comparaison
goto erreur
; vérification correcte
...
erreur
; traitement de l'erreur d'écriture
7- Ecriture de données en mémoire EEPROM directement pendant la phase de transfert du programme dans la mémoire FLASH du PIC
On utilise pour cela la directive de compilation DE de MPLAB.
; Initialisation de la mémoire EEPROM
; Cela met dans l'EEPROM le message :
; (C)Fabrice Sincere v1.0
; (en code ASCII)
org 0x2100 ; L'adresse 0x2100 de la mémoire de programme est en fait l'adresse 0x00 de la mémoire EEPROM
DE '(' ; ou DE 0x28 (code ASCII correspondant)
DE 'C' ; adresse 0x01
DE ')' ; adresse 0x02
DE 'F' , 'a' , 'b' , 'r' , 'i' , 'c' , 'e' , ' '
DE 'S' , 'i' , 'n' , 'c' , 'e' , 'r' , 'e' ,' '
DE 'v' , '1' , '.' , '0'
(C) Fabrice Sincère ; Révision 1.0.1