Vous êtes sur la page 1sur 46

Cours Microcontrôleurs Masters : EI et ME, Dpt.

ELT FEI USTHB

2.1 Introduction - Du microprocesseur au microcontrôleur


La fabrication du premier circuit commence en 1970, année où la société INTEL met au point le
premier microprocesseur le 4004. On n'imagine pas à l’époque que cette révolution industrielle
donnera naissance à l'ordinateur individuel.
Les microprocesseurs ne sont jamais employés seuls, des circuits périphériques leurs sont toujours
associés pour pouvoir être intégrés au sein d'une application (figure 1).

2.2 Les microcontrôleurs


Les microcontrôleurs possèdent quant à eux la puissance d'un microprocesseur mais ont un atout en
plus du fait qu’ils possèdent dans le même boîtier, les périphériques intégrés (figure 2). Cela veut
dire que le programme de l'application est en interne et non plus dans un circuit mémoire externe et
que les périphériques d’entrées-sorties sont également intégrés, ce qui fait l’économie de nombreux
circuits périphériques. Cette caractéristique fait que les montages deviennent encore plus simples et
la programmation plus aisée. Un microcontrôleur seul peut donc gérer une application, sans faire
appel forcement à d'autres circuits associés.

Figure 2

Sur la figure 2, le microcontrôleur possède en interne la mémoire programme contenant le


programme de l'application ainsi que les ports d’entrées-sorties qui vont permettre au
microcontrôleur de s'interfacer avec l'application. On le voit ici, par rapport au schéma à base de
microprocesseur présenté sur la figure 1, qu’on a encore franchi un degré d’intégration en
rassemblant tous les circuits nécessaires au fonctionnement d'une application dans le même boîtier.

2.3 Structure interne d'un microcontrôleur


Un microcontrôleur, le plus simple qu'il soit, possède au minimum les éléments suivants :

1
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

- Une unité centrale qui est le cœur du système, également appelé CPU pour Central Processing Unit.
Dans cette unité centrale, nous retrouvons plusieurs éléments, telle que l’unité arithmétique et
logique (UAL) et d’interpréter les instructions du programme en cours d’exécution.
- Une mémoire contenant le programme à exécuter par le microcontrôleur, généralement appelée
mémoire morte ou ROM (Read Only Mémory), mémoire à lecture seule. Cette mémoire a la
particularité de sauvegarder en permanence les informations qu'elle contient, même en absence de
tension (ce qui est primordial, sinon il faudrait reprogrammer le microcontrôleur à chaque remise
sous tension !).
- Une mémoire vive également appelée RAM (Random Access Mémory), cette mémoire permet de
sauvegarder temporairement des informations. Il est à noter que le contenu d'une RAM n'est
sauvegardé que pendant la phase d'alimentation du circuit. Le microcontrôleur pourra utiliser cette
mémoire pour stocker des variables temporaires ou faire des calculs intermédiaires.
- Un port d’entrées-sorties permettant au microcontrôleur de dialoguer avec l'extérieur pour, par
exemple, prendre l’état d'un capteur, d'un interrupteur ou bien pour allumer une led ou piloter un
relais (via un transistor). Des bus internes permettent la communication entres les différents
éléments intégrés au microcontrôleur.
Cette architecture, simplifiée, est représentée sur la figure 3.

Figure 3

2.4 Fonctionnement d’une bascule


Avant d'étudier l'architecture interne d'un PIC, nous allons faire un bref rappel sur les bascules, pour
nous amener jusqu' au "circuit registre" constituant l’essentiel dans l’architecture d'un PIC.
Il existe en logique combinatoire différentes bascules ayant chacune des caractéristiques et un mode
de fonctionnement propre. Nous allons étudier ici le fonctionnement de l'une d'elles : la bascule D.
Une bascule D peut être construite à l'aide de 4 portes NAND et d'un inverseur, telle que représentée
sur la figure 4.

Figure 4 : Représentation d’une bascule D

2.4.1 Mode de fonctionnement


Tant que l’entrée de validation H est au niveau logique bas (0 V) la sortie des portes NAND (3 et 4) est
au niveau logique haut, en effet un 0V appliqué sur une des entrées d'une porte NAND provoque la
mise au niveau logique "1" de la sortie de cette porte, on dit que le "0" est l'élément absorbant sur
une NAND (voir la table de vérité). La sortie des portes 3 et 4 restera "bloquée" au niveau logique "1"

2
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

tant que l'entrée H est à 0, ce qui signifie que le signal présent sur l'entrée D (data) ne modifiera pas
les sorties des portes 3 et 4 (sortie R et sortie S). La sortie Q de la bascule D restera donc dans l’état
précédent, on peut dire que la bascule D a mémorisé l'état antérieur (voir la table de vérité).

Tableau I

Passons maintenant l'entrée H au niveau logique "1", pour une porte NAND le niveau logique "1", sur
l'une de ses entrées, représente "l'élément neutre", c'est à dire que la sortie de la porte ne dépendra
alors que de l 'état de la deuxième entrée logique. Si l’entrée D est au niveau logique 1 la sortie de la
porte 4 ( S ) passe au niveau logique "0", ce qui provoque une mise au niveau logique "1" de la sortie
de la porte 1 appelée "Q". Un inverseur est inséré entre le signal d'entrée D et la porte 3, de ce fait,
sachant que nous avons mis précédemment D à 1 cela signifie que la sortie de la porte 3 est au
niveau logique "1". La deuxième entrée de la porte 2 est connectée sur la sortie de la porte 1 qui est
au niveau logique "1", de ce fait la sortie Q barre de la porte 2 est donc au niveau logique "0".

Conclusion : On peut dire que la sortie Q d'une bascule D recopie l’état de l’entrée D tant que le
signal de validation H est au niveau logique "1". Si le signal H est au niveau logique "0 ", alors la
bascule peut être assimilée à une cellule mémoire de 1 bit, car elle mémorise l’état antérieur de la
sortie Q.

Tableau I : Table de vérité de la bascule D

Comment utiliser des bascules D pour former une mémoire statique de la bascule à la mémoire ...
Nous venons de voir le fonctionnement d'une bascule D unique, celle-ci peut être assimilée à une
cellule mémoire de 1 bit (en effet on ne mémorise qu'une seule information binaire). Pour réaliser,
par exemple, une mémoire 8 bits (1 octet), on pourra juxtaposer 8 bascules D, comme représenté sur
le schéma de la figure 5. La donnée à mémoriser est présentée via les interrupteurs sur les entrées
Data des bascules D (D0 à D7) puis lorsque l'on veut mémoriser l’état de ces 8 entrées, il suffit
d'appliquer une impulsion sur la broche de validation H (remarquez que toutes les entrées de
validation H sont reliées ensembles). Les 8 leds connectées sur les sorties Q donnent l’état du
contenu de chaque bascule. Le montage ci-après peut se réaliser à l'aide d'un circuit comportant 8
bascules D tel que le 74374.

3
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Figure 5
Cette mémoire 8 bits peut également s'appeler registre 8 bits. Dans l'architecture interne d'un
microcontrôleur PIC nous retrouverons de nombreux registres semblables à celui-ci. Le PIC 16F84
possède 15 registres ayant chacun une fonction bien définie.

2.5 Qu’est-ce qu’un PIC® ?


Les PIC® sont des composants dits RISC (Reduced Instructions Set Computer), ou encore composant à
jeu d’instructions réduit. Pourquoi ? Et bien, sachez que plus on réduit le nombre d’instructions, plus
facile et plus rapide en est le décodage, et plus vite le composant fonctionne.

On trouve sur le marché 2 familles opposées, les RISC et les CISC (Complex Instructions Set
Computer). Sur les CISC, on dispose de moins de vitesse de traitement, mais les instructions sont plus
complexes, plus puissantes, et donc plus nombreuses. Il s’agit donc d’un choix de stratégie.

Tous les PIC® Mid-Range ont un jeu de 35 instructions, stockent chaque instruction dans un seul mot
de programme, et exécutent chaque instruction (sauf les sauts) en 1 cycle. On atteint donc des très
grandes vitesses, et les instructions sont plus rapidement assimilées. L’exécution en un seul cycle est
typique des composants RISC.

2.5.1 Les différentes familles des PIC®


La famille Base-Line, qui utilise des mots d’instructions de 12 bits pour certains PIC (12C508), de 14
pour d’autres (12F675), la famille Mid-Range, qui utilise des mots de 14 bits (et dont font partie les
16F84 et 16F876), et la famille High-End, qui utilise des mots de 16 bits. Par la suite, d’autres familles
sont apparues, comme Enhanced family, et les choses ne devraient faire qu’évoluer.

2.5.2 Identification d’un PIC®


Les 2 premiers chiffres indiquent la catégorie du PIC®, 16 indique un PIC® Mid-Range.

Ensuite, vous trouverez :


C indique que la mémoire programme est une EPROM ou plus rarement une EEPROM
CR pour indiquer une mémoire de type ROM
Ou F pour indiquer une mémoire de type FLASH.
Notez à ce niveau que seule une mémoire FLASH ou EEPROM est susceptible d’être effacée, donc
n’espérez pas reprogrammer vos PIC® de type CR. Pour les versions C, le 16C84 peut être
reprogrammé, il s’agit d’une mémoire EEPROM. Le 12C508, par exemple, possède une mémoire
programme EPROM, donc effaçable uniquement par exposition aux ultraviolets.

Finalement vous verrez sur les boîtiers le suffixe « -XX » dans lequel XX représente la fréquence
d’horloge maximale que le PIC® peut recevoir. Par exemple –04 pour un 4MHz.

Donc, un 16F84-04 est un PIC® Mid-Range (16) donc la mémoire programme est de type FLASH (F)
donc réinscriptible de type 84 et capable d’accepter une fréquence d’horloge de 4MHz en théorie
(probablement : 10Mhz pour un 16F84 et 20Mhz pour un 16F84A).

4
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

2.5.3 Brochage et caractéristiques principales


Le PIC16F84 est un circuit intégré de 18 broches :

Figure A

