<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte

 

La Programmation des pics
par Bigonoff
Premiere partie - pic 16f84 - Révision 4

Téléchargement des fichiers originels ici
Publié le 26/10/2001

14. Les accès en mémoire " eeprom "

Index coursIndex du cours
Chapitre précédent13. Le Timer 0 (Suite)
Chapitre suivant14. Les accès en mémoire " eeprom " (Suite)

 

14. Les accès en mémoire " eeprom "

Je vais vous parler dans ce chapitre des procédures d’accès dans l’eeprom interne de la PIC. Il ne faut pas confondre ceci avec l’écriture dans une eeprom externe type 2416. Pour ce type d’eeprom, il suffit de suivre les directives du datasheet du composant concerné.

14.1 Taille et localisation de la mémoire " eeprom "

L’adresse physique de la zone eeprom commence, pour les PICs mid-range, à l’adresse 0x2100. Cette adresse se situe hors de l’espace d’adressage normal des PICs, donc nous pouvons déjà en déduire qu’il nous faudra utiliser une procédure spéciale pour y accéder.

Notez déjà que si ces emplacements ne sont pas accessibles directement par le programme, par contre ils le sont au moment de la programmation. Vous pourrez donc initialiser votre zone eeprom au moment de programmer votre composant.

Ceci est également vrai pour des registres spéciaux des PICs. Par exemple, l’adresse 0x2007 contient les paramètres que vous écrivez dans _CONFIG. Vous pourriez donc remplacer cette directive par une initialisation directe à l’adresse 0x2007. Je vous le déconseille cependant pour des raisons de portabilité et d’évolution rapide vers une autre famille de PICs.

De même, l’adresse 0x2006 contient l’identification du composant. C’est ainsi qu’un programmateur évolué peut faire la distinction entre une 16F84 et une 16F84A, car leur identification constructeur diffère.

La 16F84 dispose de 64 emplacements eeprom disponibles pour votre libre usage. Nous allons voir comment les utiliser.

14.2 Préparation du programme

Commencer par effectuer un copier/coller de votre fichier " Led_tmr1.asm " et renommez cette copie en " eep_test.asm ". Construisez votre nouveau projet dans MPLAB avec le même nom et ajoutez-y ce nœud. [ NDLR : Fichiers exemples ici ]

Editez la zone d’en-tête du programme :

;***************************************************************************
;
; Fait clignoter une LED à une fréquence dépendant d'une valeur en eeprom
;
;***************************************************************************
;
; NOM: LED CLIGNOTANTE AVEC TIMER0 et utilisation de l'eeprom
; Date: 18/02/2001
; Version: 1.0
; Circuit: Platine d'essai
; Auteur: Bigonoff
;
;***************************************************************************
;
; Fichier requis: P16F84.inc
;
;***************************************************************************
;
; Notes: Démonstration de l'utilisation des données en eeprom
; La base de temps de clignotement est contenue dans l'eeprom.
;
;***************************************************************************

Ajoutons ensuite une variable dans la zone des variables. Elle contiendra la valeur à recharger dans le compteur.

      reload : 1 ; valeur à recharger dans compteur

Dans notre programme initial, à chaque fois que le compteur de passages dans le timer arrivait à 0, on le rechargeait avec la valeur 0x07. Maintenant, nous le rechargerons avec la valeur contenue dans la variable " reload ". La procédure utilisée est la suivante :

  • On initialise un emplacement eeprom " eereload " avec la valeur 0x07 lors de la programmation
  • Au démarrage, on lit l’eeprom " eereload " et on place son contenu dans " reload "
  • Le contenu de reload est utilisé pour recharger le cmpt une fois celui-ci arrivé à 0.

Avantage de la procédure : si on modifie la valeur de la base de temps dans l’eeprom, cette modification ne sera pas perdue au moment de la remise sous tension de l’eeprom.

Je vous donne l’ordinogramme de ce que nous allons réaliser dans un premier temps.

Vous pourriez remarquer qu’il peut sembler inutile de lire l’eeprom et de recopier son contenu dans reload. Pourquoi donc ne pas utiliser la valeur eeprom directement dans le reste de notre programme ? La réponse est simple. La procédure de lecture en eeprom est plus complexe qu’une simple lecture en RAM. Il faut donc limiter les accès eeprom au maximum.

Commençons par modifier notre routine d’interruption. La seule ligne à modifier c’est celle qui chargeait d’office la valeur 7 dans w. Maintenant, nous y mettons le contenu de reload. Nous aurons donc :

inttimer      
  decfsz cmpt , f ; décrémenter compteur de passages
  return   ; pas 0, on ne fait rien
  BANK0   ; par précaution
  movlw b'00000100' ; sélectionner bit à inverser
  xorwf PORTA , f ; inverser LED
  movf reload , w ; charger valeur contenue dans reload
  movwf cmpt ; dans compteur de passages
  return   ; fin d'interruption timer

 

14.3 Initialisation de la zone eeprom

Nous voyons sur notre ordinogramme que nous lisons notre eeprom afin de placer le contenu dans notre variable. Mais nous devons bien quand même initialiser cette eeprom au moment de la programmation de notre PIC.

