Je vais vous parler dans ce chapitre des procédures daccès dans leeprom
interne de la PIC. Il ne faut pas confondre ceci avec lécriture dans une eeprom
externe type 2416. Pour ce type deeprom, il suffit de suivre les directives du
datasheet du composant concerné.
14.1 Taille et localisation de la mémoire " eeprom " |
Ladresse physique de la zone eeprom commence, pour les PICs mid-range, à
ladresse 0x2100. Cette adresse se situe hors de lespace dadressage
normal des PICs, donc nous pouvons déjà en déduire quil 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,
ladresse 0x2007 contient les paramètres que vous écrivez dans _CONFIG. Vous
pourriez donc remplacer cette directive par une initialisation directe à ladresse
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, ladresse 0x2006 contient lidentification du composant. Cest
ainsi quun 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 nud. [ NDLR : Fichiers
exemples ici ]
Editez la zone den-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 leeprom " 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
leeprom, cette modification ne sera pas perdue au moment de la remise sous tension
de leeprom.
Je vous donne lordinogramme de ce que nous allons réaliser dans un premier
temps.
Vous pourriez remarquer quil peut sembler inutile de lire leeprom 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 quune simple lecture en RAM. Il faut donc
limiter les accès eeprom au maximum.
Commençons par modifier notre routine dinterruption. La seule ligne à modifier
cest celle qui chargeait doffice 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 quil ne sert à rien dinitialiser leeprom à
chaque démarrage de la PIC, sinon, quel est lintérêt dutiliser 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
seffectue à laide de la directive " DE " pour Data
Eeprom, placée dans la zone de données eeprom, cest à 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 à ladresse 0x00 et pas à
ladresse 0x2100 ?
En effet, il faut distinguer 2 adresses. Ladresse 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 dune procédure
spéciale et avec une adresse dite relative. Cette adresse daccès commence donc à
0x00. Donc, en résumé, pour accéder à ladresse 0x2100, vous utiliserez la
procédure daccès EEPROM avec ladresse 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 à ladresse 0x00. Ajoutons simplement un define dans la zone
dinitialisation eeprom
#DEFINE |
eereload |
0x00 |
; adresse eeprom de eereload |
ou encore
Dans notre ordinogramme nous allons avoir besoin de lire leeprom. 4
registres sont utilisés pour accéder à leeprom. Nous allons maintenant les
examiner.
Cest dans ce registre que va transiter la donnée à écrire vers ou la donnée
lue en provenance de leeprom. Ce registre est situé à ladresse 0x08 banque0.
Dans ce registre, situé à ladresse 0x09 banque0, nous allons préciser sur 8
bits ladresse concernée par lopé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 deeprom. Pour la 16F84, la zone admissible va de 0x00 à 0x3F, soit
64 emplacements.
Ce registre, situé à ladresse 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. Cest le flag qui est en liaison avec
linterruption 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. Cest un bit derreur. 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 dun 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.
Nous revoici en présence dun registre " fantôme ", puisque
ce registre nexiste pas. Il sagit tout simplement dune adresse 0x89
banque1, qui sert à envoyer des commandes à la PIC concernant les procédures eeprom.
Vous ne pouvez lutiliser quen vous servant des instructions expliquées
plus bas.
|