L’alimentation du circuit est assurée par les pattes VDD et VSS. Elles permettent à l’ensemble
des composants électroniques du PIC de fonctionner. Pour cela, on relie VSS (patte 5) à la masse
(0 Volt) et VDD (patte 14) à la borne positive de l’alimentation qui doit délivrer une tension
continue comprise entre 3 et 6 Volts.
Le microcontrôleur est un système qui exécute des instructions les unes après les autres à une
vitesse (fréquence) qui est fixée par une horloge interne au circuit. Cette horloge doit être
stabilisée de manière externe au moyen d’un cristal de quartz connecté aux pattes OSC1/CLKIN
(patte 16) et OSC2/CLKOUT (patte 15).
La patte 4 est appelée MCLR. Elle permet lorsque la tension appliquée est égale à 0V de
réinitialiser le microcontrôleur. C’est à dire que si un niveau bas (0 Volt) est appliqué sur MCLR le
microcontrôleur s’arrête, place tout ses registres dans un état connu et se redirige vers le début
de la mémoire de programme pour recommencer le programme au début (adresse dans la
mémoire de programme : 0000).
A la mise sous tension, la patte MCLR étant à zéro, le programme démarre donc à l’adresse 0000,
(MCLR=Master Clear Reset).
Les broches RB0 à RB7 et RA0 à RA4 sont les lignes d’entrées/sorties numériques. Elles sont au
nombre de 13 et peuvent être configurées en entrée ou en sortie. Ce sont elles qui permettent
au microcontrôleur de dialoguer avec le monde extérieur (périphériques). L’ensemble des lignes
RB0 à RB7 forme le port B et les lignes RA0 à RA4 forment le port A. Certaines de ces broches ont
aussi d’autres fonctions (interruption, timer).

 Principe de cadencement d'horloge


Pour qu'un microcontrôleur fonctionne correctement, il est nécessaire d'utiliser un signal d'horloge
dont le rôle est de cadencer tous les échanges soit en interne (de registre à registre par exemple),
soit vers l'extérieur (registre vers un port d'Entrées-Sorties).
Sur le PIC 16F84, nous pouvons réaliser les tops d'horloge soit avec un quartz (figure B), ce sera le cas
dans la majorité des montages, ou bien nous pourrons réaliser l'horloge avec un condensateur et une
résistance, ou bien encore avec une horloge extérieure provenant d'un autre circuit par exemple
(figure D).

Horloge à quartz

5
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Figure B
Horloge à Circuit RC

Figure C

Horloge extérieure

Figure D

Il y a trois games de fréquence d'horloge reconnues par le PIC.


Le premier type est nommé "LP" (Fmax=200kHZ) pour low Power et qui est utilisable avec des
fréquences de quartz allant de 32 kHz à 200 kHz, dans cette gamme de fréquence la consommation
varie autour de quelques dizaines de microampères.
Le deuxième type est nommé "XT" (Fmax=4MHZ) pour XTal et qui est le plus utilisé, celui-ci est réalisé
avec un quartz. Les fréquences d'oscillation sont comprises entre 100 kHz et 4 MHz. La
consommation est d'environ 5mA.
Le troisième type est nommé "HS" (Fmax=20MHZ) pour High Speed et qui concerne les montages
équipés d'un quartz ayant une fréquence comprise entre 4 MHz et 10 MHz. La consommation est
d'environ 10mA
Pour simplifier, si vous réalisez votre horloge avec un circuit RC, il faudra positionner lors de la
programmation du PIC le choix de la configuration, cela se fera dans une variable nommée
"_CONFIG", dans celle-ci, nous inscrirons le type d'oscillateur choisit (ici se sera "RC"), dans le
deuxième cas, si vous utilisez un quartz allant jusqu'à 200 kHz, il faudra mettre dans la variable
_CONFIG le type "LP". Dans le troisième cas, si vous utilisez un quartz allant jusqu'à 4 MHz (le plus
courant), il faudra mettre dans la variable _CONFIG le type "XT". Dans le quatrième cas, si vous
utilisez un quartz 10 MHz par exemple ( l'indication sur le pic permet de savoir la fréquence max de
fonctionnement ; sur un PIC 16F84 /04 ce sera 4 MHz) , il faudra mettre dans la variable _CONFIG le
type "HS".
Exemple de déclaration avec un quartz de 4MHz.
_CONFIG XT_OSC

6
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Le PIC 16F84 possède en interne un dispositif de reset automatique qui s'enclenche à la mise sous
tension, il suffit uniquement de relier la broche MCLR/ au +5V. Si vous souhaitez par contre pouvoir
reseter à tout moment votre PIC, il sera nécessaire de réaliser un schéma tel que présenté la figure :

Figure E
Configuration du registre TRIS
Lorsque vous allez utiliser un PIC et créer un programme, il sera nécessaire de configurer les ports A
et B selon le projet que vous allez réaliser.
Deux registres internes spécifiques de huit bits nommés TRISA pour la configuration du port A et
TRISB pour la configuration du port B vont vous permettre de définir le sens de chacune des treize
lignes d'Entrées-Sorties.
Lorsque vous voulez configurer une ligne en entrée le bit correspondant du registre TRIS doit être à la
valeur binaire "1" et la valeur "0" dans le cas d'une sortie.

Prenons de suite un exemple


Nous devons réaliser un projet nécessitant treize entrées-sorties à l'aide d'un PIC 16F84, nous avons
à notre disposition les données suivantes :
PORT A :
Broche RA0 : interrupteur de mise en service
Broche RA1 : sortie sur un buzzer
Broche RA2 : sortie sur une led de signalisation
Broche RA3 : sortie sur un buzzer
Broche RA4 : sortie sur une led de signalisation
PORT B :
Broche RB0 : sortie sur une led de signalisation
Broche RB1 : sortie sur une led de signalisation
Broche RB2 : sortie sur une led de signalisation
Broche RB3 : capteur de fin de course
Broche RB4 : entrée de validation
Broche RB5 : sortie sur une led de signalisation
Broche RB6 : interrupteur d'arrêt d'urgence
Broche RB7 : sortie sur une led de signalisation

Après une rapide analyse, on s'aperçoit que sur le port A, il faudra configurer RA0 en entrée et RA1
RA2 RA3 et RA4 en sortie. Cela signifie que le registre TRISA devra être configuré comme suit :

Registre TRISA

Nous allons voir prochainement les instructions du PIC 16F84 et nous aborderons à cette occasion le
langage assembleur. A titre d'exemple, voici ce que donnerait le chargement du registre TRISA avec
la valeur 0000 0001 correspondant à l'exemple précèdent.

Dans l'exemple, on considérera que les registres utilisés (TRISA et TRISB) sont préalablement
déclarés.

7
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Syntaxe :
Ici, on charge le registre de travail W avec 0000 0001
MOVLW b'00000001'
Puis on transfère le contenu du registre de travail W vers le registre TRISA
MOVWF TRISA
Voilà, il faut deux instructions pour configurer le registre TRISA, une fois que celui-ci est chargé avec
la valeur adéquate les broches sont configurées soit en entrée soit en sortie.
Pour le port B et selon l'énoncé de l'exemple, on retrouve :

Registre TRISB

Syntaxe :
Ici, on charge le registre de travail W avec 0101 1000
MOVLW b'01011000'
Puis on transfère le contenu du registre de travail W vers le registre TRISB
MOVWF TRISB

Il suffit ensuite d’écrire le programme en langage assembleur ou en C sur un ordinateur grâce au


logiciel MPLAB de MICROCHIP (logiciel gratuit) puis de le compiler pour le transformer en langage
machine et le transférer dans le PIC grâce à un programmateur. Lors de la mise sous tension, tous les
registres spécifiques sont placés dans un état déterminé. Ceci est illustré sur la figure suivante :

8
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

2.6 Architecture interne simplifiée du PIC 16 F 84


La structure interne du PIC16F84 est donnée sur la figure 6 : (structure HARVARD : la mémoire de
programme et la mémoire de données sont séparées contrairement à l'architecture Van Neuman qui
caractérise d'autres fabricants de microcontrôleurs).
 Architecture Van Neuman : Le programme et les données sont stockés dans une même
mémoire. Cette architecture utilise un seul bus pour transmettre les instructions
(programme) et les données. Cette architecture ne permet pas de lire les instructions
pendant la lecture ou l’écriture des données.
 Architecture Harvard
Cette architecture possède deux mémoires différentes : Une pour le programme et l’autre
pour les données. Elle utilise deux bus différents (séparés) : un bus pour les instructions et un

9
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

autre pour les données. Cette architecture nous permet de lire les instructions pendant la
lecture ou l’écriture des données. Elle est plus rapide.

Figure 6

1 - Mémoire programme
2 - Registre compteur de programme
3 - Port A et Port B d’entrées - sorties
4 - Unité Arithmétique et logique
5 - RAM
6 - E²PROM
7 - Horloge système
8 - Registre de décodage des instructions
9 - Registre d’état
10 - Registre de travail
11 - Registre d’instruction

10
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

12 - Timer
13 - Pointeur de pile
14 - Bus internes
15 - Reset ; Watch dog ; Alimentation

 Principe de fonctionnement du PIC


Un microcontrôleur exécute des instructions. On définit « le cycle instruction » comme le temps
nécessaire à l’exécution d’une instruction. Attention de ne pas confondre cette notion avec le cycle
d’horloge qui correspond au temps nécessaire à l’exécution d’une opération élémentaire (soit un
coup d'horloge).
Une instruction est exécutée en deux phases :
 la phase de recherche du code binaire de l’instruction stocké dans la mémoire de
programme
 la phase d’exécution ou le code de l’instruction est interprété par le processeur et
exécuté.
Chaque phase dure 4 cycles d’horloge comme le montre la figure 7 :

figure 7

On pourrait donc croire qu’un cycle instruction dure 8 cycles d’horloge mais l’architecture
particulière du PIC lui permet de réduire ce temps par deux. En effet, comme les instructions issues
de la mémoire de programme circulent sur un bus différent de celui sur lequel circulent les données,
le processeur peut effectuer la phase de recherche d’une instruction pendant qu’il exécute
l’instruction précédente (Voir figure 7 et 8).

figure 8
L’horloge fournie au PIC® est prédivisée par 4 au niveau de celle-ci. C’est cette base de temps qui
donne la durée d’un cycle. Si on utilise par exemple un quartz de 4MHz, on obtient donc 1000000 de
cycles/seconde, or, comme le PIC® exécute pratiquement 1 instruction par cycle, hormis les sauts,
cela vous donne une puissance de l’ordre de 1MIPS (1 Million d’Instructions Par Seconde).

11
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Figure 9.
Le cycle d’activité :
Q1 Q2 Q3 Q4
Decode Read register f Process data Write to destination

 La mémoire de programme :
Sur le PIC présenté (16F84), on retrouve une mémoire de type flash EPROM ayant une capacité de
1024 instructions (rep: 1). Le constructeur donne environ 1000 cycles d'effacement et d'écriture pour
cette mémoire, ce qui nous laisse une marge assez confortable pour mettre au point un programme.
Chaque instruction est codée sur 14 bits cela signifie que la mémoire programme du PIC 16F84 à une
capacité de 1024x14 bits.
C'est dans cette mémoire que sera stocké votre programme (compilé) qui correspondra aux
instructions que devra effectuer le microcontrôleur. Les 1024 (1k) instructions possibles semblent un
peu dérisoires face aux "méga-octets" d'aujourd'hui, mais nous verrons par la suite que cela suffit
largement pour une application "grand public", il ne faut pas oublier également que, dans chaque
case mémoire, on peut stocker 14 bits, ce qui permet d'utiliser des instructions plus "puissantes" que
dans une mémoire traditionnelle 8 bits.

Largeur d'une case mémoire

Figure 10

Organisation de la mémoire de programme

Figure 11
Le processeur peut alors sélectionner l'emplacement souhaité grâce au bus d’adresse et il peut lire
son contenu (ici l’instruction) grâce à son bus d’instruction (voir figure 12). Cet adressage s’effectue à
l’aide d’un compteur ordinal appelé PC qui, lors de la mise sous tension, démarre à zéro puis
s’incrémente de 1 tous les quatre coups d’horloge, on exécute bien ainsi les instructions les unes à la
suite des autres.

12
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

 Mais il arrive que, dans un programme, on fasse appel à un sous programme dont l’adresse de
l’instruction ne se trouve pas juste après celle qui est en train d’être exécutée. C’est le rôle de la pile
qui sert à emmagasiner de manière temporaire l’adresse d’une instruction. Elle est automatiquement
utilisée chaque fois que l’on appelle un sous programme et elle permet une fois que l’exécution du
sous programme est terminée de retourner dans le programme principal juste après l’endroit où l’on
a appelé le sous programme. On constate que cette pile possède huit niveaux, cela signifie qu’il n’est
pas possible d’imbriquer plus de huit sous programmes, car au-delà de huit, le processeur ne sera
plus capable de retourner à l’adresse de base du programme principal.
 L’adresse 0000 est réservée au vecteur RESET, cela signifie que c’est à cette position que l’on
accède chaque fois qu’il se produit une réinitialisation (0 volts sur la patte MCLR). C’est pour cette
raison que le programme de fonctionnement du microcontrôleur doit toujours démarrer à cette
adresse.
 L’adresse 0004 est assignée au vecteur d’interruption et fonctionne de manière similaire à celle du
vecteur de Reset. Quand une interruption est produite et validée, le compteur ordinal PC se charge
avec 0004 et l’instruction stockée à cet emplacement est exécutée.

 Le compteur de programme (CP ou PC en anglais pour Programm Counter)


Nous venons de voir que la mémoire programme contient les codes binaires du programme que nous
avons définis. Nous avions également vu, précédemment, que le microcontrôleur exécute une à une
les instructions stockées dans la mémoire.
Un registre interne nommé "compteur de programme" (rep : 2) va être chargé de pointer
(sélectionner) chaque case mémoire une à une, afin que le microcontrôleur puisse exécuter
l'instruction correspondante au code binaire stocké dans la case mémoire concernée. Le contenu du
registre du pointeur de programme augmentera au grès de l’exécution des instructions, le PC pointe
toujours la prochaine instruction à exécuter. Dès que le microcontrôleur est alimenté, le contenu du
registre compteur de programme est remis à zéro ce qui fait que la case mémoire située à l'adresse 0
va être pointée la première (vecteur RESET).

Figure 12

Le compteur de programme possède une largeur 13 bits, il peut donc adresser une mémoire de 8 k :
(213 = 210 x 23 soit 1k x 8 = 8 k).
Le compteur de programme s'est incrémenté alors que l’exécution de l’instruction précédente est en
cours.
2.6.1 Cheminement d'une instruction
 Le registre de contrôle et décodage des instructions
Le programme binaire correspondant à votre source est maintenant dans la mémoire programme du
microcontrôleur PIC, le compteur de programme pointe l’instruction à exécuter, cette instruction est
analysée par un registre de contrôle et de décodage des instructions véritable analyseur logique, qui
est chargé de définir ce que le microcontrôleur devra effectuer comme opération. Le contrôleur et le
décodeur d’instruction définissent la stratégie des actions à accomplir en interne pour effectuer
l’instruction demandée.
 L'unité arithmétique et logique

13
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

L'unité arithmétique et logique est considérée souvent comme étant le cœur de l'unité centrale (UC).
En effet, c'est elle qui va être chargée d'effectuer toutes les opérations de type arithmétique
(addition, soustraction etc.) ou bien de type logique (rotation, décalage, complément etc.).
Selon l’opération à effectuer, le contrôleur et décodeur d’instruction enverra les signaux nécessaires
à l'unité arithmétique et logique pour pouvoir accomplir l'opération demandée.
Exemple : Nous voulons soustraire deux nombres, comment l’unité centrale doit-elle procéder ?
- Dans un premier temps : la première valeur à soustraire va être stockée dans le registre de travail
W, remarquez que le registre de travail est relié sur une des entrées de l’unité Arithmétique et
Logique.
- Puis la deuxième valeur à soustraire est dirigée vers une autre entrée de l'unité Arithmétique et
Logique. Ensuite un code indiquant qu’une soustraction doit être effectuée est envoyé vers l'unité
Arithmétique et Logique qui exécute cette instruction.
- Le résultat de la soustraction est stockée dans le registre de travail, qui lui-même, est relié au bus
de donnée interne, cela veut dire que le résultat peut être transféré en interne vers n’importe quel
registre.

Figure 13

 Le registre de travail (registre W rep: 10)


L’unité Arithmétique et Logique est en étroite relation avec un registre nommé W (work register),
c'est un registre de travail qui correspond aux anciens "accumulateurs" sur les microprocesseurs et
par lequel vont transiter un bon nombre d'informations que ce soit une donnée à traitée (pour
réaliser par exemple une addition, une soustraction etc.) ou bien pour stocker le résultat d'une
opération ou d'un traitement. Nous verrons, par la suite, lorsque nous réaliserons des programmes
que ce registre est très important. En effet, l’accès à certain registre du PIC ne peut se faire
directement, nous sommes obligés de "passer" la valeur à lire ou à écrire par ce fameux registre de
travail. Le fait que le registre de travail soit relié au bus de données interne permet à celui-ci d’être
en relation avec le reste de l’architecture du PIC (RAM, E²PROM, TIMER, PORTS A et B, etc.).

Figure 14

 Le pointeur de pile
Le pointeur de pile (rep :13) ou SP en anglais (stack pointeur) est un registre pouvant mémoriser
huit adresses différentes, on dit que le pointeur de pile est à huit niveaux .
Le rôle du pointeur de pile consiste à mémoriser l’adresse courante lorsque le programme
principal est dérouté vers un sous-programme. En effet, lors d'un saut vers un sous-programme,
le compteur de programme se charge avec l’adresse de celui-ci. Lorsque le sous-programme se
termine, le compteur de programme doit repointer alors la case mémoire suivant l’instruction de

14
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

saut (figure 15) pour pouvoir reprendre le programme principal ou celui-ci a été dérouté, le
pointeur de pile va alors rechercher automatiquement l’adresse qu’il a mémorisé et il "recharge
"le compteur de programme avec cette adresse. Le pointeur de pile sera sollicité dès que, dans
un programme, il y aura un sous-programme. Comme nous le verrons par la suite lors d’un
programme fonctionnant avec une interruption le pointeur de pile aura le même rôle de
sauvegarde de l’adresse courante.
Les huit niveaux du pointeur de pile veulent signifier que l'on peut imbriquer huit sous-
programmes.
Il est à noter que le pointeur de pile est autonome, c'est-à-dire, qu'il gère tout seul la
mémorisation et la restitution d'une adresse.

Figure 15

Qu’est-ce qu’un sous-programme ?


Un sous-programme est une suite d'instructions correspondant à une fonction bien définie à
laquelle votre programme principal fera appel plusieurs fois. En simplifiant le fait d’écrire un ou
plusieurs sous-programmes vous évitera d’écrire plusieurs fois la même chose, d'où une
économie de place en mémoire programme et bien sur une économie de temps.
Prenons un exemple :
Nous devons réaliser un feu tricolore en ayant des temps d'allumage et d'extinction identiques
pour chaque lampe, par exemple 3 secondes, la première façon de procéder est la suivante :

 allumage lampe rouge et extinction des autres lampes


 temporisation 3 s
 allumage lampe verte et extinction des autres lampes
 temporisation 3 s
 allumage lampe orange et extinction des autres lampes
 temporisation 3 s
 retour à la première instruction

On voit bien dans cette première façon de réaliser le programme, on a écrit trois fois les instructions
définissant la temporisation de 3 secondes, ce qui représente en langage assembleur 3 fois 10
instructions soit 30 instructions. La deuxième façon de traiter le problème est de définir un sous-
programme de temporisation à qui l'on fera appel autant de fois que nécessaire, ce qui revient à dire
que l’on va écrire une seul fois la temporisation de 3 s.
 allumage lampe rouge et extinction des autres lampes
 appel du sous-programme de temporisation 3 s (1 instruction)
 allumage lampe verte et extinction des autres lampes
 appel du sous-programme de temporisation 3 s (1 instruction)
 allumage lampe orange et extinction des autres lampes
 appel du sous-programme de temporisation 3 s (1 instruction)

15
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

 retour à la première instruction

Sous programme de temporisation


 temporisation 3 s
 retour de sous-programme
Dans ce deuxième exemple, on voit bien que cette fois-ci, nous avons écrit qu'une seule fois la
temporisation en créant un sous-programme.

 La mémoire RAM
Lorsque vous allez créer un programme, vous allez pouvoir faire appel à des données qui seront
stockées temporairement. La mémoire RAM interne du PIC16F84 vous met à disposition 68 octets
banalisés vous permettant, à votre grès, de sauvegarder ou de rapatrier une information.

Organisation de la mémoire RAM


La mémoire RAM est organisée en 128 octets ayant chacun une fonction bien définie (figure 16).
Nous avons vu précédemment que, pour l’utilisateur, 68 octets sont réservés.
Les 11 premiers octets de l'espace mémoire sont réservés pour la configuration et l'accès à certains
registres spécifiques comme par exemple les ports d'entrées-sorties A et B, le registre STATUS etc.
De l'adresse 11 à l'adresse 79, nous retrouvons les 68 octets réservés à L’utilisateur.

En fait la mémoire RAM est scindée en 2 parties appelées bank0 et bank1. Ces deux parties sont
accessibles par la même adresse, la sélection de tel ou tel bank se fait selon la position (0 ou 1) de
deux bits de contrôle, contenus dans le registre STATUS qui est situé à l'adresse 3 en mémoire RAM.
Ces deux bits de contrôle se nomment RP0 et RP1.
Si RP1 = 0 et RP0 = 0, alors on accède à la mémoire située en bank0
Si RP1 = 0 et RP0 = 1, alors on accède à la mémoire située en bank1
Lorsque nous allons commencer les cours de programmation, nous devrons accéder à différents
registres situés dans chacune des deux zones mémoire.
La zone située en bank1 entre l’adresse 140 et 208 est une image de la bank0, de plus certains
registres tels que le registre STATUS sont accessibles depuis n'importe quel bank (bank0 ou bank1).

La RAM de données proprement dite se réduit donc à la zone notée GPR (Registre à usage générale )
qui s’étend de l’adresse 0Ch ( 12 en décimale ) jusqu’à 4Fh ( 79 en décimale ) soit au total 68
registres en page 0 et autant en page 1. Cependant, on constate que les données écrites en page 1
sont redirigées en page 0, cela signifie qu’au final, l’utilisateur ne dispose uniquement que de 68
registres (donc 68 octets de mémoire vive) dans lesquels il peut écrire et lire à volonté, en sachant
qu’à la mise hors tension, ces données seront perdues.

16
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Figure 16

 Les registres
Nous avons, précédemment, souligné que la mémoire de données RAM contenait des registres
spécifiques qui permettent de configurer le PIC, nous allons les détailler un par un et voir comment
on peut accéder à la page 0 ou la page 1. Afin de faciliter la compréhension, les registres les plus
utilisés sont encadrés.

adresse 00 et 80, INDF : Cette adresse ne contient pas de registre physique. Si vous tentez de le
lire, vous y trouverez 00 et si vous tentez d’y écrire, cela produira un NOP, c'est-à-dire une instruction
« qui ne fait rien ». Elle sert uniquement à l’utilisation de l’adressage indirect de la façon suivante :
ADDWF INDF.W : Cela signifie que l’on va ajouter au contenu du registre W le registre pointé par le
registre FSR d’adresse 04.

adresse 01 , TMR0 : Contenu du Timer (8 bits). Il peut être incrémenté par l’horloge (fosc/4) c'est à
dire tous les 4 coups d'horloge ou par la broche RA4.

adresse 02 et 82 , PCL : Le compteur PC comporte 13 bits. Il est artificiellement en 3 registres


distincts :
 Le registre PCL (program counter low) qui correspond aux 8 bits de poids faibles et qui est
toujours accessible directement.
 Le registre PCH (program counter high) qui correspond aux 5 bits de poids forts et qui n’est
jamais accessible directement.
 Le registre PCLATH (program counter latch high) qui est l’intermédiaire obligé permettant
d’accéder aux 5 bits de poids forts du PC contenus dans PCH.
Les bits 3 et 4 du registre PCLATH peuvent être considérés comme constituant les numéros de pages
de la mémoire de programme :
Bit 3 Bit4 page adresses
0 0 0 00h à 7FFh (2k)
0 1 1 800h à FFFh (4k)
1 0 2 1000h à 17FFh (6k)
1 1 3 1800h à 1FFFh (8k)

17
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Registres PCL et PCLATH


On a déjà vue que le PC (program Counter) contient l'adresse de la prochaine instruction que doit
exécuter le programme. Cette adresse est codée sur 13 bits,
Le registre PCL contient l'adresse de poids faible (8 bits) du PC, il est situé à l'adresse 0x02 (banque 0)
de la mémoire des données. Ce registre est également accessible en banque 1 (à l'adresse 0x82).
Le registre spécial PCLATH contient l'adresse de poids fort (5 bits) du PC, il est situé à l'adresse 0x0A
(banque 0) de la mémoire des données. Ce registre est également accessible en banque 1 (à l'adresse
0x8A).

Exemple 1 :
(PCL) = B'10110011'
(PCLATH) =B'---00010' (les bits 5 à 7 ne sont pas utilisés par le PIC 16F84A)
(PC) = B'0001010110011' (adresse 0x2B3 en numération hexadécimale).
La prochaine instruction que va exécuter le PIC est donc située à l'adresse 0x2B3 de la
mémoire de programme.
Exemple 2 : on peut manipuler le contenu des registres PCL et PCLATH.
MOVLW 0x02 ; W = 0x02
MOVWF PCLATH ; (PCLATH) = 0x02
MOVLW 0xB3 ; W = 0xB3
MOVWF PCL ; (PCL) = 0xB3
Faut sauter le programme à l'adresse 0x2B3 (après l'exécution de l'instruction MOVWF
PCL). On a ainsi fait un GOTO "programmé" (goto 0x2B3)

Lors d’une simple opération d’écriture dans PCL, le contenu réel du PC est obtenu en faisant
procéder le contenu de PCL par les 5 premiers bits (bits 0 à 4) de PCLATH.

adresse 03 et 83 , STATUS : Registre d’état .


Les cinq bits de poids faible de ce registre sont en lecture seule, ce sont des témoins (drapeaux ou
flag en anglais) caractérisant le résultat de l’opération réalisée par l’UAL. Le bit RP0 est lui en lecture
/écriture et c’est lui qui permet de sélectionner la page dans la mémoire RAM.
Si RP0=0, on accède à la page 0 et si RP0=1, on accède à la page 1.

 Bit C (carry) : Ce bit du registre d'état va passer à "1" lorsque le résultat de la dernière
opération arithmétique à provoqué une retenue.
 Bit DC (digit carry) : Ce bit du registre d'état va passer à "1" lorsque le résultat de la dernière
opération arithmétique a provoqué une retenue sur les quatre premiers bits, ce bit (ou bien
flag ... pour drapeau) sera utilisé lorsque l'on travaillera en BCD (binaire codé décimal).
 Bit Z (zéro): Ce bit du registre d'état va passer à "1" lorsque le résultat de la dernière
opération est égal à zéro. Dans l’exemple de la temporisation précédente on utilise ce bit
zéro.
 Bit PD/ (power down) : Ce bit du registre d’état va passer à "0" lorsque le microcontrôleur
rencontre l’instruction particulière "Sleep" (mise en sommeil) qui détermine le mode de mise
en veille PIC en bloquant les impulsions d’horloge nécessaires au cadencement de tous les
échanges, le PIC attend alors un événement pour "repartir".
 Bit TO/ (time out) : Ce bit du registre d'état va passer à "0" lorsque le chien de garde interne
(nous reviendrons ultérieurement sur son fonctionnement) à atteint la fin de comptage que
le programmeur a défini. Le chien de garde (ou watchdog) peut être désactivé, il ne servira
que lorsque nous voudrons savoir si le programme se déroule correctement.

18
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

 RP0 et RP1 sont deux bits qui permettent d’accéder à deux zones mémoire RAM différentes
(bank0 et bank1).
 Ce bit sert lui aussi à sélectionner les bits de la mémoire de données mais en mode
d’adressage indirect.
La pagination de la mémoire de données en adresse direct en fonction des bits RP0 et RP1 du registre
STATUS :
RP0 RP1 Page Adresse
0 0 0 00 à 7F
0 1 1 80 à FF
1 0 2 100 à 17F
1 1 3 180 à 1FF

adresse 04 et 84 , FSR : Registre de sélection de registre : contient l’adresse d’un autre registre
(adressage indirect)

adresse 05 , PORTA : Ce registre contient l’état des lignes du port A ( voir chapitre sur les ports ).
Il s'agit d'un registre spécial situé à l'adresse H'05' (banque 0) de la mémoire des données (Data
RAM). Ce registre donne un accès en lecture ou en écriture aux 5 bits du port A.
Si ce bit est mis à 1 a la sortie du port A on aura 5Volt
Si ce bit est mis à 0 a la sortie du port A on aura 0Volt.
Exemples : PORTA en écriture
BCF STATUS, RP0 ; passage en banque 0)
CLRF PORTA ; mise à 0 de toutes les sorties du port
BSF PORTA, 2 ; mise à 1 de la sortie RA2, 5V sur RA2

adresse 06 , PORTB : Ce registre contient l’état des lignes du port B ( voir chapitre sur les ports ).
Il s'agit d'un registre spécial situé à l'adresse H'06' (banque 0) de la mémoire des données (Data
RAM). Ce registre donne un accès en lecture ou en écriture aux 8 bits du port B.
Si ce bit est mis à 1, à la sortie du port A on aura 5Volt, niveau logique 1
Si ce bit est mis à 0, à la sortie du port A on aura 0Volt, niveau logique 0

Exemples : PORTB en écriture :


BCF STATUS, RP0 ; passage en banque 0 (inutile si l'on est déjà en banque 0)
CLRF PORTB ; mise à 0 de toutes les sorties du port B.
BSF PORTB, 6 ; mise à 1 de la sortie RB6, 5V en sortie.

adresse 08 , EEDATA : Contient un octet (donnée) lu ou à écrire dans l’EEPROM de données.


adresse 09 , EEADR : Contient l’adresse de la donnée lue ou écrite dans l’EEPROM de données.

adresse 0B et 8B , INTCON :
Contrôle des 4 interruptions sont :
 Entrée d’interruption externe via la patte RB/INT (changement d’état)
 Débordement du TIMER0 (débordement)
 Changement d’état de RB4 à RB7
 Ecriture dans la mémoire EEPROM

GIE EEIE T0IE INTE RBIE T0IF INTF RBIF


Masques :
GIE : (Global Interrupt Enable) : masque global d’inter.
EEIE : (EEProm Interrupt Enable) autorise l'interruption venant de l'EEPROM.

19
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

T0IE : (Timer 0 Interrupt Enable) autorise l'interruption provoquée par le débordement du TIMER0
INTE: ( Interrupt Enable) autorise l’interruption provoquée par un changement d'état sur broche
RB0/INT
RBIE: (RB Interrupt Enable) autorise les interruptions provoquées par un changement d'états sur
l'une des broches RB4 à RB7.
Si ces bits sont mis à 1, ils autorisent les interruptions pour lesquels ils sont dédiés.
Drapeaux :
T0IF : (Timer 0 Interrupt Flag) débordement du timer
INTF ( Interrupt Flag) interruption provoquée par la broche RB0/INT
RBIF ( RB Interrupt Flag) interruption provoquée par les broches RB4-RB7.

adresse 81 , OPTION
8 bits (tous à 1 au RESET) affectant le comportement des E/S et des timers.

RBPU/ INTEDG RTS RTE PSA PS2 PS1 PS0

RBPU/ (RB Pull Up) Résistances de tirage à V dd des entrées du port B (voir le détail du
fonctionnement au chapitre port). Si RBPU/=0, les résistances de pull-up sont connectées en interne
sur l'ensemble du port B.
INTEDG (Interrupt Edge) sélection du front actif de l’interruption sur RB0/INT (1 pour front montant
et 0 pour front descendant).
RTS (Real Timer Source) sélection du signal alimentant le timer0 : 0 pour horloge interne, 1 pour
RA4/T0CLK
RTE (Real Timer Edge) sélection du front actif du signal timer ( 0 pour front montant).
PSA (Prescaler assignment) 0 pour Timer0 et 1 pour chien de garde WDT.
PS2..0 (Prescaler 210) sélection de la valeur du diviseur de fréquence pour les timers.

Le taux de division du pré diviseur du TIMER0 ou de chien de garde en fonction des bits PS0, PS1 et
PS2 :
PS2 PS1 PS0 Timer0 Chien de garde
0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128

adresse 85 , TRISA . Direction des données pour le port A : 0 pour sortir et 1 pour entrer (voir
chapitre sur les ports).
adresse 86 , TRISB . Direction des données pour le port B : 0 pour sortir et 1 pour entrer (voir
chapitre sur les ports).
adresse 88 , EECON1 Contrôle le comportement de l’EEPROM de données.

EEIF WRERR WREN WR RD

EEIF (EEProm Interrupt Flag) passe à 1 quand l’écriture est terminée.


WRERR (Write Error) 1 si erreur d’écriture.
WREN (Write Enable) : 0 pour interdire l’écriture en EEPROM de données.

20
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

WR (Write) 1 pour écrire une donnée. Bit remis automatiquement à 0


RD (Read) : 1 pour lire une donnée. Bit remis automatiquement à 0
adresse 89 , EECON2 . Registre de sécurité d’écriture en EEPROM de données.
Une donnée ne peut être écrite qu’après avoir écrit successivement 0x55 et 0xAA dans ce registre.

Exemple : lecture de l'emplacement mémoire EEPROM situé à l'adresse 0x10

BCF STATUS , RP0 ; passage en banque 0


MOVLW 0x10
MOVWF EEADR ; 0x10 est l'adresse de l'emplacement mémoire
BSF STATUS , RP0 ; passage en banque 1
BSF EECON1 , RD ; lecture de l'EEPROM

BCF STATUS , RP0 ; passage en banque 0

MOVF EEDATA, W ; la valeur lue dans l'EEPROM est placée dans


l'accumulateur W

 Exemple
A chaque fois que l’on devra faire un test au cours d’un programme, nous allons utiliser, sans le
savoir, un registre interne appelé registre d’état qui est en relation avec le résultat de la dernière
opération demandée au microcontrôleur PIC. C’est un registre qui contient 8 bits ayant chacun un
rôle bien particulier.
Exemple d'un test au cours d'un programme :
Nous avons réalisé une temporisation et nous devons tester si celle-ci est terminée pour passer à la
suite du programme. Comment le microcontrôleur va-t-il gérer ce programme ?
- Pour réaliser une temporisation, nous allons "charger une valeur dans un registre du PIC, puis nous
allons décrémenter cette valeur jusqu'à atteindre la valeur 0 ce qui définira la fin de notre
temporisation. Pour pouvoir dire que le registre que nous avons utilisé est bien à 0, nous allons
utiliser une instruction de test qui va nous avertir quand le contenu du registre sera égal à 0. Cette
instruction de test contrôle l'état d'un bit du registre d'état, le bit Z (comme zéro) qui passera à 1
lorsque le résultat de la dernière opération effectuée vaudra 0 (Figure 14).
 Chronogramme de la temporisation

Figure 17
 Les Ports d’entrées – sorties (rep :3)
Le PIC16F84 est équipé de 13 lignes d’entrées/sorties, réparties en deux ports :
-le port A : RA0 à RA4
-le port B : RB0 à RB7
Chaque ligne peut être configurée soit en entrée, soit en sortie, et ceci indépendamment l’une de
l’autre. Pour cela, on utilise les registres TRISA et TRISB. Le bit de poids faible (b0) du registre TRISA

21
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

correspond à la ligne RA0, le bit b1 de TRISA correspond à RA1 et ainsi de suite. Il en est de même
pour le port B et le registre TRISB (b0 de TRISB correspond à RB0  b7 correspond à RB7). Si l’on
veut placer une ligne en sortie il suffit de mettre le bit correspond dans TRISA ou TRISB à 0 (retenez 0
comme Output=sortie). Si l’on veut placer une ligne en entrée, il suffit de placer le bit correspondant
dans TRISA ou TRISB à 1 (retenez 1 comme Input=entrée).
Les bits des deux registres PORTA et PORTB permettent soit de lire l’état d’une ligne, si celle-ci est en
entrée, soit de définir le niveau logique d’une ligne si celle-ci est en sortie.
Lors d’un RESET, toutes les lignes sont configurées en entrées.
particularité du portA : les bits b7 à b5 des registres TRISA et PORTA ne correspondent à rien car il
n’y a que 5 lignes (b0 à b4). RA4 est une ligne à collecteur ouvert, cela veut dire que, configurée en
sortie, cette broche assure 0Volt à l’état bas, mais qu’à l’état haut, il est nécessaire de fixer la valeur
de la tension grâce à une résistance de tirage (pull up en anglais)
particularité du port B: il est possible de connecter de façon interne sur chaque ligne une
résistance de tirage (pull up) dont le rôle consiste à fixer la tension de la patte (configuré en entrée) à
un niveau haut lorsque qu’aucun signal n’est appliqué sur la patte en question. Pour connecter ces
résistances, il suffit de placer le bit RBPU/ du registre OPTION à 0.

Figure 18 : Les ports d’entrées-sorties du PIC 16F84

 La mémoire EEPROM ( Electrically Erasable Programmable Read Only Memory )


La mémoire E²PROM est une particularité du PIC 16F84, c’est une zone comportant 64 octets mise à
la disposition de l’utilisateur et dont la particularité est de pouvoir être sauvegardée même en
absence d’alimentation.
Cette mémoire peut être très utile, par exemple: mémoriser le nombre de passage vers un
programme, mémoriser un code défaut, mémoriser une valeur invariable (ex: π= 3.14), mémoriser
un code d'accès, mémoriser la version d'un programme, etc.
Il est à noter toutefois que les temps pour accéder à cette mémoire sont relativement longs par
rapport à un accès en RAM par exemple.
Un ordre spécifique permet lors du transfert du fichier compilé d'écrire dans la mémoire E²PROM.
Quatre registres spécifiques (EEDATA ; EEADR ; EECON1 et EECON2) permettent les accès à l' E²PROM
que ce soit en lecture ou en écriture. Nous verrons, lors d'une application, la façon de lire et d’écrire
dans cette mémoire un peu particulière.
 Le timer
Un timer est un registre 8 bits dans lequel on charge une valeur. Son fonctionnement est cadencé
soit avec l’horloge interne, soit avec une horloge externe (ou bien des fronts sur une broche
spécifique du PIC).
Dès que le timer est validé, il réalise un comptage depuis la valeur que vous avez prédéterminée
jusqu'à 255, il vous prévient (on le verra par la suite en provoquant une interruption) alors que son
contenu passe de 255 à 0, puis recommence son comptage.
Le pic 16F84 dispose de deux timers, un à usage général (le TMR0) et un autre utilisé pour le chien de
garde ( watch dog WDG ).
Le TMR0 peut remplir deux fonctions:
-Temporisateur ou contrôle du temps. Son entrée d'incrémentation est alors l'horloge qui
correspond au cycle instruction (Fosc/4). Il est possible d'utiliser un pré-diviseur de fréquence.

22
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

-Compteur d'événements. Dans ce cas, les d'impulsions d'entrées du timer sont fournies par la patte
RA4/TOCK1, le choix s'effectue grâce au bit RTS du registre OPTION.
C’est un compteur Ascendant - compteur Programmable, il s’incrémente de 0X00 à 0XFF puis
débordement (interruption).
TMR0

La cadence de l'incrémentation est proportionnelle à la fréquence de l'horloge.


 Le chien de garde
Le chien de garde est un oscillateur interne complètement indépendant du reste des circuits, ayant
pour rôle de relever d’éventuels blocages de l’unité centrale du microcontrôleur et effectue la mise à
zéro pour recommencer l’exécution normale du programme.
C’est un compteur 8 bits incrémenté en permanence (même si le µC est en mode sleep) 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é.
• Si le µC est en mode SLEEP, le WDT time-out provoque un WAKE-UP, 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.
L'horloge du WDT est ajustée pour que Le Time-Out arrive toutes les 18 ms. Il est possible d’assigné
un prescal au WDT pour avoir un temps plus long. Cela se fait en intervenant sur le bit PSA du
registre OPTION (BSF OPTION, PSA), PSA = 1 puis on intervient sur les bits PS2 PS1 PS0 pour obtenir
les différents intervalles de retard (Voir tableau).
 Le mode SLEEP
Le mode SLEEP (Power-down mode) est un état particulier du fonctionnement du PIC 16F84, il est
utilisé pour réduire la consommation du courant qui passera à 2mA environ lorsque le
microcontrôleur n’est pas utilisé.
Toute instruction présente après l’instruction SLEEP ne sera pas exécutée par le microcontrôleur
lequel terminera à ce point son fonctionnement.
Pour réveiller le microcontrôleur de l’état d’inactivité et de base consommation, on peut utiliser ces
techniques :
1) Remise à 0 du microcontrôleur en mettant à zéro la branche MCLR
2) Dépassement du temps (Time out) de la temporisation du watch dog (si valide)
3) Réalisation d’une situation d’interruption (RB0/RB4-RB7/fin d’écriture EEPROM)
Dans les deux premiers cas, le microcontrôleur se remet à zéro et l’exécution reprend à partir de la
position mémoire 0.
Dans le troisième cas, le microcontrôleur reprend comme dans le cas d’exécution d’interruption
normal. Il reprend son programme après l’instruction SLEEP.
Exemple : Pour une horloge 4 MHZ
a) PSA=1 : pas de pré-diviseur (PSA=1)
Signal d’horloge=4/4=1Mhz ou 1μs
(Entre 2 interruptions : 256*1μs=256μs)
b) PSA=0 et pré-diviseur= 4 (PSA=0 PS2 =0 PS1=0 PS0=1)
Signal horloge= 4 MHz / 4 / 4 = 250khz ou 4μs
(Entre 2 interruptions: 256*4μs=1024μs).
c) PSA=0 et pré-diviseur=256 (PSA=0 PS2 =1 PS1=1 PS0=1)
Signal horloge = 1Mhz/256=3906,25 ou 256μs
(Entre 2 interruptions : 256*256μs=65536μs)