Vous vous doutez bien qu’il ne sert à rien d’initialiser l’eeprom à chaque démarrage de la PIC, sinon, quel est l’intérêt d’utiliser une zone mémoire qui résiste au reset  et à la mise hors tension ?

Nous initialiserons donc cette zone directement au moment de la programmation. Ceci s’effectue à l’aide de la directive " DE " pour Data Eeprom, placée dans la zone de données eeprom, c’est à dire en 0x2100.

Créons donc une zone eeprom, tout de suite après celle des variables.

;*********************************************************************
; DECLARATIONS DE LA ZONE EEPROM
;*********************************************************************
  org 0x2100 ; adresse début zone eeprom
  DE 0x07 ; valeur de recharge du compteur

Lancez la compilation de votre programme. Vous voulez sans doute vérifier que votre eeprom contient bien la valeur 0x07 ? Rien de plus simple : lancez " EEPROM memory " dans le menu " Window " et vous voyez votre valeur.

Mais, allez-vous me répondre, la valeur est à l’adresse 0x00 et pas à l’adresse 0x2100 ?

En effet, il faut distinguer 2 adresses. L’adresse physique de cet emplacement mémoire est bien 0x2100. Cette adresse est uniquement accessible en mode programmation. Votre programme accédera donc à ces emplacements à partir d’une procédure spéciale et avec une adresse dite relative. Cette adresse d’accès commence donc à 0x00. Donc, en résumé, pour accéder à l’adresse 0x2100, vous utiliserez la procédure d’accès EEPROM avec l’adresse 0x00. Et ainsi de suite : 0x2101 correspondra à 0x01…

Bien entendu, vous pouvez également donner un nom à ces adresses, tout comme pour les variables. Utilisons donc le nom eereload pour désigner la valeur de reload contenue en eeprom à l’adresse 0x00. Ajoutons simplement un define dans la zone d’initialisation eeprom

#DEFINE eereload 0x00 ; adresse eeprom de eereload

ou encore

eereload EQU 0x00  

Dans notre ordinogramme nous allons avoir besoin de lire l’eeprom. 4 registres sont utilisés pour accéder à l’eeprom. Nous allons maintenant les examiner.

14.4 Le registre EEDATA

C’est dans ce registre que va transiter la donnée à écrire vers ou la donnée lue en provenance de l’eeprom. Ce registre est situé à l’adresse 0x08 banque0.

14.5 Le registre EEADR

Dans ce registre, situé à l’adresse 0x09 banque0, nous allons préciser sur 8 bits l’adresse concernée par l’opération de lecture ou d’écriture en eeprom. Nous voyons déjà que pour cette famille de PICs, nous ne pourrons pas dépasser 256 emplacements d’eeprom. Pour la 16F84, la zone admissible va de 0x00 à 0x3F, soit 64 emplacements.

14.6 Le registre EECON1

Ce registre, situé à l’adresse 0x88 en banque1, contient 5 bits qui définissent ou indiquent le fonctionnement des cycles de lecture/écriture en eeprom. Voici son contenu :

bits 7/6/5

non utilisés

bit 4 : EEIF

Eeprom write operation Interrupt Flag bit. C’est le flag qui est en liaison avec l’interruption EEPROM. Il passe à 1 une fois l’écriture en eeprom terminée. Si le bit EEIE du registre INTCON est à 1, une interruption sera générée

bit 3 : WRERR

WRite Error. C’est un bit d’erreur. Il passe à 1 si une opération d’écriture en eeprom a été interrompue, par exemple par un reset.

bit 2 : WREN

WRite ENable. Autorisation de démarrage du cycle d’écriture

bit 1 : WR

WRite. Démarrage du cycle d’écriture. Est remis à 0 automatiquement une fois l’écriture terminée.

bit 0 : RD

ReaD. Démarrage d’un cycle de lecture. Reste à 1 durant un cycle, puis est remis à 0 automatiquement

Remarque : Dans le cas où le cycle d’écriture serait interrompu suite au dépassement du watchdog ou à un reset, vous pouvez lire le bit WRERR qui vous le signalera. Dans ce cas les registres EEDATA et EEADR demeurent inchangés et vous pouvez relancer le cycle d’écriture. Ceci ne fonctionne évidemment pas pour une coupure de tension. Dans ce cas, je vous expliquerai ma méthode personnelle de vérification à la fin de ce chapitre.

14.7 Le registre EECON2

Nous revoici en présence d’un registre " fantôme ", puisque ce registre n’existe pas. Il s’agit tout simplement d’une adresse 0x89 banque1, qui sert à envoyer des commandes à la PIC concernant les procédures eeprom. Vous ne pouvez l’utiliser qu’en vous servant des instructions expliquées plus bas.

 

 

Index cours
Index du cours
Chapitre précédent
13. Le Timer 0 (Suite)
Chapitre suivant
14. Les accès en mémoire " eeprom " (Suite)

 


Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/cours/pic16f84/PART1_cours14a.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail