Académique Documents
Professionnel Documents
Culture Documents
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 :
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…
Prise en comptes
Convertisseur analogique
Entrées analogiques matérielle de capteurs
numérique
externes
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.
00 0
01 1
10 2
11 3
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).
Broches du port A
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.
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 :
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
RB1 Bit1 TTL Input/output pin. Internal software programmable weak pull-up.
RB2 Bit2 TTL Input/output pin. Internal software programmable weak pull-up.
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 :
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.
MOVLW B’10010000’
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é:
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF STATUS_TEMP
Broches du port C
RC0/T1OSO/T1CKI Bit0 ST Input/output port pin or Timer1 oscillator output/Timer1 clock input.
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.
Les registres associés avec ce port sont : PORTC, TRISC. Voir ANNEXE R pour plus de détail.
Broches du port D
Les registres associés avec ce port sont : PORTD, TRISD, TRISE. Voir ANNEXE R pour plus de détail.
Broches du port E
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 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
Les registres associés avec ce port sont : PORTE, TRISE, ADCON1. Voir ANNEXE R pour plus de détail.
dessous):
Le premier exemple montre comment est chargé le PC par une opération d’écriture dans PCL
(PCLATH<4:3> PCH)
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.
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 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
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).
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.
EECON2
EEDATA
EEDATH
EEADR
EEADRH
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.
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 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.
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
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
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
MOVLW 55H ;
MOVWF EECON2 ; write 55h
MOVLW AAH ;
MOVWF EECON2 ; write aah
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
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
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
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)
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>)
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
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
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.
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 WORD_BLOCK
MOVLW 0X01
MOVWF EEADRH ;load high address: EEADRH 0x01
MOVLW 0X00
MOVWF EEADR ;load low address: : EEADR 0x00
BANKSEL ARRAY
LOOP
BANKSEL EEDATA
BANKSEL EECON1
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
BANKSEL WORD_BLOCK
BANKSEL EECON1