23
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

JEU D’INSTRUCTIONS
Afin de comprendre la fonction de chaque instruction, la notation adoptée, pour les données et les
adresses manipulées par les instructions, est fort simple et est la suivante :

-f représente un registre
-b représente un numéro de bit en sachant que 0 correspond toujours au bit de poids faible (
le plus à droite dans le registre )
-k représente une donnée aussi appelée littérale
Un certain nombre d’instructions (ADDWF , ANDWF , etc..) utilise une notation spéciale présentée
sous la forme :

ADDWF f,d Où f indique le registre et où d peut prendre deux valeurs (0 ou 1), ce


qui change le comportement de l’instruction . Si d est à 0, le résultat
est placé dans le registre de travail W, la valeur dans le registre f est
alors inchangée, alors que si d est à 1, le résultat est placé dans le
registre f.

Un autre type d’instruction mérite quelques éclaircissements, ce sont les instructions de


branchement conditionnel. Prenons comme exemple :

BTFSC f,b Qui va vouloir dire ( Bit Test File Skip if Clear ) qui signifie que l’on va
tester le bit b du registre f ( b peut prendre une valeur de 0 à 7 pour
un registre 8 bits ). Il peut alors y avoir deux solutions :

- Soit le bit testé est à 1, donc la condition testée n’est pas


