Vous êtes sur la page 1sur 31

INTRODUCTION A L’ARCHITECTURE DU MICROCONTROLEUR PIC16F877

INTRODUCTION
Le processeur de gestion d’un système embarqué (temps réel) peut être :
 Un microprocesseur : Unité de traitement dépourvue d’interfaces ;
 Un microcontrôleur : Unité de traitement pourvue d’I/O et de la mémoire ;
 DSP : Digital Signal Processor, microprocesseur optimisé pour le traitement du signal ;
 FPGAS : Field Programmable Gate Arrays : Circuit programmable

Puisque l’énergie est l’un des paramètres essentiels d’un système embarqué, les processeurs
répondent bien à ce paramètre puisqu’ils disposent de la possibilité de contrôle de la
consommation par la mise en sommeil de certaines parties. La taille des données traitées dans les
systèmes embarqués peut être de 8 bits, 32 bits ou 64 bits selon les précisions des calculs envisagées
et le logiciel système inclus s’étend d’un petit détecteur à un grand logiciel d’exploitation en temps
réel (RTOS) avec une interface utilisateur graphique (GUI). Typiquement, le logiciel système inclus
doit répondre aux évènements d’une manière déterministe et devrait toujours être opérationnel.
Les intérêts d’utiliser un microcontrôleur ou un DSP dans un système de commande en temps réel
peuvent être :

Comparaison microcontrôleur - DSP

Type de processeur Besoins Ressources nécessaires Avantages

Contrôle d’entrées Pilotages direct


Ports d’entrées sorties (bits)
sorties d’actionneurs

2 Facilité l’interfaçage
Communication série Port série : SPI, I C, UART, CAN,
avec l’extérieur via le
avec l’extérieur Microwave, etc…
réseau, etc..

Périphériques spéciaux :
Contrôle précis de
Compteurs temporisateurs, Programmation facile
moteurs et actionneurs
générateurs de PWM, etc…

Microcontrôleur Facilités de mise en


Rapidité d’exécution de Sauts conditionnels, instructions
œuvre au niveau de la
fonctions complexes de de test au niveau du bit,
programmation des
contrôles interruptions, etc…
tâches
Rapidité de prise en
Interruptions externes avec Facilité de mise en
compte d’évènements
plusieurs niveaux de priorités œuvre logicielle
externes

Prise en comptes
Convertisseur analogique
Entrées analogiques matérielle de capteurs
numérique
externes

DSP Filtres numériques Multiplieur, etc… Temps de calcul réduit


Interface pour codeur Prise en compte de
Port série rapide
décodeur signaux analogiques

Quantité importante de Temps de transfert


Contrôleur de DMA
données en entrée minimisé

Accès rapide aux Accélération de


Architecture spécifique
données l’exécution

ORGANISATION DE LA MEMOIRE
Il ya deux blocs mémoire dans le 16F877A: La mémoire programme et la mémoire données. Par
utilisation de la technologie Harvard, chaque bloc a son propre bus, ainsi l’accès aux deux bloques
peut s’effectué simultanément pendant le même cycle d’horloge.
La mémoire des données peut encore être divisée en trois sous ensemble :
La RAM à usage général (general purpose RAM = General Purpose Register);
Les registres à fonction spéciale (Special Function Register SFR): Ces registres contrôlent les
activités du CPU, ils seront détaillés dans les sections à venir.
La mémoire EEPROM de données. C’est un espace de 256 octets occupant les adresses 00h-
FFh. Cette mémoire n’est pas accessible directement mais elle est accessible indirectement à
travers des registres SFR spécialisés utilisés comme pointeurs d’adresses.

Le détail de la EEPROM et de la mémoire Flash sera donné dans les prochaines sections.

ORGANISATION DE LA MEMOIRE PROGRAMME


Le 16F877A dispose d’un compteur programme de 13 bits, qui peut adresser 8Kx14 d’espace
mémoire.
Noter bien que la largeur des instructions est de 14 bits ;
Pour les PIC 16F87/88, les premiers 4Kx14 (0000H-0FFFH) sont physiquement implémentés ;
Le vecteur reset est à l’adresse 0000h ;
Le vecteur d’interruption est à l’adresse 0004h.
Comme pour la EEPROM de données, la EEPROM Flash du programme n’est pas accessible
directement. Elle est indirectement accessible à travers des registres SFR spécialisés utilisés
comme pointeurs d’adresses.
Mémoire programme et Pile dans le PIC16F877

ORGANISATION DE LA MEMOIRE DES DONNEES (MEMOIRE RAM STATIQUE)


Il s'agit de mot de 8 bits, rangés sur 4 banques (pages). Elle englobe :
Les registres à usage général (General Purpose Registers);
Les registres à fonction spéciale (SFR)
Les bits [RP1, RP0] = [STATUS<6,5>] sont utilisés pour la sélection de la banque à utiliser.
Sélection des Banques du PIC16F877

RP1 : RP0 Banque

00 0
01 1
10 2
11 3

Chaque banque s’étend sur 7Fh (128 octets) ;


La partie basse de chaque banque est réservée aux registres SFR : Il s’agit des 32 premiers
octets de chaque banque ;
Pour la réduction du code et accélérer l’accès à ces registres, certains SFR (à grande
utilisation) se trouvent, eux-mêmes, dans toutes les banques : par exemple le registre d’état
(STATUS)
Au dessus (adresses hautes) des registres SFR se trouvent, et dans chaque banque, les registres
à usage général, implémentés comme une RAM statique :
 Physiquement c’est à partir de l’octet 33, de chaque banque, que débute cette zone
 C’est dans cette zone que peuvent (doivent) être déclarées les variables temporaires pour la
sauvegarde du contexte ou toute autre manipulation;
 Les seize derniers octets de chaque banque sont communs entre toutes les banques. Il s’agit
de l’espace commun d’adresses 70h-7Fh. Si on adresse un octet des derniers seize octets de
n’importe quelle banque, on est renvoyé vers l’octet correspondant (de même ordre) de
l’espace 70h-7Fh appartenant à la première banque.

LES REGISTRES A USAGE GENERAL (GENERAL PURPOSE REGISTER FILE)


Les registres à usage général, implémentés comme une mémoire statique, peuvent être accédés
directement ou indirectement à travers le registre de sélection du fichier (File Select Regsiter FSR)
Registres de fichiers dans le PIC16F877

LES REGISTRES SFR (SPECIAL FUNCTION REGISTER : Registres à Fonctions Spéciales)


Les registres à fonctions spéciales (SFR) sont des registres utilisés par le CPU et les
périphériques pour contrôler les opérations du microcontrôleur.
Ils sont implémentés comme une RAM statique et ils peuvent êtres séparés en deux classes :
 Les SFRS qui sont en relation avec l’activité du CPU ;
 Les SFRS qui sont en relation avec le fonctionnement des périphériques.
Les SFRS sont toujours stockés dans les 32 premiers octets de chaque banque (bank).

STRUCTURE DES INTERRUPTIONS


Le registre de contrôle des interruptions INTCON contient deux bits GIE et PEIE

d’Autorisation/interdiction des interruptions, qui influencent d’une manière directe la prise en


charge ou non des interruptions internes ou celles des périphériques. C’est l’implantation de ces
deux bits qui leur permettent de jouer ce rôle (voir figure ci-dessous).
Chaque module du PIC peut être le siège d’une génération d’interruption si elle est autorisée. Ce
module dispose de son bit d’autorisation de l’interruption (xIE) et le Flag (xIF) correspondant où
« x » désigne le nom du module. L’assemblage de tous les bits « IE » et « IF » de tous les modules
est organisé selon dans la structure ci-dessous.

Effet des deux bits GIE et PEIE


Excepté pour le timer 0, l’interruption INT et les interruptions dues à un changement sur PB4 à
PB7, les bits, drapeaux des interruptions des périphériques, se trouvent dans les registres « PIR1 » et
« PIR2 » tandis que les bits autorisations se trouvent dans les registres « PEI1 » et « PEI2 ». Les
interruptions des périphériques, hormis ceux cités plus haut, sont autorisées ou interdites par «PEIE»
du registre «ITCON».
Lorsqu’un événement susceptible de générer une interruption se produit (par exemple le
débordement du timer 0) :
 le bit drapeau associé (« TMR0IF » dans notre exemple) passe à 1 ;
 si l’interruption est autorisée (dans notre exemple si « GIE » et « TMR0IE » sont à 1), alors une
interruption est générée ;
 le compteur programme est alors chargé avec 0004h qui est l’adresse du vecteur d’interruption,
tandis que l’adresse actuelle du programme est sauvegardée dans la pile ;
 l’interruption interdit toute nouvelle interruption par la mise à 0 de «GEI» ;
 à l’adresse 0004h le programmateur doit placer une instruction de saut vers le sous programme
d’interruption ;
 celui-ci doit commencer par sauvegarder si nécessaire le contexte avant l’interruption : registre
W, STATUS et PCLATH ;
 le sous programme d’interruption cherche ensuite la source d’interruption en testant les bits
drapeau (ce n’est pas nécessaire si une seule source est autorisée) ;
 gère l’interruption concernée ;
 remet le bit drapeau à 0 pour permettre une nouvelle interruption ;
 restaure le contexte d’avant l’interruption ;
 si le retour au programme principal se fait par l’instruction RETFIE, le bit GEI est
automatiquement remis à 1.
LES PORTS D’ENTREES SORTIES

Le PIC 16F877 dispose de certains pines utilisées pour communiquer avec l’extérieur en entrées ou
en sorties (I/O). Certains de ces pins sont multiplexés avec d’autres périphériques du PIC. En
général, si le périphérique est activé (enabled), la pine concernée ne peut être utilisée comme moyen
d’entrée/sortie (I/O).

LE PORTA ET LE REGISTRE TRISA


Le PORTA est un port a six bits de large ;
Le registre TRISA sert à fixer la direction de chacune des pines de ce port même quand elles sont
configurées comme entrées analogique:
 TRISA BIT (= 1): configure la broche correspondante comme entrée ;
 TRISA BIT (= 0): configure la broche correspondante comme sortie.
Si une pine est utilisée comme entrée analogique, il est à la charge de l’utilisateur de s’assurer
que le bit correspondant du registre TRISA est fixé à 1
La lecture du port PORTA lit l’état de ses pines alors que l’écriture dans ce port écrit la donnée
dans le Latch de sortie du port. Toutes les opérations d’écriture sont des opérations read-modify-
write. Ceci signifie qu’une écriture dans le port implique la lecture des pines du port, la valeur
lue est modifiée et ensuite écrite dans le latch du port ;
La pine RA4 est multiplexée avec l’horloge du module TIMER0 ce qui donne RA4/T0CKI. En
entrée, cette pine est un trigger de Schmitt. En sortie, elle est à drain ouvert ;
Toutes les autres pines du port sont des entrées TTL et des sortie CMOS
D’autres pines du PORTA sont multiplexées avec les entrées analogiques et la tension de référence
analogique VREF.
L’opération de chaque pine est fixée par le clearing/setting du bit correspondant dans le registre
ADCON1 (A/D CONtrol Register1).

Les six pines de ce port sont rassemblées dans le tableau ci-dessous

Broches du port A

Name Bit# Buffer Function

RA0/AN0 Bit0 TTL Input/output or analog input.

RA1/AN1 Bit1 TTL Input/output or analog input.

RA2/AN2 Bit2 TTL Input/output or analog input.

RA3/AN3/VREF Bit3 TTL Input/output or analog input or VREF.

RA4/T0CKI Bit4 ST Input/output or external clock input for Timer0. Output is open drain type.

RA5/SS/AN4 Bit5 TTL Input/output or slave select input for synchronous serial port or analog input.

Legend: TTL = TTL input, ST = Schmitt Trigger input

Les registres associés avec ce port sont : PORTA, TRISA, ADCON1. Voir ANNEXE R pour plus de détail.
Un exemple d’initilaisation du port A est donné ci-dessous :

BCF STATUS, RP0 ;


BCF STATUS, RP1 ; bank0
CLRF PORTA ; initialize porta by clearing output data latches
BSF STATUS, RP0 ; select bank 1
MOVLW 0x06 ; configure all pins
MOVWF ADCON1 ; as digital inputs
MOVLW 0xcf ; value used to initialize data direction
MOVWF TRISA ; set ra<3:0> as inputs ra<5:4> as outputs
; TRISA<7:6>are always read as ’0’
LE PORTB ET LE REGISTRE TRISB
Le PORTB est un port a huit bits de large ;
Le registre TRISB sert à fixer la direction de chacune des pines de ce port:
 TRISB.BX (= 1) : configure la broche correspondante comme entrée ;
 TRISB.BX (= 0) : configure la broche correspondante comme sortie.
La lecture du port PORTB lit l’état de ses pines alors que l’écriture dans ce port écrit la donnée
dans le Latch de sortie du port;
Trois pines du port sont multiplexées avec la fonction de programmation basse tension. Il s’agit
de RB3/PGM, RB6/PGC et RB7/PGD;
Chacune des pines du port à une faible résistance de PULL-UP interne. Le bit
RBPU (OPTION_REG <7>) permet d’activer ou désactiver toutes ces résistances à la fois (Voir
exemple ci-dessous). Ces résistances sont automatiquement désactivées quand le port est
configuré comme sortie, pendant la mise sous tension du système et pendant un RESET.
Quatre pines de ce port, RB7:RB4, peuvent donner lieu à une interruption pour un changement
d’état. Seules les pines configurées en entrées, parmi ces quatre, peuvent provoquer cette
interruption (c'est-à-dire toute pine configurée comme sortie est exclue de ce processus de
génération d’interruption). Le bit RBIE (INTCON<3>) permet d’activer ce mode et le bit RBIF

(INTCON <0>) représente le flag de cette interruption.


Cette interruption a le pouvoir de réveiller (WAKE) le PIC s’il est en mode SLEEP ;
Le bit Flag peut être effacé, dans le sous programme d’interruption, de deux manières :
 Par la lecture ou l’écriture du PORTB ;
 Par un effacement explicite de ce port
La pine RB0/INT peut également être configurée pour générer une interruption, si un changement
d’état a lieu. Le bit INTE (INTCON<4>) permet d’activer ce mode et le bit INTF (INTCON<1>)

représente le flag de cette interruption. Le front de cette interruption peut également être
sélectionné à travers le bit INTEDG (OPTION_REG<6>).
Les huit pines de ce port sont rassemblées dans le tableau ci-dessous

Broches du port B

Name Bit# Buffer Function

(1) Input/output pin or external interrupt input. Internal software


RB0/INT Bit0 TTL/ST
programmable weak pull-up.

RB1 Bit1 TTL Input/output pin. Internal software programmable weak pull-up.

RB2 Bit2 TTL Input/output pin. Internal software programmable weak pull-up.

(3) Input/output pin or programming pin in LVP mode. Internal software


RB3/PGM Bit3 TTL
programmable weak pull-up.
Input/output pin (with interrupt-on-change). Internal software
RB4 Bit4 ST
programmable weak pull-up.

Input/output pin (with interrupt-on-change). Internal software


RB5 Bit5 TTL
programmable weak pull-up.
Input/output pin (with interrupt-on-change) or In-Circuit Debugger
(2) pin.
RB6/PGC Bit6 TL/ST
Internal software programmable weak pull-up. Serial programming
clock.
Input/output pin (with interrupt-on-change) or In-Circuit Debugger
(2) pin.
RB7/PGD Bit7 TL/ST
Internal software programmable weak pull-up. Serial programming
data.

Legend: TTL = TTL input, ST = Schmitt Trigger input


Note 1: This buffer is a Schmitt Trigger input when configured as the external interrupt.
2: This buffer is a Schmitt Trigger input when used in Serial Programming mode.
3: Low Voltage ICSP Programming (LVP) is enabled by default, which disables the RB3 I/O function.
LVP must be disabled to enable RB3 as an I/O pin and allow maximum compatibility to the other
28-pin and 40-pin mid-range devices.

Les registres associés avec ce port sont : PORTB, TRISB, OPTION_REG. Voir ANNEXE R pour plus de
détail.
EXEMPLE
Considérons une application où l'on désire utiliser l'interruption sur la broche RB0/INT. Il peut
s'agir d'un bouton poussoir connecté sur la broche RB0/INT :

Schéma d’interruption à travers la pine RB0

Les actions à entamer sont donc :


Activer/désactiver les résistances de Pull-Up du port B (voir Note Résistance Pull Up ci dessous) :
RBPU (OPTION_REG<7>) = 0

Définir le front actif d’interruption, soit par exemple interruption active sur front descendant
alors : INTEDG (OPTION_REG <6>) = 0

Selon le schéma, on veut donc provoquer une interruption quand on appuie sur le bouton poussoir.

Pour cela, il faut :


commencer par autoriser les interruptions de manière globale : GIE (INTCON<7>) = 1
autoriser uniquement l'interruption qui nous intéresse :
 autoriser l'interruption sur la broche RB0/INT : INTE (INTCON<4>) = 1

 désactiver l'interruption du port B (interruption des bits (RB4-RB7): RBIE (INTCON<3>) = 0


 désactiver l'interruption de débordement du registre TMR0 : T0IE (INTCON<5>) = 0
 Enfin, on initialise le drapeau (flag) INTF à 0 : INTF (INTCON<1>) = 0

Tout cela se fait pendant la phase d'initialisation du programme principal par :

MOVLW B’10010000’

MOVWF INTCON ;INT POINTER

IMPORTANT :
Il faut remettre le drapeau INTF à 0 avant de quitter la routine d'interruption, sinon, le µC se
rebranche indéfiniment sur la routine d'interruption (puisque INTF = 1), le programme est planté:

BCF INTCON, INTF

Sauvegarde et restauration du contexte de travail pendant une interruption:


Il est important que le contexte de travail du programme principal soit le même avant et après
l'exécution de la routine d'interruption. Cela concerne le registre STATUS et l'accumulateur W qui
doivent retrouver le même contenu (en effet, ces deux registres sont souvent utilisés et donc
modifiés pendant la routine d'interruption).
Voici la procédure préconisée par Microchip : La routine d'interruption commence par la
sauvegarde du registre W puis du registre STATUS (voir Note Sauvegarde du Contexte ci dessous):

ORG H'0004' ; debut de programme: vecteur d'interruption

MOVWF W_TEMP

SWAPF STATUS, W

MOVWF STATUS_TEMP

LA ROUTINE D'INTERRUPTION FINIT PAR LA RESTAURATION DU REGISTRE STATUS PUIS DU REGISTRE W :

SWAPF STATUS_TEMP, W ; le pic 16f877 possède deux registre : un registre de


MOVWF STATUS ; travail appele w et un registre fichier : f permettant
SWAPF W_TEMP, F ; d'accéder a la ram ou aux registres internes du pic.
SWAPF W_TEMP, W ; tous les deux sont des registres 8 bits
RETFIE ; retour d'interruption

C’est uniquement en assembleur qu’il faut procéder explicitement à la


sauvegarde/restauration du contexte. Avec MicroC PRO pour PIC cette sauvegarde/restauration
est assurée par le compilateur.

NOTE RESISTANCE PULL UP


Les pines du port B sont à collecteur ouvert, c'est-à-dire que le transistor disposé à la sortie de ces
pines a son collecteur en l’aire sans aucune connexion ni vers le zéro ni vers le 5 volts. Pour faire
fonctionner ce port correctement, et ne pas avoir un état indéterminé, il faut utiliser des résistances
entre ce collecteur et le 5 volts : Ce sont ces résistances qu’on appelle résistances de rappelle vers
le 5 volts. Pour le PIC 16F877 on peut choisir soit d’utiliser des résistances externes soit d’utiliser
les résistances internes intégrées à la Puce du PIC.
1. RESISTANCE DE PULL-UP EXTERNE
Exemple : on désire faire l'interface entre un bouton-poussoir et l'entrée RB0/INT.
Le montage est très simple :

Schéma d’interruption à travers la pine RB0


et utilisation de résistance Pull-up externe

La résistance est appelée résistance de pull-up (résistance de tirage, résistance de rappel). On a


donc un niveau haut en entrée quand le bouton poussoir est ouvert, et un niveau bas quand le bouton
poussoir est fermé. La pine RB0 se trouve donc dans un état bien définit quelque soit la position du
bouton poussoir: l’état indéterminé est exclu.
RESISTANCE DE PULL-UP INTERNE
On peut faire encore plus simple, en activant la résistance de pull-up interne du µC (voir Figure
II.4 ):
Il suffit que : RBPU = 0 (OPTION_REG <7>) : On fait ainsi l'économie d'une résistance.
L'option RBPU = 0 active toutes les résistances de pull-up des broches configurées en entrée)
du port B.
Toutes les pines du port B disposent d’une résistance de rappel, ce qui les rend idéal à
connecter avec les boutons poussoirs, les switches et les opto coupleurs
Le port A ne dispose pas de cette option.

END NOTE RESISTANCE PULL UP

NOTE SAUVEGARDE DU CONTEXTE


Pendant une interruption, seul le contenu du compteur programme (PC) est sauvegardé dans la
Pile. Ainsi, il est à la charge de l’utilisateur de sauvegarder les registres clés, par exemple les
registres W et STATUS, pendant l’interruption.
Ceci doit être fait tout à fait à l’entée du sous programme d’interruption.
Puisque, dans le PIC 16F877/88, les 16 octets plus bas (adresses hautes) de chaque banque sont
communs à toutes les banques, des registres de sauvegarde temporaires, W_TEMP,

STATUS_TEMP et PCLATH_TEM, peuvent être déclarés dans cet espace commun.


Ces 16 positions ne demandent pas un basculement d’une banque à une autre (don’t require
banking) puisqu’elles sont communes à toutes les banques du coup, elles sont bien adaptées
pour la sauvegarde et la restauration du contexte.

LE PORTC ET LE REGISTRE TRISC


Le PORTC est un port a huit bits de large ;
Le registre TRISC sert à fixer la direction de chacune des pines de ce port:
 TRISC.BX (= 1): configure la broche correspondante comme entrée ;
 TRISC.BX (= 0): configure la broche correspondante comme sortie.
La lecture du PORTC lit l’état de ses pines alors que l’écriture dans ce port écrit la donnée dans
le Latch de sortie du port. Les pines de ce port ont des buffers à trigger de Schmitt à l’entrée.
Les pines de ce port sont multiplexés avec plusieurs fonctions périphériques;
Certains périphériques écrivent dans le registre TRISC pour configurer les pines
correspondantes en entrées alors que d’autres périphériques écrivent dans ce registre pour
configurer les pines correspondantes comme sorties. Puisque les bits de ce registre sont le
siège d’écriture par les périphériques, l’utilisation d’instruction telles que (BSF, BCF, XORWF), pour
écrire dans les bits de ce registre, est donc à éviter.

Les huit pines de ce port sont rassemblées dans le tableau ci-dessous

Broches du port C

Name Bit# Buffer Function

RC0/T1OSO/T1CKI Bit0 ST Input/output port pin or Timer1 oscillator output/Timer1 clock input.

Input/output port pin or Timer1 oscillator input or Capture2 input/Compare2


RC1/T1OSI/CCP2 Bit1 ST
output/PWM2 output.

RC2/CCP1 Bit2 ST Input/output port pin or Capture1 input/Compare1 output/PWM1 output.

RC3/SCK/SCL Bit3 ST RC3 can also be the synchronous serial clock for both SPI and I2C modes.

RC4/SDI/SDA Bit4 ST RC4 can also be the SPI Data In (SPI mode) or data I/O (I2C mode).
RC5/SDO Bit5 ST Input/output port pin or Synchronous Serial Port data output

RC6/TX/CK Bit6 ST Input/output port pin or USART Asynchronous Transmit or Synchronous Clock.

RC7/RX/DT Bit7 ST Input/output port pin or USART Asynchronous Receive or Synchronous Data.

Legend: ST = Schmitt Trigger input

Les registres associés avec ce port sont : PORTC, TRISC. Voir ANNEXE R pour plus de détail.

LE PORTD ET LE REGISTRE TRISD


Le PORTD est un port a huit bits de large avec des buffers à trigger de schmitt à l’entrée;
Le registre TRISD sert à fixer la direction de chacune des pines de ce port:
 TRISD.BX (= 1): configure la broche correspondante comme entrée ;
 TRISD.BX (= 0): configure la broche correspondante comme sortie.

Les huit pines de ce port sont rassemblées dans le tableau ci-dessous

Broches du port D

Name Bit# Buffer Function


(1)
RD0/PSP0 Bit0 ST/TTL Input/output port pin or parallel slave port bit0.
(1)
RD1/PSP1 Bit1 ST/TTL Input/output port pin or parallel slave port bit1.
(1)
RD2/PSP2 Bit2 ST/TTL Input/output port pin or parallel slave port bit2.
(1)
RD3/PSP3 Bit3 ST/TTL Input/output port pin or parallel slave port bit3.
(1)
RD4/PSP4 Bit4 ST/TTL Input/output port pin or parallel slave port bit4.
(1)
RD5/PSP5 Bit5 ST/TTL Input/output port pin or parallel slave port bit5.
(1)
RD6/PSP6 Bit6 ST/TTL Input/output port pin or parallel slave port bit6.
(1)
RD7/PSP7 Bit7 ST/TTL Input/output port pin or parallel slave port bit7.

Legend: ST = Schmitt Trigger input, TTL = TTL input


Note 1: Input buffers are Schmitt Triggers when in I/O mode and TTL buffers when in Parallel Slave
Port mode.

Les registres associés avec ce port sont : PORTD, TRISD, TRISE. Voir ANNEXE R pour plus de détail.

LE PORT E ET LE REGISTRE TRISE


Le PORTE est un port à trois bits de large (RE0/ RD/AN5, RE1/ WR /AN6, et RE2/CS/AN7). Ses Pines
sont individuellement configurables comme entrées ou comme sorties avec des buffers à
trigger de schmitt à l’entrée;
Les pines de ce port deviennent des entrées de commande du composant lorsqu’il est utilisé
comme un périphérique avec un microprocesseur. Ce mode est activé par la mise à du bit
PSPMODE (TRISE<4>). Dans ce mode, l’utilisateur devrait s’assurer que les bits TRISE<2:0> sont
mis à 1, et que ces pines sont configurées comme des entrées. Il faut s’assurer également que
le registre ADCON1 est configuré comme digital I/O. Dans ce mode les buffers d’entrées sont
TTL.

Le registre TRISE sert à fixer la direction de chacune des pines de ce port:


 TRISE.BX (= 1): configure la broche correspondante comme entrée ;
 TRISE.BX (= 0): configure la broche correspondante comme sortie.
Les pines de ce port sont multiplexées avec trois des huit entrées analogiques. L’utilisateur
devrait s’assurer que ces pines sont configurées comme entrées quand elles sont utilisées
comme entrées analogiques.
Les huit pines de ce port sont rassemblées dans le tableau ci-dessous

Broches du port E

Name Bit# Buffer Function

I/O port pin or read control input in Parallel Slave Port (PSP)
mode or analog input:
(1) RD :
RE0/ RD/AN5 Bit0 ST/TTL
1 = Idle
0 = Read operation. Contents of PORTD register are output
to PORTD I/O pins (if chip selected)

I/O port pin or write control input in Parallel Slave Port


(PSP) mode or analog input:
(1) WR :
RE1/ WR /AN6 Bit1 ST/TTL
1 = Idle
0 = Write operation. Value of PORTD I/O pins is latched
into PORTD register (if chip selected)

I/O port pin or chip select control input in Parallel Slave Port
mode or analog input:
(1)
RE2/ CS /AN7 Bit2 ST/TTL CS :
1 = Device is not selected
0 = Device is selected

Legend: ST = Schmitt Trigger input, TTL = TTL input


Note 1: Input buffers are Schmitt Triggers when in I/O mode and TTL buffers when in Parallel Slave
Port mode.

Les registres associés avec ce port sont : PORTE, TRISE, ADCON1. Voir ANNEXE R pour plus de détail.

LES REGISTRES PCL et PCLATH (voir NOTE PC PC_LATCH ci dessous)


Le compteur programme (Program Counter (PC)) a une largeur de 13 bits ;
L’octet bas (LSB) du PC est le PCL qui est un registre à lecture/Ecriture ;
Les bits MSB (du poids fort) (PC <12:8>) ne peuvent être lus mais peuvent être écrits
indirectement à travers le registre PCLATH ;
Un Reset provoque l’effacement des bits MSB du PC.

La figure ci-dessous montre les deux situations de chargement du PC (voir NOTE_PCL_PCLATCH ci

dessous):
Le premier exemple montre comment est chargé le PC par une opération d’écriture dans PCL

(Instruction with PCL as Destination) (PCLATH<4:0>  PCH);


Le deuxième exemple montre comment est charge le PC avec une instruction CALL ou GOTO

(PCLATH<4:3>  PCH)

Chargement du PC dans différentes situations


NOTE PC PC_LATCH

Le PIC 16F877 peut adresser 8Koctets x 14bits de mémoire programme. C’est une plage de 8K x
14 mots de mémoire FLASH de programme, en réalité c’est juste 4 Koctets qui sont physiquement
implantées. C’est pour cette raison que le compteur programme (PC) a une largeur de 13 bits
(213=8192). Pour se permettre l’accès à toutes les instructions dans cette plage, le contenu du PC

doit être accessible à travers certains registres SFRs. Puisque tous les registres SFRs ont une
largeur d’un octet (8 bits), le PC est artificiellement crée à travers deux registres SFRs: le PCL et
PCLATH.

PCL est en lecture/écriture alors que PCLATH est uniquement en écriture.


Si le programme ne contient pas d’instruction qui affecte le PC (instructions de branchement
CALL, GOTO, MOVWF PCL, ADDWF PCL …), la valeur de ce registre est automatiquement incrémenté
de un à chaque passage d’une instruction à la suivante. Dans ces conditions, tout ce passe
impeccable. Le PC est automatiquement incrémenté par hardware.
Incrémentation automatique du PC pour accéder à tous l’espace mémoire
(absence d’instarution qui affecte PCL)

Si le programme contient des instructions qui affectent le contenu du PC (précisément PCL est
changé par software), des précautions doivent être prises pour garantir un bon accès à toutes
les positions:
 Si les instructions qui affectent le PC sont de type MOVWF PCL, ADDWF PCL,… c'est-à-dire des
instructions de saut implicite et que ces affectations n’entraînent pas un débordement de la
partie basse (PCL) de ce registre, rien n’est spécial tout ce passe sans problème. Cependant,
dans le cas où ces instructions entrainent un débordement du PCL, il faut faire intervenir
PCLATCH pour fournir les bits MSB manquant de l’adresse de 13 bits. PCLATCH peut fournir
jusqu’à cinq bits pour alimenter la partie MSB de l’adresse, de cette manière toute la plage
mémoire adressable est couverte.
 Si les instructions sont des branchements ou des sauts explicites (CALL, GOTO), ces
instruction fournissent elles mêmes, dans la partie opérande, les 11 bits LSB de l’adresse
de branchement. Pour couvrir toute la plage mémoire sur 13 bits, PCLATCH fournit les 2
bits manquant de cette adresse. Ainsi la mémoire est partagée en 4 pages accessibles à
travers les quatre combinaisons que fournissent les deux bits du registre PCLATCH. Chaque
page a une largeur de 2 Koctets.
 PCLATCH est effacé à chaque RESET.
END NOTE PC PC_LATCH

LE STACK (LA PILE)

Le PIC 16F877 a 8 niveaux d’interruption de largeur de 13 bits. Il est à rappeler que la largeur du
PC est de 13 bits et que la Pile sert à la sauvegarde des adresses, notamment le contenu du PC,

donc la Pile devrait avoir une largeur égale à celle du PC c'est-à-dire 13 bits ;
L’espace mémoire de la pile ne fait partie ni de l’espace mémoire des données ni de l’espace
mémoire du programme ;
Le pointeur de pile n’est ni à lecture ni à écriture ;
 Le PC est automatiquement sauvegardé (PUSHed) dans la pile si une instruction CALL est
exécutée ou si un branchement à un sous programme d’interruption a lieu ;
 Le contenu de la pile est automatiquement restauré (POPed) dans le PC si l’une des
instructions RETURN, RETLW (Return with Literal in W) ou RETFIE (Return from Interrupt) est
exécutée ;
PCLATCH n’est pas affecté par les opérations d’empilement ou de dépilement. Il est à la charge
de l’utilisateur d’opérer cette sauvegarde/restauration si besoin est.
La pile travaille comme un buffer circulaire. Ceci signifie qu’après que la pile est empilée
(PUSHed) huit fois, le neuvième empilement s’effectue au dessus du premier empilement. Le
dixième empilement remplace le deuxième et ainsi de suite.

Il n y a pas de bits d’état (status bits) qui indique que la pile est pleine (overflow) ou non
(underflow).
Il n y a pas d’instructions/mnemonics telles que PUSH ou POP. Il y a seulement l’action
d’empilement/dépilement de la pile à travers l’exécution des instructions CALL, RETURN, RETLW

ET RETFIE, or the vectoring to an interrupt address ?.

PAGINATION DE LA MEMOIRE PROGRAMME (PROGRAM MEMORY PAGING)


La famille des PIC16F877 est capable d’adresser un bloque mémoire programme de 8 Koctets (PC
de largeur 13 bits);
En présence des instructions CALL et GOTO la mémoire est paginée :
 Les instructions CALL et GOTO fournissent uniquement les 11 bits LSB de l’adresse, les 2 bits
MSB de l’adresse sont fournit par PCLATH <4:3>. Avec cette configuration la mémoire
programme est partagée en quatre pages. Le contenu des bits PCLATH <4:3> indique la page
active comme l’indique le schéma ci-dessous :

Les instructions CALL et GOTO et la pagination de la mémoire

PC PC PC PC PC PC PC PC PC PC PC PC PC
PC bits
12 11 10 9 8 7 6 5 4 3 2 1 0

Fournisseur PCLATH4 PCLATH3 PC0:PC10 Provided from the CALL and GOTO instructions

0 0 Page 0: 0000h:07FFh

0 1 Page 1: 0800h:0FFFh
Page
sélectionnée
1 0 Page 2: 1000h:17FFh

1 1 Page 3: 1800h:1FFFh

Pendant l’exécution d’une instruction CALL ou GOTO, l’utilisateur devrait assurer que les bits de
sélection des pages sont correctement configurés pour adresser la bonne page ;
Au retour de l’instruction CALL (ou d’interruption), tous les 13 bits du PC sont récupérés depuis
la pile (13-bit PC is popped off the stack), ainsi la manipulation des bits PCLATH <4:3> n’est pas
nécessaire après l’exécution de l’instruction RETURN.
Le contenu du registre PCLATH est inchangé après l’exécution de l’instruction RETURN ou RETFIE.
Il est à la charge de l’utilisateur de charger à nouveau ce registre pour un ultérieur appel de sous
programme ou exécution de l’instruction GOTO.
Exemple: call of a subroutine in page 1 from page 0
L’exemple ci dessous présente un programme en page 0 qui appel un sous programme en page 1
de la mémoire programme. Cet exemple suppose que le registre PCLATH est sauvegardé puis restauré
dans le sous programme d’interruption (si les interruptions sont utilisées).

ORG 0X500 ; we are in page 0 (000H-7FFH)


BCF PCLATH, 4

BSF PCLATH, 3 ; select page 1 (800H-FFFH)


CALL SUB1_P1 ; call subroutine in page 1 (800H-FFFH)
:
:
ORG 0X900 ; page 1 (800H-FFFH)
SUB1_P1

: ; called subroutine page 1 (800H-FFFH)


:
RETURN ; return to call subroutine in page 0 (000H-7FFH)

L’ADRESSAGE INDIRECT ET LES REGISTRES INDF ET FSR


Le registre INDF (INDirect File register) n’est pas un registre physique. Adresser le registre INDF

provoque un adressage indirect ;


Toute instruction utilisant le registre INDF accède effectivement à la position dont l’adresse est le
contenu du registre physique FSR.
La lecture du registre INDF lui-même, entraine l’accès indirect à l’adresse physique 00h (FSR = 0);
L'écriture dans le registre INDF conduit indirectement à une non opération (no operation), bien
que des bits d'état puissent être affectés ;
Une adresse efficace de 9 bits est obtenue en concaténant le registre FSR à 8 bits et le bit IRP

(STATUS <7>), comme le montre la figure ci dessous.


Adressage Direct/Indirect

EXEMPLE : ADRESSAGE INDIRECT


L’exemple ci dessous utilise l’adressage indirect pour effacer les 16 positions (20h-2Fh) de la
mémoire RAM.
MOVLW 0x20 ; initialize pointer to RAM
MOVWF FSR ;
NEXT CLRF INDF ; toute opération sur INDF est indirectement appliquée à la case mémoire
; dont l’adresse est le contenu de FSR. Cette instruction efface donc la
; mémoire dont l’adresse est dans FSR
INCF FSR, d ; inc pointer: The contents of register ’FSR’ are incremented. If ’d’ is 0, the result
; is placed in the W register. If ’d’ is 1, the result is placed back in register ’ FSR’.
BTFSS FSR, 4 ; all done? (BTFSS=Bit Test f, Skip if Set)
GOTO NEXT ; no clear next
CONTINUE
: ; yes continue

Dans l’exemple ci-dessus, l’instruction CLRF INDF provoque l’effacement de la position mémoire
dont l’adresse est le contenu du registre FSR, préalablement chargé par 0x20, et l’incrémenter au fur
et à mesure.

LA MEMOIRE EEPROM DES DONNEES ET LA MEMOIRE EEPROM FLASH DU PROGRAMME


La mémoire EEPROM des données et la mémoire EEPROM FLASH du programme sont à
lecture/écriture pendant les opérations normales (over the full VDD range). Elles sont toutes les deux
du même type EEPROM, c'est-à-dire des mémoires programmables/effaçable électriquement.
Cette mémoire dispose de ses propres registres spéciaux (Special Function Registers « SFR») qui
peuvent être utilisés pour lui accéder indirectement.
Il ya six registre SFR qui peuvent être utilisés peur lire/écrire dans la mémoire EEPROM:
 EECON1

 EECON2

 EEDATA

 EEDATH

 EEADR

 EEADRH

Le tableau II.6 ci-dessous donne la spécialité de chaque registre.


Les registres et les bits associés avec la mémoire
EEPROM des données el la mémoire EEPROM Flash du Programme

Dans ce qui suit, on s’intéresse à la lecture/écriture dans la mémoire EEPROM des données et la
mémoire EEPROM flash du programme.

Lors de l’accès à la mémoire EEPROM des données :


Le registre EEDATA contient la donnée 8 bits à lire ou à écrire et le registre EEADR contient
l'adresse de l'emplacement de l' EEPROM concerné par cette opération de lecture/écriture.

 Les PIC16F877 disposent de 256 octets de données EEPROM avec une plage d'adresses de 00H à
0FFH.
Lors de l’accès à la mémoire EEPROM Flash du programme :
 Les registres EEDATA et EEDATH forment un mot de deux octets contenant la donnée de 14 bits
à lire ou à écrire ;
 Les registres EEADR et EEADRH forment un mot de deux octets contenant les 13 bits de
l’adresse EEPROM concernée par cette opération de lecture/écriture
 Les PIC16F877 disposent de 4K de mots programme Flash avec un étendu d’adresses de 0000H à
0FFFH. Les adresses au-delà de cette espace ramènent cycliquement au début de la mémoire.

La mémoire Flash du PIC 16F88

LES REGISTRES EEADR ET EEADRH


Pendant l’accès à la mémoire EEPROM des données, c’est uniquement la partie basse (LSB) de la
paire EEADRH:EEADR, c'est-à-dire le registre EEADR, qui est utilisée. L’adresse de la cellule
concernée par l’opération de lecture/écriture est chargée dans ce registre, et c’est lui qui va jouer le
rôle du pointeur d’adresses. On dispose donc de 256 octets de mémoire de données ;
Pendant l’accès à la mémoire EEPROM du programme, c’est la paire EEADRH:EEADR toute entière
qui est utilisée. On dispose alors au maximum de 8K mots de la mémoire programme dans la
EEPROM Flash;
Pendant l’accès à la mémoire programme la paire EEADRH:EEADR contient respectivement la
paire MSB:LSB qui sert comme pointeur vers cette adresse. En réalité c’est uniquement 4K qui sont
adressables. Se sont par conséquent uniquement les quatre premiers bits EEADRH<3-0> qui sont
rassemblés avec les huit bits du registre EEADR pour former l’adresse de douze bits qui permet
l’accès à ces 4K;

LES REGISTRES EECON1 ET EECON2

La mémoire EEPROM est partagée en mémoire donnée et mémoire programme. L’accès à l’une ou
l’autre de ces mémoires est contrôlé par le registre EECON1 Voir ANNEXE R pour plus de détails
Le bit EEPGD (EECON1<7>) détermine si l’accès aura lieu pour la mémoire des données ou
pour la mémoire programme.
 EEPGD=0, comme c’est le cas pendant le RESET, l’opération sur la EEPROM concerne la
mémoire des données ;
 EEPGD =1, l’opération sur la EEPROM concerne la mémoire programme ;
Les tensions d'écriture/effacement de la EEPROM sont générées par une pompe de charge sur la
puce
Les bits RD et WR initialisent une opération de lecture écriture respectivement. Ces bits ne
peuvent être effacés par software. Ils sont effacés automatiquement par hardware à la fin de
l’opération de lecture respectivement d’écriture.
L’interdiction d’effacer le bit WR par software prévient la terminaison accidentelle prématurée de
l’opération d’écriture.
Le bit WREN, une fois mis à un, autoriserai l’opération d’écriture ou d’effacement. A la mise sous
tension, le bit WREN est mis à 0.
Le bit WRERR est mis à un si une opération d’écriture (ou d’effacement) est interrompue par
MCLR, ou WDT Time-out RESET pendant une opération normale. Dans ces situations, à la suite
d’un RESET, l’utilisateur peut consulter le bit WRERR et réécrire la localisation (location). Les
données et l’adresse ne seront pas changées dans les registres EEDATA et EEADR.
Le drapeau d’interruption EEIF dans le registre PIR2, est mis à un une fois l’opération d’écriture
terminée. Il devrait être effacé par software.

LECTURE DES DONNEES DEPUIS LA EEPROM des données


Pour lire une position mémoire de la EEPROM des données l’utilisateur devrait :

1. Ecrire l’adresse dans le registre EEADR. Assurez vous que l’adresse est bien dans la plage
mémoire adressée par le composant ;
2. Effacer le bit EEPGD du registre de contrôle (EECON1<7>), pour pointer la mémoire EEPROM de
données ;
3. Mettre à un le bit de contrôle RD (EECON1<0>), pour commencer l’opération de lecture.
4. Lire la donnée depuis le registre EEDATA

La donnée est disponible, dans le plus proche cycle, dans le registre EEDATA, ainsi elle peut être
lue dans la prochaine instruction (voir exemple 3-1). Le registre EEDATA maintient cette valeur
jusqu’à la prochaine lecture ou qu’il y est une opération d’écriture dessus par l’utilisateur
(pendant une opération d’écriture).
EXAMPLE: DATA EEPROM READ

BANKSEL EEADR ; select bank of EEADR


MOVF ADDR, W ; charge l’adresse de l’octet qu’on veut lire dans le registre de travail w
MOVWF EEADR ; met cette adresse dans le registre EEADR

BANKSEL EECON1 ; select bank of EECON1

BCF EECON1, EEPGD ; met EEPGD =(EECON1<7>) a 0 pour pointer la EEPROM des données
BSF EECON1, RD ; met RD=(EECON1<0>) a 1 pour dire qu’il s’agit d’une lecture

BANKSEL EEDATA ; select bank of EEDATA

MOVF EEDATA, W ; lit la donnée depuis le registre EEDATA et la sauvegarde dans w

ECRITURE DES DONNEES DANS LA EEPROM des données


Pour écrire des données dans la EEPROM, l’utilisateur devrait:
1. Si l’étape 10 n’est pas implémentée, consulter le bit WR pour voir s’il ya une opération
d’écriture en cours.
2. Ecrire l’adresse dans le registre EEADR. Assurez vous que l’adresse est bien dans la plage
mémoire adressée par le composant ;
3. Ecrire la donnée huit bit dans le registre EEDATA ;
4. Effacer le bit EEPGD (EECON1<7>) pour pointer la mémoire EEPROM des données ;
5. Mettre à un le bit WREN (EECON1<2>) pour autoriser l’opération d’écriture
6. Interdire les interruptions si elles sont autorisées ;
7. Exécuter la séquence des cinq instructions:
1. Ecrire 55h dans le registre EECON2 en deux étapes (d’abord dans W, puis dans EECON2).
2. Ecriree AAH dans le registre EECON2 en deux étapes (d’abord dans W, puis dans EECON2).
3. Mettre à un le bit WR ((EECON1<1>)) pour lancer l’écriture
8. Autoriser les interruptions (ses les interruptions sont utilisées).
9. Effacer le bit WREN (EECON1<2>) pour interdire l’opération d’écriture.
10. A la fin du cycle d’écriture, le bit WR sera automatiquement effacé et le drapeau EEIF est mis
à un (EEIF devrait être efface par software). If step 1 is not implemented, then firmware
should check for EEIF to be set, or WR to clear, to indicate the end of the program cycle.
EXAMPLE: DATA EEPROM WRITE

BANKSEL EECON1 ; select bank of EECON1

BTFSC EECON1, WR ; wait for write to complete


GOTO $-1 ;

BANKSEL EEADR ; select bank of EEADR

MOVF ADDR, W ;
MOVWF EEADR ; data memory address to write to
MOVF VALUE, W ;
MOVWF EEDATA ; data memory value to write
BANKSEL EECON1 ; select bank of EECON1

BCF EECON1, EEPGD ; point to data memory


BSF EECON1, WREN ; enable writes
BCF INTCON, GIE ; disable ints.

; DEBUT DE LA SEQUENCE OBLIGATOIRE

MOVLW 55H ;
MOVWF EECON2 ; write 55h
MOVLW AAH ;
MOVWF EECON2 ; write aah

; FIN DE LA SEQUENCE OBLIGATOIRE

BSF EECON1, WR ; set WR bit to begin write.


BSF INTCON, GIE ; enable ints.
BCF EECON1, WREN ; disable writes

L’écriture n’aura pas lieu si la séquence d’écriture n’est pas suivie correctement (écrire 55H dans
le registre EECON2, écrire AAh dans le registre EECON2, ensuite mettre à un le bit WR) pour chaque
octet.
Il est vivement recommandé d’interdire les interruptions pendant cette partie du code

LECTURE DE LA MEMOIRE PROGRAMME FLASH


Pour lire depuis la mémoire programme Flash l’utilisateur devrait suivre les étapes suivantes:

1. Charger la paire EEADRH: EEADR par ADRESSE_MSB : ADRESSE_LSB respectivement ;


2. Activer le drapeau EEPGD : EECON1<7>=1 pour pointer la mémoire programme Flash;
3. Activer le drapeau RD : EECON1<0>=1 pour sélectionner l’opération de lecture;
4. Exécuter deux opérations nop pour permettre au microcontrôleur de lire de la mémoire
programme
5. Lire la donnée (instruction) depuis la paire EEDATH :EEDAT

Une fois le bit de contrôle en lecture (RD) est mis à un, le contrôleur du programme de la
mémoire Flash utilise le deuxième cycle d’instruction pour lire la donnée depuis la zone
programme Flash.
 Ceci entraine le fait que la seconde instruction, suivant immédiatement l’instruction de lecture
BSF EECON1, RD est ignorée.
La donnée (instruction) est valable dans le cycle prochain dans la paire de registres EEDATH :
EEDATA ; ainsi elle peut être lue comme une donnée de deux octets dans les prochaines
instructions ;
La paire de registres EEDATH:EEDATA maintient cette donnée jusqu’à la prochaine lecture ou
jusqu’à ce qu’il y a eu une opération d’écriture dessus par l’utilisateur (pendant une opération
d’écriture).
EXAMPLE: FLASH EEPROM (PROGRAM) READ

BANKSEL EEADRH ; select bank of EEADRH

MOVF ADDRH, W ; charge w avec la partie haute de l’adresse du mot qu’on veut lire
MOVWF EEADRH ; ms byte of program address to read
MOVF ADDRL, W ; charge w avec la partie basse de l’adresse du mot qu’on veut lire
MOVWF EEADR ; ls byte of program address to read

BANKSEL EECON1 ; select bank of EECON1

BSF EECON1, EEPGD ; point to program memory


BSF EECON1, RD ; ee read
;
NOP ; any instructions here are ignored as program memory
NOP ; is read in second cycle after BSF EECON1, RD

BANKSEL EEDATA ; select bank of EEDATA

MOVF EEDATA, W ; charge la partie basse de la donnée lue dans le registre de travail W
MOVWF DATAL ; sauvegarde W dans le registre DATAL (prealablement cree)
MOVF EEDATH, W ; charge la partie haute de la donnée lue dans le registre de travail W
MOVWF DATAH ; sauvegarde W dans le registre DATAH (préalablement crée)

EFFACEMENT DE LA MEMOIRE PROGRAMME FLASH


Au minimum c’est un bloc de 32 mots qu’il faut effacer. L’effacement de juste un mot dans la
mémoire programme Flash n’est pas supporté.
Des blocs de plus de 32 mots ne peuvent être effacés que par l’utilisation d’un programmeur
externe (composant) ou à travers le contrôle ICSP ;
Quand on procède à une séquence d’effacement par utilisation du microcontrôleur lui-même, un
bloc de 32 mots est effacé.
Les 11 bits MSB de la paire EEADRH:EEADR pointent le bloc à effacer. Les bits EEADR< 4:0>

sont ignorés;
Le registre EECON1 contrôle l’opération d’effacement :
 Le bit EEPGD est mis à 1 (EECON1<7>=1) pour pointer la mémoire programme Flash ;
 Le bit WREN est mis à 1 (EECON1<2>=1) pour autoriser l’écriture dans la mémoire
programme Flash ;
 Le bit FREE est mis à 1 (EECON1<4>=1) pour forcer l’opération d’effacement.
Pour la protection, une séquence d’écriture dans le registre EECON2 devrait être respectée, voir la
séquence forcée dans l’exemple d’écriture dans la DATA EEPROM ci dessous.

Après l’instruction “BSF EECON1, WR”, le processeur à besoin de deux cycles pour initialiser
l’opération d’effacement.
L’utilisateur devrait placer deux instructions NOP après l’activation du bit WR (EECON1<1>) ;
Le processeur arrêtera les opérations internes pour une durée de 2ms, uniquement pendant
l’opération d’effacement. Ceci n’est pas un mode SLEEP parce que l’horloge et les périphériques
continuent à travailler ;
Après le cycle d’effacement, le processeur continu avec la troisième instruction après la
l’instruction de mise à un du bit WR (EECON1<1>)

SEQUENCE D’EFFACEMENT DE LA MEMOIRE FLASH


La séquence d’évènement dans une opération d’effacement de la mémoire programme FLASH est :
1. Charger EEADRH:EEADR avec l’adresse de début du bloc à effacer ;
2. Mettre le bit EEPGD à 1 (EECON1<7>=1) pour pointer la mémoire programme Flash ;
3. Mettre le bit WREN à 1 (EECON1<2>=1) pour autoriser l’écriture dans la mémoire programme
Flash ;
4. Mettre le bit FREE à un (EECON1<4>=1) pour forcer l’opération d’effacement du bloc;
5. Interdire les interruptions;
6. Ecrire 55H dans l’EECON2;
7. Ecrire AAh dans l’ EECON2;
8. Mettre le bit WR à un (EECON1<1>=1). Ceci débute l’opération d’effacement.
9. Le processeur est en arrêt interne pendant l’opération d’effacement.

EXAMPLE: ERASING A FLASH PROGRAM MEMORY ROW

BANKSEL EEADRH ; select bank of EEADRH

MOVF ADDRH, W ;
MOVWF EEADRH ; ms byte of program address to erase
MOVF ADDRL, W ;
MOVWF EEADR ; ls byte of program address to erase
BANKSEL EECON1 ; select bank of EECON1

BSF EECON1, EEPGD ; point to program memory


BSF EECON1, WREN ; enable write to memory
BSF EECON1, FREE ; enable row erase operation
;
BCF INTCON, GIE ; disable interrupts (if using)

; DEBUT DE LA SEQUENCE OBLIGATOIRE


MOVLW 55H ;
MOVWF EECON2 ; write 55h
MOVLW AAH ;
MOVWF EECON2 ; write AAH

; FIN DE LA SEQUENCE OBLIGATOIRE

BSF EECON1, WR ; start erase (cpu stall)


;
NOP ; any instructions here are ignored as
; processor halts to begin erase sequence
NOP ; processor will stop here and wait for
; erase complete. after erase processor
; continues with 3rd instruction
;
BCF EECON1, FREE ; disable row erase operation
BCF EECON1, WREN ; disable writes
BSF INTCON, GIE ; enable interrupts (if using)

ECRITURE DANS LA MEMOIRE PROGRAMME FLASH


La mémoire programme FLASH peut être écrite uniquement si l’adresse destination est dans un
segment de la mémoire non protégé en écriture, comme c’est défini par les bits WRT1:WRT0 de
configuration du composant;
La mémoire programme FLASH devrait être écrite par des blocs de 4 mots : Un bloc est composé
de 4 mots avec des adresses successives. L’adresse basse est donnée par les deux bits LSB du
registre EEADR<1:0>;
La mémoire programme devrait être préalablement effacée avant l’opération d’écriture ;
Pour écrire dans la mémoire programme FLASH, la donnée à écrire devrait être d’abord chargée
dans un registre buffer. Il y a quatre registres buffer à 14 bits chacun et ils sont adressés par les
deux bits LSB du registre EEADR.

La séquence suivante montre comment opérer une écriture dans la mémoire programme FLASH.
1. Mettre à un le bit EEPGD (EECON1<7>=1) pour pointer la mémoire EEPROM programme
2. Mettre à un le bit WREN (EECON1<2>=1) ; pour autoriser l’écriture dans la EEPROM
programme
3. Mettre à zéro le bit FREE (EECON1<4>=0) ;
4. Interdire les interruptions (si elles sont autorisées)
5. Ecrire l’adresse dans la paire EEADRH:EEADR
6. Ecrire la donnée dans la paire EEDATH:EEDATA
7. Exécuter la séquence suivante
 Ecrire 55h dans le registre EECON2 : en deux étapes, d’abord dans W et ensuite dans EECON2
 Ecrire AAh dans le registre EECON2: en deux étapes, d’abord dans W et ensuite dans EECON2
 Mettre à un le bit WR (EECON1<1>=1)
8. Exécuter deux opérations NOP pour permettre au microcontrôleur d’entamer l’opération
d’écriture
9. Autoriser les interruptions
10. Effacer WREN (EECON1<2>=1) pour interdire l’écriture dans la dans la EEPROM programme

Ces étapes sont exécutées dans le programme suivant


BSF STATUS, RP1 ;select bank 2. On peut; a la place de ces deux instructions,
BCF STATUS, RP0 ;utiliser la commande BANKSEL EEADR

MOVF ADDRL, W ;write address of desired program memory location


MOVWF EEADR ;
MOVF ADDRH, W ;
MOVWF EEADRH ;
MOVF VALUEL, W ;write value to program at desired memory location
MOVWF EEDATA ;
MOVF VALUEH, W ;
MOVWF EEDATH ;
BSF STATUS, RP0 ;bank 3
BSF EECON1, EEPGD ;point to program memory
BSF EECON1, WREN ;enable writes
;ONLY DISABLE INTERRUPTS
BCF INTCON, GIE ;if already enabled,
;OTHERWISE DISCARD
MOVLW 0X55 ;début de la séquence obligatoire
MOVWF EECON2 ;
MOVLW 0XAA ;
MOVWF EECON2 ; fin de la séquence obligatoire
BSF EECON1, WR ;start write operation
NOP ;two NOPS to allow micro
NOP ;to setup for write
;ONLY ENABLE INTERRUPTS
BSF INTCON, GIE ;if using interrupts,
;OTHERWISE DISCARD

BCF EECON1, WREN ;disable writes

L’utilisateur devrait suivre cette même séquence pour l’écriture de chacun des mots du bloc avec
les adresses basses (EEADR) successives (00, 01, 10 et 11)
La figure suivante montre comment est effectué le transfert des données d’abord dans les quatre
buffers ensuite vers la mémoire programme.

Ecriture d’un bloc dans la mémoire programme Flash

Un exemple d’une séquence d’écriture de quatre mots est donné ci-dessous. L’adresse initiale est
chargée dans la paire de registre EEADRH:EEADR ; les quatre mots sont chargés par utilisation de
l’adressage indirecte, en supposant que l’effacement (erasing) est préalablement effectué.
EXAMPLE: WRITING TO FLASH PROGRAM MEMORY
; This write routine assumes the following:
; 1. The 32 words in the erase block have already been erased.
; 2. A valid starting address (the least significant bits = '00') is loaded into ; EEADRH:EEADR
; 3. This example is starting at 0x100, this is an application dependent;
; setting.
; 4. The 8 bytes (4 words) of data are loaded, starting at an address in RAM called ARRAY.
; 5. This is an example only, location of data to program is application dependent.
; 6. word_block is located in data memory.

BANKSEL EECON1 ;prepare for write procedure

BSF EECON1, EEPGD ;point to program memory


BSF EECON1, WREN ;allow write cycles
BCF EECON1, FREE ;perform write only

BANKSEL WORD_BLOCK

MOVLW .4 ;the point ”.” near 4 is to specify decimal format


MOVWF WORD_BLOCK ;prepare for 4 words to be written

BANKSEL EEADRH ;start writing at 0x100

MOVLW 0X01
MOVWF EEADRH ;load high address: EEADRH  0x01
MOVLW 0X00
MOVWF EEADR ;load low address: : EEADR  0x00

BANKSEL ARRAY

MOVLW ARRAY ;initialize FSR to start of data


MOVWF FSR

LOOP

BANKSEL EEDATA

MOVF INDF, W ;indirectly load EEDATA


MOVWF EEDATA

INCF FSR, F ;increment data pointer


MOVF INDF, W ;indirectly load EEDATH
MOVWF EEDATH

INCF FSR, F ;increment data pointer

BANKSEL EECON1

MOVLW 0X55 ;required sequence start


MOVWF EECON2

MOVLW 0XAA
MOVWF EECON2 ; required sequence end
BSF EECON1, WR ;set WR bit to begin write
NOP ;instructions here are ignored as processor
NOP

BANKSEL EEADR

INCF EEADR, F ;load next word address

BANKSEL WORD_BLOCK

DECFSZ WORD_BLOCK, F ;have 4 words been written?


GOTO LOOP ;no, continue with writing

BANKSEL EECON1

BCF EECON1, WREN ;yes, 4 words complete, disable writes


BSF INTCON, GIE ;enable interrupts

Vous aimerez peut-être aussi