10.2 microcontroleur
10.2 microcontroleur
10.2 microcontroleur
microcontrôleur
01/04/2021 1
MICROCONTROLEURS
01/04/2021 2
DESCRIPTION ET STRUCTURE INTERNE DES MICROCONTROLEURS
Un microcontrôleur se présente sous la forme d’un circuit
intégré réunissant tous les éléments d’une structure à base de
microprocesseur (figure 1). Voici généralement ce que l’on
trouve à l’intérieur d’un tel composant :
01/04/2021 3
DESCRIPTION ET STRUCTURE INTERNE DES MICROCONTROLEURS
- Un microprocesseur (C.P.U.),
- De la mémoire de donnée (RAM et EEPROM),
- De la mémoire programme (ROM, PROM, EPROM ou
EEPROM),
- Des interfaces parallèles pour la connexion des entrées /
sorties,
- Des interfaces séries (synchrone ou asynchrone) pour le
dialogue avec d’autres unités,
- Des timers pour générer ou mesurer des signaux avec une
grande précision temporelle,
- Des convertisseurs analogique / numérique (CAN) pour le
traitement de signaux analogiques.
- Un chien de garde, ce dispositif est un système anti-plantage
du microcontrôleur. Il s’assure qu’il n’y ait pas d'exécution
prolongée d’une même suite d’instructions.
- Le signal d’horloge. qui permet de cadencer le
fonctionnement du microcontrôleur.
01/04/2021 4
01/04/2021 5
01/04/2021 6
MICROCONTROLEUR PIC 16F84
Un PIC (Programmable Interface Controler) est un
microcontrôleur de chez Microchip. Son microprocesseur est
de type RISC (Reduced Instruction Set Computer) qui possède
un nombre réduit d’instructions (35), Chacune d’elles s’exécute
en une période d’horloge.
Un microprocesseur CISC (Complex Instruction Set Computer)
possède un nombre important d’instructions, Chacune d’elles
s’exécute en plusieurs périodes d’horloges.
01/04/2021 7
MICROCONTROLEUR PIC 16F84
Nous utiliserons un PIC 16F84 –10, soit :
- 16 : Mid-Line : Les instructions sont codées sur 14 bits. On
trouve aussi Base-Line : 12bits et High-End : 16bits.
- F : FLASH : type de mémoire programme. (C : EPROM ou
EEPROM. CR : PROM)
- 84 : Type
- 10 : Quartz à 10MHz au maximum
- L : Tolérance plus importante de la plage de tension, pour le
16LF84.
01/04/2021 8
Aspect externe du 16F84
Le 16F84 est commercialisé dans un boîtier 18 broches
classiques
01/04/2021 9
Architecture générale
01/04/2021 10
Architecture générale
L'architecture générale du circuit est constituée des éléments
suivants :
• Une mémoire programme de type flash de 1K (1024) mots de 14
bits
• Une mémoire RAM constituée :
o Des registres de control SFR (Special Function Registers)
o 68 octets de RAM utilisateur appelés aussi GPR (General Propose
Resisters)
• Une mémoire EEPROM de donnée de 64 octets
• Deux ports d'entrée sortie, un de 8 bits et un de 5 bits
• Un timer/Compteur cadencé par une horloge interne ou externe
• Un chien de garde / compteur qui est un timer particulier
• L'horloge peut être générée par 4 types d'oscillateurs
sélectionnables
• Protection de code
• Fonctionnement en mode sleep pour réduction de la
consommation
01/04/2021 11
Organisation de la mémoire du PIC 16F84
La mémoire du PIC 16F84 est répartie en trois espaces, logés
sur la même pastille de silicium :
01/04/2021 12
La mémoire programme
01/04/2021 13
La mémoire programme
01/04/2021 14
Mémoire données (Data Memory)
01/04/2021 15
Mémoire données (Data Memory)
01/04/2021 16
Fichier registre (Register File)
01/04/2021 17
Fichier registre (Register File)
01/04/2021 18
Fichier registre (Register File)
01/04/2021 19
Fichier registre (Register File)
01/04/2021 20
Fichier registre (Register File)
l’indication « mapped in bank 0) vous indique qu’accéder
à ces 68 octets depuis la banque 0 ou la banque 1 donne
en fait accès à la même case mémoire.
01/04/2021 21
La mémoire EEPROM de configuration
01/04/2021 22
La mémoire EEPROM de configuration
- Bit 2 - WDTE (Watch-Dog Timer Enable)
1 = autorise le chien de garde 0 = n’autorise pas le chien
de garde
- Bit 3 - PWRTE (PoWeR Timer Enable)
Le μC possède un timer permettant de retarder de 72 ms
le lancement du programme après la mise sous tension
du circuit.
1 = le μC attend 72 ms 0 = le μC démarre tout de suite
- Bit 4 - CP (Code Protection)
1 = pas de protection (le μC pourra être lu correctement)
0 = avec protection (le μC ne pourra plus être lu
correctement. Le contenu de la mémoire sera
désorganisé).
01/04/2021 23
Les ports d’entrée/sortie
Le pic 16F84 possède deux ports d’entrée/sortie (PORTA et
PORT B) dont les broches sont bidirectionnelles et qu'ils
peuvent être programmées soit en entré soit en sortie.
01/04/2021 24
Les registres PORTA et TRISA
Le « PORTA » est le registre qui représente l’image des pins
RA0 à RA4. Ce registre se situe à l’adresse 05H, dans la
banque0. Chaque bit de ce registre représente un pin. Donc,
seuls 5 bits sont utilisés. Pour écrire sur un pin en sortie, on
place le bit correspondant à 1 ou à 0, selon le niveau souhaité.
01/04/2021 25
Les registres PORTA et TRISA
01/04/2021 26
Les registres PORTB et TRISB
Ces registres fonctionnent exactement de la même manière
que PORTA et TRISA, mais concernent bien entendu les 8 pins
RB. Tous les bits sont donc utilisés dans ce cas.
01/04/2021 27
registres fondamentaux
Le registre « W »
Ce registre est un registre utilisé par les pics pour réaliser
toutes sortes de calculs. Dans une instruction la
destination d’un résultat (d) peut en général être un
emplacement RAM (f) ou le registre de travail (w). C’est un
donc un registre fondamental.
01/04/2021 28
Le registre « STATUS »
01/04/2021 29
Le registre « STATUS »
Bits 6 et 5 : RP1 et RP0 = permettent la sélection des pages en
adressage direct
01/04/2021 30
Le registre « STATUS »
Bit 4 : TO = Time Out bit. Bit en lecture seulement.
1 = Après une mise sous tension, après une RAZ du watchdog
(CLRWDT) ou bien après l'instruction SLEEP.
0 = Signifie qu'un Time Out du timer de watchdog est survenu.
Bit 3 : PD = Power Down bit.
1 = Après une mise sous tension ou bien après une RAZ du
Watchdog.
0 = Après l'instruction SLEEP.
Bit 2 : Z = Zero bit.
1 = Le résultat d'une opération arithmétique ou logique est
zéro.
0 = Le résultat d'une opération arithmétique ou logique est
différent de zéro.
01/04/2021 31
Le registre « STATUS »
Bit 1 : DC = Digit Carry bit.
1 = Une retenue sur le 4ème bit du poids faible est survenue
après les instructions : ADDWF et ADDLW.
0 = Pas de retenue sur le 4eme bit des poids faibles.
Bit 0 : C = Carry bit.
1 = Une retenue sur le bit MSB est survenue après les
instructions ADDWF et ADDLW.
0 = Pas de retenue sur le bit MSB.
01/04/2021 32
Les instructions du PIC 16F84
Le microcontrôleur 16F84 possède un set de seulement 35
instructions codées (en représentation binaire) sur 14 bits,
selon le modèle :
01/04/2021 33
Les instructions du PIC 16F84
01/04/2021 34
Instructions orientées octet (adressage direct)
Ce sont des instructions qui manipulent les données sous
forme d’octets. Elles sont codées de la manière suivante :
- 6 bits pour l’instruction : logique, car comme il y a 35
instructions, il faut 6 bits pour pouvoir les coder toutes
- 1 bit (d) pour indiquer si le résultat obtenu doit être
conservé dans le registre de travail (accumulateur) W de
l’unité de calcul (W pour Work) ou sauvgardé dans un registre
F (F pour File)
- Reste 7 bits pour encoder l'adresse de l’opérande (128
positions au total)
Problème ! 7 bits ne donnent pas accès à la mémoire RAM
totale, donc voici l’explication de la division de la RAM en deux
banks. Pour remplacer le bit manquant, on utilise le bit RP0 du
registre STATUS.
Exemple : MOVWF 0x2C ; recopie W dans la case mémoire
d'adresse 2C.
01/04/2021 35
Les instructions « orientées bits »
Ce sont des instructions destinées à manipuler directement les
bits d’un registre d'une case mémoire. Elles sont codées
de la manière suivante :
- 4 bits pour l’instruction
- 3 bits pour indiquer le numéro du bit à manipuler (de 0 à 7)
- 7 bits pour indiquer l’opérande
01/04/2021 36
Les instructions opérant sur une donnée (adressage immédiat)
Ce sont les instructions qui manipulent des données qui sont
codées dans l’instruction directement. Elles sont codées de
la manière suivante :
- L’instruction est codée sur 6 bits
- Elle est suivie d’une valeur IMMEDIATE codée sur 8 bits (donc
de 0 à 255).
01/04/2021 37
Les instructions de saut et appel de procédures
Ce sont les instructions qui provoquent une rupture dans la
séquence de déroulement du programme. Elles
sont codées de la manière suivante :
- Les instructions sont codées sur 3 bits
- La destination est codée sur 11 bits
Nous pouvons déjà en déduire que les sauts ne donnent accès
qu’à 2K de mémoire programme (2048). Pas de problème
pour le 16F84 qui ne possède que 1k de mémoire programme.
01/04/2021 38
Le jeu d’instructions de la famille 16F8XX
Résumé des instructions (mnémonique)
01/04/2021 39
Le jeu d’instructions de la famille 16F8XX
01/04/2021 40
Le jeu d’instructions de la famille 16F8XX
01/04/2021 41
Exemples d'instructions
01/04/2021 42
Exemples d'instructions
MOVF permet de copier le contenu d’un registre (SFR ou GPR)
dans l’accumulateur W, le paramètre d doit être = 0
01/04/2021 43
Les instructions btfss et btfsc
Ces instructions permettent de tester un bit et de sauter ou
non une ligne de programme en fonction de la valeur du bit,
BTFSC F,b : Bit Test Skip if Clear : teste le bit b du registre F et
saute l’instruction suivante si le bit testé est nul
BTFSS F,b : Bit Test Skip if Set : teste le bit b du registre F et
saute l’instruction suivante si le bit testé est égal à 1.
01/04/2021 44
Les instructions btfss et btfsc
01/04/2021 45
Les instructions incfsz et decfsz
Ces instructions permette d’incrémenter ou de décrémenter
un registre et de sauter si le résultat est nul.
01/04/2021 46
L’instruction goto
Permet de transférer l’exécution à une autre position du
programme repérée par une étiquette (label)(bonjour ds notre
exemple)
01/04/2021 47
Les modes d’adressages
01/04/2021 48
Les modes d’adressages
C-l ’adressage indirect
01/04/2021 49
Les modes d’adressages
C-l ’adressage indirect
01/04/2021 50
C-l ’adressage indirect
Exemple 2 : Soit à effacer la zone mémoire allant de l’adresse
0x0C à 0x3F
01/04/2021 51
C-l ’adressage indirect
Exemple 2 : Soit à effacer la zone mémoire allant de l’adresse
0x0C à 0x3F
01/04/2021 52
Boucles de temporisation
Il arrive souvent qu'on désire introduire des temporisations
pendant l'exécution d'un programme. L'idée est d'initialiser
une variable à une valeur donnée et ensuite la décrémenter en
boucle jusqu'à ce qu'elle atteigne 0. Connaissant le temps
d'exécution de chaque instruction, on peut calculer le temps
que mettra le processeur pour terminer la boucle de
décrémentation.
01/04/2021 53
Temporisation avec une boucle
Examinons l'exemple ci-dessous, on met une valeur N1 =4 dans
la case mémoire 70h et on la décrémente jusqu'à 0.
01/04/2021 54
Temporisation avec une boucle
L’instruction call dans le programme principal prend 2 cycles.
- Les instructions movlw et movwf prennent 1 cycle chacune.
- Chaque passage dans la boucle prend (1+2) cycle sauf le
dernier qui prend 2 cycles.
L'instruction decfsz prend 1 cycle si elle ne saute pas et 2
cycles quand elle saute.
- L'instruction goto prend 2 cycles.
- L’instruction return prend 2 cycles
01/04/2021 55
Temporisation avec une boucle
01/04/2021 56
Temporisation avec 2 boucles imbriquées
La boucle intérieure (N1) se fait toujours 256 fois. La boucle
extérieure se fait N2 fois.
Soit :
AN1 EQU 0x0C ; le registre temporaire N1 se trouve à l’adresse 0C
AN2 EQU 0x0F ; le registre temporaire N2 se trouve à l’adresse 0F
01/04/2021 57
Temporisation avec 2 boucles imbriquées
01/04/2021 58
Temporisation avec 2 boucles imbriquées
01/04/2021 59
Temporisation avec 3 boucles imbriquées
Les boucles intérieures (N1 et N2) se font toujours 256 fois. La
boucle extérieure se fait N3 fois
01/04/2021 60
Le Timer TMR0 (compteur)
C’est un compteur 8 bits (contrôlé par le registre OPTION_REG)
ayant les caractéristiques suivantes :
OPTION_REG
01/04/2021 61
Le Timer TMR0
Il est incrémenté en permanence soit par l’horloge interne
Fosc/4 (mode timer) soit par une horloge externe
appliquée à la broche RA4 du portA (mode compteur). Le
choix de l'horloge se fait à l'aide du bit T0CS (Timer
zero Clock Source) du registre OPTION_REG
01/04/2021 62
Le Timer TMR0
Dans le cas de l'horloge externe, on peut choisir le front sur
lequel le TIMER s'incrémente avec T0SE (Timer 0 Signal Edge).
• TOSE = 0 incrémentation sur fronts montants
• TOSE = 1 incrémentation sur fronts descendants
01/04/2021 63
Le Timer TMR0
Quelque soit l'horloge choisie, on peut la passer dans un
diviseur de fréquence programmable (prescaler) dont le
rapport est fixés par les bits PS0, PS1 et PS2 du registre
OPTION_REG (tableau ci-dessous).
L'affectation ou non du prédiviseur se fait à l'aide du bit PSA
(Pre-Scaler Assignment) du registre OPTION_REG.
• PSA = 0 on utilise le prédiviseur
• PSA = 1 pas de prédiviseur (affecté au chien de garde)
01/04/2021 64
Le Timer TMR0
01/04/2021 65
Le Timer TMR0
Le contenu du timer TMR0 est accessible par le registre qui
porte le même nom. Il peut être lu ou écrit à n'importe
quel moment. Après une écriture, l'incrémentation est inhibée
pendant deux cycles instruction.
Au débordement de TMR0 (FF 00), le drapeau T0IF du
registre INTCON est placé à 1. Ceci peut déclencher
l'interruption T0I si celle-ci est validée par le bit T0IE (INTCON).
01/04/2021 66
Le Timer TMR0
01/04/2021 67
Le chien de garde WDT (Watchdog )
C'est un système de protection contre un blocage du
programme. Par exemple, si le programme attend le résultat
d'un système extérieur (conversion analogique numérique par
exemple) et qu'il n'y a pas de réponse, il peut rester bloquer.
C’est un compteur 8 bits incrémenté en permanence (même si
le μC est en mode sleep (sommeil)) par une horloge RC
intégrée indépendante de l'horloge système. Lorsqu’il
déborde, (WDT TimeOut), deux situations sont possibles :
Si le μC est en fonctionnement normal, le WDT time-out
provoque un RESET. Ceci permet d’éviter de rester planté en
cas de blocage du microcontrôleur par un processus
indésirable non contrôlé.
01/04/2021 68
Le chien de garde WDT (Watchdog )
• Si le μC est en mode SLEEP, le WDT time-out provoque un
WAKE-UP (réveil), l'exécution du programme continue
normalement là où elle s'est arrêtée avant de rentrer en mode
SLEEP. Cette situation est souvent exploitée pour réaliser
des temporisations.
01/04/2021 69
Le chien de garde WDT (Watchdog )
L'horloge du WDT est ajustée pour que Le Time-Out arrive
toutes les 18 ms. Il est cependant possible d'augmenter
cette durée en faisant passer le signal Time-Out dans un
prédiviseur programmable (partagé avec le timer TMR0).
L’affectation se fait à l'aide du bit PSA du registre OPTION_REG.
• PSA = 1 on utilise le prédiviseur.
• PSA = 0 pas de prédiviseur (affecté à TMR0)
01/04/2021 70
Le chien de garde WDT (Watchdog )
Le rapport du prédiviseur est fixé par les bits PS0, PS1 et PS2
du registre OPTION_REG. 8 valeurs de 1 à 128 sont
disponibles, ce qui permet d'aller jusqu'à 128*18ms=2.3s
avant le déclenchement du chien de garde
01/04/2021 71
Le chien de garde WDT (Watchdog )
L'utilisation du WDT doit se faire avec précaution pour éviter la
réinitialisation (inattendue) répétée du programme. Pour
éviter un WDT timeOut lors de l'exécution d'un programme, on
a deux possibilités :
Inhiber (désactiver) le WDT d'une façon permanente en
mettant à 0 le bit WDTE dans l'EEPROM de configuration
01/04/2021 72
Le chien de garde WDT (Watchdog )
01/04/2021 73
Le mode SLEEP (sommeil)
Le PIC peut être placé en mode faible consommation à l'aide
de l'instruction SLEEP. Dans ce mode, l'horloge système
est arrêtée ce qui arrête l'exécution du programme.
Pour sortir du mode SLEEP, il faut provoquer un WAKE-UP
(réveil), pour cela il y a 3 possibilités :
1. RESET externe dû à l'initialisation du PIC en mettant l'entrée
MCLR à 0. Le PIC reprend l'exécution du programme à partir du
début.
2. Timeout du chien de garde WDT si celui-ci est validé. Le PIC
reprend le programme à partir de l'instruction qui suit
l'instruction SLEEP.
01/04/2021 74
Le mode SLEEP (sommeil)
Pour sortir du mode SLEEP, il faut provoquer un WAKE-UP
(réveil) ,troisième possibilité:
3. Interruption INT (sur RB0) ou RBI (sur RB4-RB7) ou EEI (fin
d'écriture en EEPROM de données). Le bit de
validation de l'interruption en question doit être validé, par
contre, le WAKE-UP a lieu quelque soit la position
de bit de validation globale GIE. On a alors deux situations :
a. GIE = 0, Le PIC reprend l'exécution du programme à partir de
l'instruction qui suit l'instruction SLEEP,
l'interruption n'est pas prise en compte.
b. GIE = 1, Le PIC exécute l'instruction qui se trouve juste après
l'instruction SLEEP puis se branche à
l'adresse 0004 pour exécuter la procédure d'interruption. Dans
le cas où l'instruction suivant SLEEP
n'est pas désirée, il faut utiliser l'instruction NOP.
01/04/2021 75
La mémoire EEPROM de données
Le PIC possède une zone EEPROM (DATA MEMORY) de 64
octets (allant de l’adresse 0x2100 à 0x213F) accessibles
en lecture et en écriture par le programme. On peut y
sauvegarder des valeurs, qui seront conservées même si
l'alimentation est éteinte, et les récupérer lors de la mise sous
tension. On accède à cette mémoire uniquement par
l’intermédiaire de quatre registres spéciaux:
01/04/2021 76
La mémoire EEPROM de données
La durée d’écriture d’un octet est de l’ordre de 10 ms, la fin de
chaque écriture réussie est annoncé par le drapeau EEIF et la
remise à zéro du bit WR du registre EECON1. Le drapeau EEIF
peut déclencher l'interruption EEI si elle a été validée.
01/04/2021 77
Procédure de lecture dans l'EEPROM de données.
01/04/2021 78
La mémoire EEPROM de données
01/04/2021 79
01/04/2021 80
LES INTERRUPTIONS
Une interruption provoque l’arrêt du programme principal
pour aller exécuter une procédure d'interruption. A la fin de
cette procédure, le microcontrôleur reprend le programme à
l’endroit où il s’était arrêté
01/04/2021 81
01/04/2021 82
LES INTERRUPTIONS
Lorsque l'événement déclencheur d'une interruption
intervient, alors son drapeau est positionné à un (levé). Si
l'interruption
correspondante a été validée, elle est alors déclenchée : le
programme arrête ce qu'il est en train de faire et va exécuter la
procédure d'interruption qui se trouve à l'adresse 4 en
exécutant les étapes suivantes :
• l'adresse contenue dans le PC (Program Counter) est
sauvegardée dans la pile, puis remplacée par la valeur 0004
(adresse de la routine d'interruption).
• Le bit GIE est placé "0" pour inhiber toutes les interruptions
(afin qu'on ne soit pas dérangés pendant l'exécution de la
procédure d'interruption).
01/04/2021 83
LES INTERRUPTIONS
• A la fin de la procédure d'interruption (instruction
RETFIE) :
o le bit GIE est replacé à l'état haut (autorisant ainsi un autre
événement)
o le contenu du PC est rechargé à partir de la pile ce qui
permet au programme de reprendre là où il s'est arrêté
01/04/2021 84
Les sources d’interruptions du 16F84
Dans le cas du PIC 16F84, il existe 4 sources d'interruption
(Figure ci-contre) :
- INT : Interruption externe, broche RB0/INT ;
- TMR0 : Fin de comptage ;
- PORTB : Changement d'état du port B (RB7-RB4) ;
- EEPROM : Fin d'écriture en EEPROM.
A chaque interruption sont associés deux bits: un bit de
validation et un drapeau. Le premier permet d'autoriser ou
non l'interruption, le second permet au programmeur de
savoir de quelle interruption il s'agit. Tous ces bits sont dans
le registre INTCON à part le drapeau EEIF de l'interruption
EEI qui se trouve dans le registre EECON1.
01/04/2021 85
Les sources d’interruptions du 16F84
01/04/2021 86
Les sources d’interruptions du 16F84
01/04/2021 87
Sauvegarde et restitution du contexte lors d’une interruption
C'est un point important pour tous les sous-programmes qui
devient capital pour les sous-programmes
d'interruption. En effet, beaucoup d'instructions modifient le
registre STATUS et/ou utilisent le registre W. Afin de
les rendre dans le même état à la fin du sous-programme
d'interruption qu'au début, il faut les sauvegarder au
début et les recopier à la fin. Si d'autres registres sont utilisés
dans le sous-programme d'interruption, il faut généralement
les sauvegarder aussi.
01/04/2021 88
Sauvegarde et restitution du contexte lors d’une interruption
Voici donc la structure de base d’une routine d’interruption :
01/04/2021 89
Sauvegarde et restitution du contexte lors d’une interruption
01/04/2021 90
Reconnaissance de l'interruption active
Les bits 0 à 2 du registre INTCON et le bit 4 du registre EECON1
permettent de savoir quel événement extérieur a
déclenché une interruption. Ainsi, au début du programme
d'interruption, si plusieurs sources ont été validées, il faut
impérativement aller tester ces différents bits pour connaître
la source active et dérouler le programme correspondant.
On utilise pour cela l'instruction btfsc qui exécute l'instruction
suivante si le bit testé vaut 1, la saute sinon.
01/04/2021 91
Reconnaissance de l'interruption active
01/04/2021 92
01/04/2021 93