réalisée, le programme continue alors son déroulement
normalement en séquence avec l’instruction juste en dessous.

- Soit le bit testé vaut 0, donc la condition testée est réalisée et


le programme saute l’instruction qui suit le BTFSC dans le
programme.

Cette façon de programmer peut paraître étrange, mais avec de l’habitude, elle s’avère très pratique
et permet de réaliser des programmes compacts et performants.

Les 35 instructions sont donc les suivantes :

ADDLW ( Add Literal to W )

syntaxe : ADDLW k

Opération : W+kW

Bits d’état du registre STATUS affectés : C,DC,Z

On ajoute au registre de travail la valeur k et on place le résultat dans le registre de travail W

durée : 1 cycle instruction (4 cycles d’horloge)

24
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

ADDWF (Add W to F )

syntaxe : ADDWF f,d

Opération : W+ff si d=1 ou W+fW si d=0

Bits d’état du registre STATUS affectés : C,DC,Z

On ajoute le contenu de W et le contenu de f et on place le résultat dans f si d=1 ou dans W si d=0

durée : 1 cycle instruction (4 cycles d’horloge)

ANDLW ( And Literal and W )

syntaxe : ANDLW k

Opération : W ET kW

Bit d’état du registre STATUS affecté : Z

On effectue un ET logique entre le contenu de W et le littéral k, on place le résultat dans W

durée : 1 cycle instruction ( 4 cycles d’horloge )

ANDWF ( And W with F )

syntaxe : ANDWFf,d

Opération : W ET ff si d=1 ou W ET fW si d=0

Bit d’état du registre STATUS affecté : Z

On effectue un ET logique entre le contenu de W et le contenu de f, on place le résultat dans W si


d=0 ou dans f si d=1

durée : 1 cycle instruction (4 cycles d’horloge)

BCF ( Bit Clear F )

syntaxe : BCF f,b

Opération : 0b(f)

Bits d’état du registre STATUS affectés : aucun

On met à 0 le bit b du registre f

durée : 1 cycle instruction ( 4 cycles d’horloge )

BSF ( Bit Set F )

syntaxe : BSF f,b

Opération : 1b(f)

25
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Bits d’état du registre STATUS affectés : aucun

On met à 1 le bit b du registre f

durée : 1 cycle instruction (4 cycles d’horloge)

BTFSC ( Bit Test , Skip if Clear )

syntaxe : BTFSC f,b

Opération : saut de l’instruction qui suit si b(f)=0

Bits d’état du registre STATUS affectés : aucun

Si le bit b de f est nul, l’instruction qui suit celle-ci est ignorée et traitée comme un NOP. Dans ce cas
et dans ce cas seulement, l’instruction BTFSC demande deux cycles pour s’exécuter.

durée : 1 cycle instruction (4 cycles d’horloge) ou 2 cycles

BTFSS ( Bit Test , Skip if Set )

syntaxe : BTFSS f,b

Opération : saut de l’instruction qui suit si b(f)=1

Bits d’état du registre STATUS affectés : aucun

Si le bit b de f est à 1, l’instruction qui suit celle-ci est ignorée et traitée comme un NOP. Dans ce cas
et dans ce cas seulement, l’instruction BTFSS demande deux cycles pour s’exécuter.

durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles

CALL (subroutine Call)

syntaxe : CALL label

Bits d’état du registre STATUS affectés : aucun

On sauvegarde l’adresse de retour dans la pile puis, on appelle le sous programme définit avec
l’étiquette label.

durée : 2 cycles instruction ( 8 cycles d’horloge )

CLRF ( Clear F )

syntaxe : CLRF f

Opération : 0F

Bit d’état du registre STATUS affecté : Z

On met le contenu du registre f à 0 et on positionne Z

durée : 1 cycle instruction (4 cycles d’horloge)

26
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

CLRW ( Clear W )

syntaxe : CLRW

Opération : 0W

Bit d’état du registre STATUS affecté : Z

On met le contenu du registre W à 0 et on positionne Z

durée : 1 cycle instruction (4 cycles d’horloge)

CLRWDT ( Clear WatchDog Timer )

syntaxe : CLRWDT

Opération : 0WDT et 0pré diviseur du Timer

On met le contenu du registre du timer chien de garde à 0 ainsi que le pré diviseur

durée : 1 cycle instruction (4 cycles d’horloge)

COMF ( Complement F )

syntaxe : COMF f,d

opération : /ff si d=1 ou /fW si d=0

Bit d’état du registre STATUS affecté :Z

On complémente le contenu du registre f bit à bit, le résultat est placé dans f si d=1 , dans W si d=0 .

durée : 1 cycle instruction (4 cycles d’horloge)

DECF (Decrement F)

syntaxe : DECF f,d

opération : f-1f si d=1 ou f-1W si d=0

Bit d’état du registre STATUS affecté : Z

On diminue le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans W si d=0
(dans ce cas f reste inchangé).

durée : 1 cycle instruction (4 cycles d’horloge)

DECFSZ ( Decrement F ,Skip if Zero )

syntaxe : DECFSZ f,d

opération : f-1f si d=1 ou f-1W si d=0 et saut si f-1=0

Bit d’état du registre STATUS affecté : aucun

27
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

On diminue le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans W si d=0
(dans ce cas f reste inchangé). Si le résultat est nul, l’instruction suivante est ignorée et dans ce cas,
cette instruction dure deux cycles.

durée : 1 cycle instruction (4 cycles d’horloge) ou 2 cycles

GOTO ( branchement inconditionnel )

syntaxe : GOTO label

Bit d’état du registre STATUS affecté : aucun

On effectue un saut dans le programme pour aller à l’adresse pointé par le label précisé dans GOTO

Durée : 2 cycles ( 8 cycles d’horloge )

INCF (Increment F)

syntaxe : INCF f,d

opération : f+1f si d=1 ou f+1W si d=0

Bit d’état du registre STATUS affecté : Z

On augment le contenu du registre f d’une unité, le résultat est placé dans f si d=1 , dans W si d=0
(dans ce cas f reste inchangé).

durée : 1 cycle instruction (4 cycles d’horloge)

INCFSZ ( Increment F , Skip if Zero )

syntaxe : INCFSZ f,d

opération : f+1f si d=1 ou f+1W si d=0 et saut si f-1=0

Bit d’état du registre STATUS affecté :aucun

On augmente le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans W si d=0
(dans ce cas f reste inchangé). Si le résultat est nul, l’instruction suivante est ignorée et dans ce cas,
cette instruction dure deux cycles.

durée : 1 cycle instruction (4 cycles d’horloge) ou 2 cycles

IORLW (Inclusive Or Literal with W)

syntaxe: IORLW k

opération: W OU k  W

Bit d’état du registre STATUS affecté : Z

On effectue un OU logique entre le contenu de W et le littéral k , le résultat est placé dans W .

28
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

durée : 1 cycle instruction (4 cycles d’horloge)

IORWF ( Inclusive Or W with F )

syntaxe : IORWF f,d

opération : W OU ff si d=1 ou W OU fW si d=0

Bit d’état du registre STATUS affecté :Z

On effectue un OU entre le contenu de W et le contenu de f , on place le résultat dans f si d=1, dans


W si d=0

durée : 1 cycle instruction (4 cycles d’horloge)

MOVF (Move F)

syntaxe : MOVF f,d

opération : ff si d=1 ou fW si d=0

Bit d’état du registre STATUS affecté :Z

On déplace le contenu de f dans f si d=1 ou de f dans W si d=0. Attention, le déplacement de f dans f


semble à priori inutile, mais il permet en fait de tester le contenu de f par rapport à 0 et de
positionner le bit Z.

durée : 1 cycle instruction (4 cycles d’horloge)

MOVLW (Move Literal to W)

syntaxe : MOVLW k

opération : kW

Bit d’état du registre STATUS affecté : aucun

On charge le contenu de W avec le littéral k

durée : 1 cycle instruction ( 4 cycles d’horloge )

MOVWF (Move W to F)

syntaxe : MOVWF f

opération : Wf

Bit d’état du registre STATUS affecté : aucun

On charge le contenu de f avec le contenu de W

durée : 1 cycle instruction (4 cycles d’horloge)

NOP (No Operation)

29
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

syntaxe: NOP

opération: néant

Bit d’état du registre STATUS affecté : aucun

On ne fait que consommer du temps machine (un cycle dans ce cas)

durée : 1 cycle instruction (4 cycles d’horloge)

RETFIE (Return From Interrupt)

syntaxe : RETFIE

opération : Pile PC

Bit d’état du registre STATUS affecté : aucun

On charge le compteur ordinal avec la valeur qui se trouve au sommet de la pile pour revenir au
programme principal lorsque l’exécution du sous programme est terminée.

durée : 2 cycles instruction ( 8 cycles d’horloge )

RETLW (Return Literal to W)

syntaxe : RETLW k

opération : kW, PilePC

Bit d’état du registre STATUS affecté : aucun

On charge le contenu de W avec le littéral k puis on charge le compteur ordinal PC avec la valeur qui
se trouve au sommet de la pile effectuent ainsi un retour de sous programme.

durée : 2 cycles instruction (8 cycles d’horloge)

RETURN (Return from subroutine)

syntaxe : RETURN

opération : PilePC

Bit d’état du registre STATUS affecté : aucun

On charge le compteur ordinal PC avec la valeur qui se trouve au sommet de la pile effectuent ainsi
un retour de sous programme. C’est un RETLW simplifié.

durée : 2 cycles instruction ( 8 cycles d’horloge )

RLF ( Rotate Left F through carry )

syntaxe : RLF f,d

opération :
7 6 5 4 3 2 1 0
30
C

Registre f
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Bit d’état du registre STATUS affecté :C

On effectue une rotation à gauche de un bit du contenu du registre f en passant par le bit de retenu C
. Si d=1 le résultat est placé dans f , si d=0 , le résultat est placé dans W

durée : 1 cycle instruction (4 cycles d’horloge)

RRF (Rotate Right F through carry)

syntaxe : RRF f,d

opération :
7 6 5 4 3 2 1 0
C

Registre f

Bit d’état du registre STATUS affecté : C

On effectue une rotation à droite de un bit du contenu du registre f en passant par le bit de retenu C.
Si d=1 le résultat est placé dans f , si d=0, le résultat est placé dans W

durée : 1 cycle instruction (4 cycles d’horloge)

SLEEP (Sleep)

syntaxe : SLEEP

opération : 0PD, 1T0, 0WDT, 0 pré diviseur

On place le circuit en mode sommeil avec arrêt de l’oscillateur. Cette commande est à utiliser avec
précaution, elle nécessite la connaissance du mode sommeil.

SUBLW (Substract W from Literal)

syntaxe : SUBLW k

opération : k-WW

Bits d’état du registre STATUS affectés : C,DC,Z

On soustrait le contenu du registre W du littéral k et on place le résultat dans W (soustraction par la


méthode du complément à 2).

durée : 1 cycle instruction (4 cycles d’horloge)

SUBWF (Substract W from F)

syntaxe : SUBWF f,d

opération : f-WW si d=0 ou f-Wf si d=1

31
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Bits d’état du registre STATUS affectés :C,DC,Z

On soustrait le contenu du registre W du contenu du registre f et on place le résultat dans W si d=0,


ou dans f si d=1 (soustraction par la méthode du complément à 2).

durée : 1 cycle instruction (4 cycles d’horloge)

SWAPF (Swap F)

syntaxe : SWAPF f,d

opération : f(0-3)f(4-7) et f(4-7)f(0-3) résultat dans W ou f selon d

Bit d’état du registre STATUS affecté : aucun

On échange les quatre bits de poids forts avec les quatre bits de poids faibles et on place le résultat
dans W si d=0, ou dans f si d=1

durée : 1 cycle instruction ( 4 cycles d’horloge )

XORLW ( Exclusive Or Literal with W )

syntaxe : XORLW k

opération : W OU EXCLUSIF kW

Bit d’état du registre STATUS affecté : Z

On effectue un OU Exclusif entre W et le littéral k, le résultat est placé dans W

durée : 1 cycle instruction ( 4 cycles d’horloge )

XORWF ( Exclusive Or W with F)

syntaxe : XORWF f,d

opération : W OU EXCLUSIF fW si d=0 ou W OU EXCLUSIF ff si d=1

Bit d’état du registre STATUS affecté :Z

On effectue un OU Exclusif entre W et le contenu de f , le résultat est placé dans W si d=0, sinon il est
placé dans f .

durée : 1 cycle instruction ( 4 cycles d’horloge )

32
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

JEU D'INSTRUCTION

33
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

 Adressage indirecte
L'adresse de la donnée est contenue dans un pointeur. Dans les PIC, un seul pointeur est disponible
pour l'adressage indirect : FSR. Contenu à l'adresse 04h dans les deux banques, il est donc accessible
indépendamment du numéro de banque. En utilisant l'adressage direct, on peut écrire dans FSR
l'adresse du registre à atteindre. FSR contenant 8 bits, on peut atteindre les deux banques du PIC
16F84. Pour les PIC contenant quatre banques, il faut positionner le bit IRP du registre d'état qui sert
alors de 9ème bit d'adresse.

Figure Erreur ! Il n'y a pas de texte répondant à ce style dans ce document.-1: Adressage direct et
indirecte dans la mémoire donnée

L'accès au registre d'adresse contenue dans FSR se fait en utilisant le registre INDF. Il se trouve à
l'adresse 0 dans les deux banques. Il ne s'agit pas d'un registre physique. On peut le voir comme un
autre nom de FSR, utilisé pour accéder à la donnée elle-même, FSR servant à choisir l'adresse.

Exemple :

Movlw 0×50 ; chargeons une valeur quelconque

Movwf mavariable ; et plaçons-la dans la variable « mavariable »

Movlw mavariable ; on charge l’adresse de mavariable, par exemple c’est 0×0E. W=0×0E.

Movwf FSR ; on place l’adresse de déstination dans FSR, on dira que FSR pointe sur mavariable

Movf INDF,w ; charger le contenu de INDF dans W. c’est-à-dire 0×50.

34
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

LE LANGAGE C

 Les bases du langage C :

Dans cette partie, nous verrons les bases du langage C pour ordinateur, toutefois nous nous
limitons aux points communs avec le langage C PIC, c'est-à-dire aux commandes communes.

Un programme en langage C se compose de plusieurs parties:

-Un appel de librairies qui constitue une sorte d’encyclopédie pour le programme principal; En effet,
elles contiennent toutes les infos et directives dont on en a besoin.

-Une fonction « main », il s’agit du programme principal dont on écrira notre code informatique. La
fonction « main » appelle les fonctions dans les librairies par leur nom. On les appelle avec la
commande « #include<nom.h>».

NB : Une fonction est composée de l’en-tête comprenant son nom et éventuellement ses
paramètres, et d’un bloc, commençant par « { » et finissant par « } », indiquant le code
correspondant à l’en-tête

-Eventuellement des sous-programmes (auxquels cas, à déclarer). Il s’agit des programmes


secondaires, sensés aider le « main » dans son travail.

L’utilité de créer des sous fonctions apparaît surtout lorsqu’une tache se répète plusieurs fois
dans le même programme, plutôt que d’écrire par exemple 3 fois le même code, on définit
une seule fois le code, dans un sous-programme, et on l’appelle trois fois.

o Le C pour PIC 16F84A:

Le C pour PIC est quelque peu différent de celui pour ordinateur. Ces différences viennent du
compilateur C. En effet, puisque ce dernier fait la conversion C-Assembleur et que les instructions
dans ce dernier sont limitées (processeur RISC), le langage C est grandement simplifié, mais les
concepteurs du compilateur ont légèrement modifié les instructions, qui sont, heureusement, assez
intuitives et rapidement assimilées.

La différence entre un ordinateur et un PIC est dans les ports entrées /sortie E/S, de ce fait, en
langage C PIC, on donnera des noms aux pattes, ou aux ports complets, entre l’appel des librairies et
la déclaration de sous-fonctions et/ou main.

 Les règles

 Il est nécessaire d’écrire les instructions de C en minuscule et celles propres au PIC (comme
les TRISA et TRISB) en majuscule.

 L’appel des librairies : En C PIC, les librairies s’appellent ainsi : #include ‘’nom.H’’

 Les affectations : La première chose à faire dans le « main », en C PIC, est de définir les
valeurs dans TRISA et TRISB. Si leurs déclarations étaient compliquées en assembleur, elles
sont grandement simples en C PIC. Ainsi il suffit de marquer TRISA=0x00 (par exemple, en
hexadécimal, la valeur étant à déterminer).

35
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

