PIC 16F84A

 

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"

  • drapeau (flag) mis à 1 en fin d'opération d'écriture
  • ce drapeau ne peut être effacé que de façon logicielle (bcf EECON1, EEIF)
bit 3
WRERR

"EEPROM Error flag bit"

  • drapeau (flag) mis à 1 en cas de problème durant l'opération d'écriture (Reset externe, Reset dû au Watchdog)
  • drapeau mis à 0 en fin d'opération d'écriture
bit 2
WREN

"EEPROM Write Enable bit"

  • 1 : autorise l'écriture
  • 0 : interdit l'écriture
bit 1
WR

"Write Control bit"

  • 1 : lance une opération d'écriture
  • bit mis à 0 par hardware en fin d'opération d'écriture
    • Remarques :
      • on ne peut pas mettre à 0 ce bit par logiciel
      • une opération d'écriture dure plusieurs millisecondes
bit 0
RD

"Read Control bit"

  • 1 : lance une opération de lecture
  • bit mis à 0 par hardware
    • Remarques :
      • on ne peut pas mettre à 0 ce bit par logiciel
      • une opération de lecture dure 1 cycle d'horloge

 

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