On peut également rentrer la valeur en décimal (Ex: TRISA=27), ou en binaire (Ex: TRISA=b00100110).

 La déclaration des pattes et ports : En C PIC, une patte se désigne par son port, et son
numéro (lesquels commence à 0 jusqu’à 7). Par exemple, la patte 3 (en fait la quatrième) du
port B sera : PORTB.3 En ce qui concerne, la façon dont on utilise les pattes, elle est
très simple, elles peuvent être affectées à une valeur logiques (en sortie, Ex: PORTA.2=1
;), ou être lues (en entrées, Ex: c=PORTB.7)

Exemple :

void main ()

TRISA = 0; // Configurer PORTA en sortie

PORTA = 0xFF; // Mettre toutes les bits du port A à 1

 Les variables :

Dans un programme, on utilise souvent des variables pour effectuer des opérations, il faut savoir que
le langage C fait la différence entre majuscule et minuscule, et que les variables sont la première
chose à définir dans un programme, elles peuvent principalement être de trois types :
Int (pour les entiers),
float (pour les chiffres à virgule),
char (pour les caractères).
Les variables doivent être obligatoirement définies au début du bloc.
Les formes d’écriture : Les deux utiles sont soit décimales (format par défaut) ou bien hexadécimales
(il faut marquer 0x devant la valeur pour spécifier le type).

36
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

Exemple :

int a, b ;

float c ;

Remarque : Il est possible d’affecter une valeur à une variable lors de sa définition (Ex: int
a=2 ;//créé a comme entier, et lui donne la valeur 2)

Remarque : quand on veut rentrer un caractère dans un char, il faut utiliser des guillemets
(Ex: char c ; c=’’A’’ ;)

 Les opérateurs :

+ addition

- soustraction

* multiplication

/ division

% modulo (Ex: 11%3=

= égale

!= différent

>,< supérieur et inférieur

Il existe certaines subtilités sur les opérateurs, ainsi mettre ++ ou – – équivaut à, respectivement,
ajouter ou soustraire ‘1’ à la valeur ou variable. De même, marquer a=b, équivaut à dire que
a est égal à b ; mais marquer a==b, consiste à comparer a à b, pour savoir s‘ils sont égaux.

Les opérateurs logiques : Ils servent à effectuer tous types d’opérations logiques., il y a le ET (&&), le
OU inclusif (||) et le NON ( !).

o Structure de contrôle de programme

Les instructions sont normalement exécutées séquentiellement à partir du début à la fin d’un
programme.

-Une ligne se finit toujours (sauf cas particulier que nous verrons) par un point-virgule « ; »

-Il est jugé appréciable d’écrire avec l’aide des tabulations, pour avoir un code lisible.

37
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

-Lorsque l’on désire faire des commentaires en langage C, il y a deux solutions :

1-Pour une ligne seule, on utilise un double slash : « // » Il n’est pas nécessaire de mettre un
point-virgule à la fin du Commentaire.

2-Pour un paragraphe, ou plusieurs lignes consécutives, on utilise Un « /* » pour indiquer le


début du commentaire, et un « */ » pour en indiquer la fin.

Exemple :

a=b ; //voici un commentaire sur une ligne

/*Voici un commentaire

sur plusieurs lignes*/


Nous pouvons utiliser des instructions de contrôle pour modifier ce flux séquentiel normal dans un
programme C. Les instructions de contrôle suivantes sont disponibles dans les programmes en
mikroC:

 De sélection if et switch

 D'itération ou bouclage : for, while, do, goto, continue et break

 Instruction if

Cette instruction conditionnelle if permet d’exécuter des instructions de manière sélective en


fonction du résultat d’un test. La déclaration du format général de l’instruction if est la suivante :

38
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

if (expression)

instruction1

else

instruction2

ou

if (expression) instruction1;

else

instruction2;

Si l’expression est vraie (valeur non nulle), l’instruction1 s’exécute sinon, dans le deuxième cas, c’est
l’istruction2 qui s’exécute.

 Instruction switch

L'instruction switch (commutateur) est utilisée pour assurer la commutation entre les
différentes déclarations. Si un certains nombre des conditions sont vrais ou faux. La syntaxe de
commutation est indiquée ci-dessous:

switch (condition)

case condition1:

Instructions;

break;

case condition2:

Instructions;

break;

default:

Instructions; 39

}
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

L’instruction switch fonctionne comme suit: d'abord la condition est évaluée, ensuite cette condition
est comparée à la condition1 pour voir si une correspondance est trouvée. Les déclarations
contenues dans ce bloc sont évalués. Puis s’effectuer le saut de contrôle en dehors de l'instruction
switch lorsque le mot break est rencontré.

Dans l’exemple suivant, la valeur de la variable Cnt est évaluée. Si Cnt = 1, A est mis à 1. Si Cnt = 10,
B est mis à 1, et si Cnt = 100, C est mis à 1. Si Cnt n'est pas égal à 1, 10, ou 100, donc D est fixé
à 1.

switch (Cnt)

case 1:

A=1;

break;

case 10:

B=1 ;

break ;

case 100:

C=1;

break;

default:

D =1;

 Instructions d'itération for, while, do, goto, continue et break

Les instructions d'itération nous permettent d'effectuer des boucles dans un programme, où une
partie d'un code doit être répété par un certain nombre de fois. Dans mikroC l'itération peut être
effectuée de quatre façons.

40
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

 Instruction for

for (expression initiale; expression de condition; expression incrément)

Instructions;

La syntaxe d'une instruction for est

L'exemple 1 suivant montre comment une boucle peut être mise en place pour qu’elle soit exécutée
10 fois.

Dans cet exemple, la variable i commence par 0 et elle est augmentée de 1 à la fin de chaque
itération. La boucle se termine quand i = 10, puisque dans ce cas, la condition i <10 devient
fausse. À la sortie de la boucle, la valeur de i est de 10:

Exemple 1 Exemple 2

For (i = 0; i < 10; i ++) for (i = 0;; i++)

{ {

Instructions; Instructions;

} }

Dans l'exemple 2 suivant, une boucle sans fin est formée


par l'expression de condition qui est toujours vraie et la valeur de i commence avec 0 et est
incrémenté après chaque itération.

 Instruction while

La syntaxe d'une instruction while est la suivante :

41
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

while (condition)

Instructions;

Ici, les instructions sont exécutées jusqu'à ce que la condition devienne fausse, ou les
instructions sont exécutées d’une façon répétée aussi longtemps que la condition est vraie. Si la
condition est fausse à l'entrée de la boucle, la boucle ne sera pas exécutée et le programme continue
à l'extrémité de la boucle while. Il est important que la condition soit changée à l’intérieur de la
boucle, sinon une boucle sans fin sera formée.

// Une boucle qui s'exécute 10 fois

k = 0;

while (k <10)

Instructions;

k++;

Le code suivant montre comment mettre en place une boucle d'exécuter 10 fois :

 Instruction do

Une déclaration do est similaire à une déclaration while sauf ce que la boucle exécute jusqu'à ce
que la condition devient fausse, ou, la boucle s'exécute tant que la condition est vraie. La
condition est testée à la fin de la boucle.

42
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

La syntaxe d'une déclaration do est la suivante :

do

Instructions;

} while (condition);

La première itération est toujours effectuée si la condition est vraie ou fausse. Il s’agit de la
principale différence entre une déclaration while et une déclaration do.

Le code suivant montre comment mettre en place une boucle d'exécuter 10 fois en utilisant la
déclaration do

/*Exécute 10 fois */

k = 0;

do

Instructions;

k++;

} while (k <10);

 Instruction goto, continue et break

Une instruction goto peut être utilisée pour modifier le flux normal de contrôle dans un
programme, elle provoque le programme à sauter à une étiquette spécifiée. Une étiquette peut être
n'importe quel jeu de caractères alphanumériques en commençant par une lettre et se
termine par le caractère « : ». Bien que l’instruction goto soit non recommandée, elle peut être
utilisée conjointement avec une instruction if pour créer un programme en itérations.

L'exemple suivant montre comment mettre en place une boucle pour l’exécuter 10 fois en utilisant
goto et if :

43
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

/ * Exécute 10 fois * /

k = 0;

Boucle:

Instructions;

k++;

if (k < 10) goto Boucle

Les instructions continue et break peuvent être utilisées à l'intérieur d’itérations pour modifier le flux
de commande. Une instruction continue est généralement utilisée avec une instruction if et
provoque le saut de la boucle d’itération.

Voici un exemple qui calcule la somme des nombres de 1 à 10, sauf le nombre 5:

/* Calculer la somme des nombres 1,2,3,4,6,7,8,9,10 */

Sum = 0;

i = 1;

for (i = 1; i <= 10; i++)

if (i == 5) continue; // Passer numéro 5

Sum = Sum + i;

De même, une instruction break peut être utilisée pour mettre fin à une boucle à l’intérieur de la
boucle.

Dans l’exemple suivant, la somme des nombres de 1 à 5 est calculée, même si les paramètres de la
boucle sont mis à parcourir 10 fois:

44
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

/ * Calculer la somme des nombres 1,2,3,4,5 * /

Sum = 0;

i = 1;

for (i = 1; i <= 10; i++)

if (i > 5) break; // Stop boucle si i > 5

o Fonctions intégrées

Le compilateur mikroC fournit un ensemble de fonctions intégrées qui peuvent être appelées à
partir du programme. Ces fonctions sont énumérées dans le tableau 3.1, avec une brève description
de chacune.

La plupart de ces fonctions peuvent être utilisées dans un programme sans avoir à inclure des fichiers
d'en-tête.

45
Cours Microcontrôleurs Masters : EI et ME, Dpt. ELT FEI USTHB

BIBLIOGRAPHIE

1. BIGONOFF, « La programmation des PIC », Cours, première partie, Révision 33.


2. C. TAVERNIER, « Microcontrôleurs PIC 10, 12, 1 : Description et mise en œuvre», Edition
Dunod 2000.
3. P. MAYEUX, « A la découverte des microcontrôleurs PIC », Cours sur le PIC.
4. S. PISAK, « Les microcontrôleurs PIC16F84 », Cours.

46

Vous aimerez peut-être aussi