Vous êtes sur la page 1sur 55

Chapitre 1 Du microprocesseur au microcontrôleur

1.1. INTRODUCTION
Un SoC (system on chip : système sur puce) constitue un circuit complexe qui intègre tous les
éléments fonctionnels d’un produit sur une même puce. Par exemple, des modules logiciels (DSP), des
mémoires, des périphériques, des processeurs matériels (FPGA ou ASIC) …
Chaque jour nous utilisons des produit qui contient des systèmes sur puce qui sont constitués d’une UC
(CPU),des mémoires et des programmes (Téléphone portable, télévision, GPS … ) c’est les
microcontrôleurs. Dans ce chapitre on va donner une introduction générale sur les microcontrôleurs

1.2. DU MICROPROCESSEUR AU MICROCONTRÔLEUR


Le processeur est l'élément central d'un système informatique : il interprète les instructions et traite les
données d'un programme. Il a besoin de certains éléments externes pour fonctionner :
 une horloge pour le cadencer (en général à quartz
 une mémoire pour stocker les variables durant l’exécution du programme (mémoire vive RAM)
et le programme (mémoire morte ROM).
 des périphériques (pour interagir avec le monde extérieur).
Ces éléments sont reliés par 3 bus comme le montre la figure suivante :

Fig1.1 Eléments de bas d’un système à microprocesseur

 le bus d'adresse qui permet au microprocesseur de sélectionner la case mémoire ou le


périphérique auquel il veut accéder pour lire ou écrire une information.
 le bus de données qui permet le transfert des informations entre les différents éléments ; ces
informations seront soit des instructions, soit des données en provenance ou à destination de la
mémoire ou des périphériques

L.HACINI Page 1
Chapitre 1 Du microprocesseur au microcontrôleur
 le bus de contrôle qui indique si l'opération en cours est une lecture ou une écriture, si un
périphérique demande une interruption pour faire remonter une information au processeur, etc.
Traditionnellement, ces composants sont intégrés dans des circuits distincts. Le développement d'un tel
système à base de microprocesseur se trouve donc pénalisé par :
 la nécessité de prévoir l'interconnexion de ces composants (bus, câblage, nappes de
connexion) ;
 la place occupée physiquement par les composants et les moyens d'interconnexion ;
 la consommation énergétique ;
 la chaleur dégagée ;
 le coût financier.
Les microcontrôleurs améliorent l'intégration et le coût (lié à la conception et à la réalisation) d'un
système à base de microprocesseur en rassemblant ces éléments essentiels dans un seul circuit intégré.

1. 3. LE MICROCONTRÔLEUR

1.3.1. Définition
Les Microcontrôleurs sont des dispositifs qui associent au microprocesseur de base un programme
intégré au circuit, ainsi que des périphériques et de la RAM, ce qui a permis de faire évoluer les
montages vers plus de simplicité et de rapidité.
Les microcontrôleurs sont donc des circuits intégrés qui regroupent dans un même boîtier tous les
composants habituellement nécessaires à un système programmable, à savoir :
 Le microprocesseur
 de la mémoire vive pour les données, voire de la mémoire morte de programme
 Les ports d’entrée et de sortie parallèle ou série
 Les bus de données et d’adresse
 Selon le modèle ; des timers, des ports série, des convertisseur A/N et/ou N/A, des sorties PWM
(ou MLI modulation de largeur d’impulsion), bus I²C.
Un microcontrôleur est un composant autonome, capable d'exécuter le programme contenu dans sa
mémoire morte dès qu'il est mis sous tension.

1.3.2. Avantages des systèmes à base de microcontrôleurs


 Diminution de l’encombrement du circuit : un système à base de microcontrôleur possède
généralement assez peu de composants électroniques
 Circuit imprimé au tracé simplifié.

L.HACINI Page 2
Chapitre 1 Du microprocesseur au microcontrôleur
 Circuit plus fiable car moins de composants.
 Diminution des coûts : un microcontrôleur coûte moins cher que la somme des composants
qu’il intègre.

1.3.3. Inconvénients des systèmes à base de microcontrôleurs


 Ne convient pas nécessairement à tous les problèmes : un microcontrôleur n’offre pas une
grande puissance de calcul.
 On ne peut pas toujours utiliser tous les périphériques simultanément : certaines broches sont
multiplexées.
 Il est en général assignés à une tâche bien précise. La taille des programmes et la quantité de
mémoire (vive et morte), dont il dispose, sont modestes (face à un micro-ordinateur) ;

1.3.4. Les différentes familles des microcontrôleurs


Le marché du semi-conducteur offre un choix très large de produits. Chaque fabricant ne propose pas
un seul microcontrôleur, mais des familles de microcontrôleurs. Au sein d’une même famille, les
microcontrôleurs possèdent le même processeur et donc le même langage, seuls les périphériques
changent. Ainsi, la connaissance de la structure matérielle et logicielle d’un produit d’une famille
permet une adaptation rapide à tout microcontrôleur de la même famille. On peut citer par exemple :
 la famille Atmel AT91
 la famille Atmel AVR
 le C167 de Siemens/Infineon ;
 la famille Hitachi H8
 la famille Intel MCS51(8x31, 8x51, …)
 la famille 68HCxxx de Motorola (68HC11, 68HC811)
 la famille des PIC de Microchip
 la famille des dsPIC de Microchip
 la famille des ST6 de STMicroelectronics
 la famille ADuC d'AnalogDevices
 la famille MSP430 de Texas Instruments
 la famille LPC21xx ARM7-TDMI de Philips

L.HACINI Page 3
Chapitre 1 Du microprocesseur au microcontrôleur
1.3.5. Domaine d’utilisation des microcontrôleurs
Les microcontrôleurs sont essentiellement utilisés dans les systèmes embarqués, on peut les trouver
donc dans de nombreuses systèmes électroniques complexes utilisés de nos jours : Téléphones mobiles
 Horloges
 Technique médicale (par exemple mesure de la glycémie)
 Systèmes de sécurité : alarme incendie
 Récepteurs GPS
 Electroménager
 Appareil WIFI, TV, Télécommande…
 Automobile,
 Transport aérien/maritime.

1.3.6. Critères de choix d’un microcontrôleur


Lorsqu’on décide de développer un nouveau produit à base de microcontrôleur, puisque l’offre est très
vaste, plusieurs paramètres vont orienter notre choix vers un produit plutôt qu’un autre :
 le prix : il y a un grands écarts de prix entre les produits, liés par exemple à la taille et au type
de mémoire, ainsi qu’à la nature et la quantité de périphériques.
 les périphériques : on peut se demander si toutes les fonctions décrites dans le cahier des
charges seront réalisées par le microcontrôleur ou s’il faudra ajouter des périphériques externes.
 taille des espaces mémoire : l’espace mémoire programme sera-t-il suffisant pour l’application ?
 consommation : déterminant pour des produits destinés à fonctionner sur batterie
 outils de développement : peut-on développer en langage évolué ?

1.4. QUELQUES DEFINITIONS

1.4.1. Architecture Fonctionnelle


Il existe deux types fondamentaux d’architectures

1.4.1.1.Architecture de Von Neumann


Dans l’architecture de la machine de Von Neumann, le programme et les données sont enregistrés sur
la même mémoire. Chaque instruction contient la commande de l’opération à effectuer et l’adresse de
la donnée à utilisée, il faut donc souvent plusieurs cycles d’horloge pour exécuter une instruction. La
figure suivante indique une architecture simple de Von Neumann : un bus de données et de programme
et un bus d’adresses.

L.HACINI Page 4
Chapitre 1 Du microprocesseur au microcontrôleur

Memoire
de programme CPU
et de données

Fig1.2 Architecture de Von Neumann

On voit que les échanges s’effectuent de manière simple entre l’unité centrale et la mémoire unique,
par un bus transitant les codes de programme et les données. On a ainsi des données collées aux
instructions. Cette architecture est maintenant principalement utilisée pour la conception des
processeurs d’ordinateurs (PC, MAC) car elle est très souple pour la programmation.

1.4.1.2. Architecture de Harvard


Cette structure se distingue de l’architecture Von Neumann par le fait que les mémoires programmes et
données sont séparées comme le montre la figure 1.3. L’accès à chacune des deux mémoires se fait via
un chemin distinct. Cette organisation permet de transférer une instruction et des données
simultanément, ce qui améliore les performances.

Mémoire Mémoire
de CPU de
programme données

Fig 1.3 Architecture de Harvard

On voit que les échanges s’effectuent de manière double entre l’unité centrale et les deux mémoires, ce
qui permet une grande souplesse pour l’enregistrement et l’utilisation des données. Cette architecture
très employée pour la conception des processeurs de traitement de signal (DSP) est de plus en plus
utilisée pour les microcontrôleurs d’usage généraux

1.4.2. Microprocesseurs RISC et CISC


1.4.2.1. Les microprocesseursCISC(Complex Instruction Set Computing) : sont dotés d’un jeu étendu
d’instructions complexes.Ces instructions sont relativement lentes. Les microprocesseurs
CISC privilégient la puissance de traitement au détriment de larapidité.

1.3.2.2. Les microprocesseurs RISC (Reduced Instruction Set Computing) : sont munis d’un jeu réduit
d’instructions simples.Ces instructions sont adaptées et sont très rapides.

L.HACINI Page 5
Chapitre2 Architecture du microcontrôleur PIC 16F877

2.1. LES MICROCONTROLEURS PIC


La société Américaine Microchip Technologies a mis au point dans les années 90 un microcontrôleur
CMOS : le PIC, ce composant encore très utilisé à l’heure actuelle, est un compromis entre simplicité
d’emploi, rapidité et pris de revient. Les microcontrôleurs PIC de MICROCHIP se distinguent des
microcontrôleurs classiques par les deux aspects suivants.
 Ce sont des microcontrôleurs de structure Harvard
 Ce sont des microcontrôleurs RISC (Reduced Instructions Set Computers)

Les PIC existent dans plusieurs versions :


 les UVPROM qui sont effaçable par une source de rayonnement ultraviolet
 Les OTPROM programmable une seule fois
 Les EEPROM ou flash qui sont effaçable électriquement.

2.1.1. Structure interne d’un PIC


Selon le type de PIC utilisé, on trouvera en interne un certain nombre de périphériques avec des
caractéristiques distinctes, ainsi que des capacités mémoire différentes. En règle générale un PIC de
base est constitué :

 D’une mémoire de programme laquelle contient les instructions que doit réaliser le
microcontrôleur. La capacité de cette mémoire est variable selon les PIC.
 D’une mémoire RAM pour sauvegarder temporairement des données. La capacité de cette
RAM est variable selon les PIC.
 D’une Unité Arithmétique et Logique (ALU), chargée d’effectuer toutes les opérations
arithmétique de base (addition, soustraction etc. ) ainsi que les opérations logiques de base ( ET,
OU logique etc... ).
 De ports d’entrées-sorties pour pouvoir dialoguer avec l’extérieur du microcontrôleur.
Exemples :-pris en compte de l’état d’un interrupteur (entrée logique)
- commande d’un relais (sortie logique)
 D’un registre compteur de programme (CP) qui pointe l’adresse mémoire contenant
l’instruction courante à réaliser par le microcontrôleur.
 D’un registre pointeur de pile (PP) qui est essentiellement utilisé lorsque l’on réalise des sous
programmes à l’intérieur d’un programme. Le pointeur de pile est chargé de mémoriser
l’adresse courante avant le saut au sous-programme.

L.HACINI M1 Electronique des Systèmes Embarqués Page 1


Chapitre2 Architecture du microcontrôleur PIC 16F877

 D’un registre d’instruction qui contient tous les codes binaires correspondant aux instructions à
réaliser par le microcontrôleur.
 D’un registre d’état qui est en relation avec l’UAL et qui permet de tester le résultat de la
dernière opération effectuée par le microcontrôleur. Selon la dernière opération effectuée des
bits seront positionnés dans le registre d’état ceux-ci pourront être testés pour effectuer des
sauts conditionnels.
 D’une horloge système qui permettra de cadencer tous les échanges internes ou externes au
microcontrôleur
Certains microcontrôleurs possèdent des convertisseurs analogiques-numériques et numériques-
analogiques, ainsi que de la mémoire EEPROM, également des TIMERS, … etc

2.1.2. Le choix d’un PIC


Le choix d'un PIC est directement lié à l'application envisagée.
 Il faut dans un premier temps déterminer le nombre d'entrées-sorties nécessaires pour
l'application. Ce nombre d' entrées-sorties nous donne une première famille de PIC.
 Il faut ensuite déterminer si l'application nécessite un convertisseur analogique-numérique ce
qui va centrer un peu plus vers le choix d'une famille de PIC.
 La rapidité d'exécution est un élément important, il faut consulter les DATA- BOOK pour
vérifier la compatibilité entre la vitesse max. du PIC choisi et la vitesse max. nécessaire au
montage.
 La taille de la RAM interne et la présence ou non d'une EEPROM pour mémoriser des données
est également important pour l'application souhaitée.
 La longueur du programme de l'application détermine la taille de la mémoire programme du
PIC recherché.

2.1.3. Le déroulement d’un programme


Dans un PIC l’instruction écrite sur 14 bits est composée de l’instruction proprement dite et d’un
opérande. C’est au niveau du registre d’instruction que la séparation des deux s’effectue (figure. 2.1).
L’instruction (opération) est décodée et l’opérande est envoyée par les bus soit à l’entrée de l’UAL
dans le cas d’un adressage immédiat (l’opérande est la donnée à traiter), soit elle sert à adresser l’un
des registres en RAM (FILE) dans lequel se trouve l’information à traiter (dans le cas d’un adressage
direct).

L.HACINI M1 Electronique des Systèmes Embarqués Page 2


Chapitre2 Architecture du microcontrôleur PIC 16F877

Fig 2.1 Architecture simplifiée d’un microcontrôleur PIC

A la mise en route de l’unité centrale, une série de micro-instructions va automatiquement charger 0x00
(adresse de la première instruction à exécuter) dans le registre appelé Compteur de Programme (PC).
Cette opération s’appelle RESET. Ce compteur de programme est destiné à contenir l’adresse de
l’instruction qui va être exécutée. Il compte les adresses, c-à-d qu’il s’incrémente dès que l’unité
centrale a chargé l’instruction complète qu’il pointe en mémoire.
Le signal d'horloge externe est divisé par 4 à l'intérieur du PIC pour obtenir 4 horloges internes en
quadrature nommées Q1, Q2, Q3 et Q4 (voir figure. 2.2).
Le compteur de programme est incrémenté pendant l’impulsion d’horloge Q1 (voir figure. 2.2).
L’instruction avec son opérande est chargée à partir de la mémoire dans le registre d’instruction par le
bus de programme pendant l’impulsion d’horloge Q4 du premier cycle (délai nécessaire à cause du
temps d'accès de la mémoire programme). Ensuite l’automate séquenceur va décoder l’instruction
contenue par le registre d’instruction et va générer des micro-instructions qui permettront d’exécuter
l’instruction pendant les cycles d’horloge Q1 à Q4 suivants.
Q1 : décodage de l'instruction
Q2 : lire l'opérande (W, registre en RAM, donnée immédiate…)
Q3 : effectuer un éventuel traitement (addition, …)

L.HACINI M1 Electronique des Systèmes Embarqués Page 3


Chapitre2 Architecture du microcontrôleur PIC 16F877

Q4 : stocker le résultat (dans l'opérande source, W…)


Une instruction nécessite un cycle pour que le PIC aller la chercher en mémoire programme et un autre
pour l'exécuter. Un pipeline à 2 niveaux permet de mener ces deux types d'opération en parallèle : dans
un même cycle de 4 périodes d'horloge, le PIC va chercher l'instruction n tout en exécutant l'instruction
n+1. Une instruction s'exécute donc en un seul cycle, sauf lorsqu'il y a déroutement (changement du PC
par une instruction) où il faut rajouter un cycle "mort" pour charger la nouvelle instruction avant son
exécution.
On peut donc dire que le microcontrôleur exécute une instruction par cycle ; de là vient sa plus grande
rapidité par rapport à la structure Van Neuman, que l’on rencontre dans d’autres systèmes où une
instruction nécessite plusieurs accès mémoire donc plusieurs cycles pour être exécutée.
Dans le cas du PIC dont la structure est HARVARD, un cycle machine est égale à quatre cycles
d’horloge du quartz, les cycles Q1 à Q4 sont donc en relation directe avec la fréquence du quartz. Avec
un quartz de fréquence 20 MHz le microcontrôleur peut donc réaliser cinq millions d’opérations par
seconde.

Fig2.2. Chronogramme de fonctionnement

2.2.4. Les applications des PIC


Les applications à base de PIC sont multiples :
 Transfert unidirectionnel ou bidirectionnel de données en parallèle avec les ports A et B
 Temporisation et comptage

L.HACINI M1 Electronique des Systèmes Embarqués Page 4


Chapitre2 Architecture du microcontrôleur PIC 16F877

 Les sorties des PIC peuvent délivrer environ 25 mA, on peut au moyen de transistors, amplifier
ce courant de sortie pour piloter un relais ou bien tout autre composant électrique ou
électronique.
 Pour les applications de type analogiques, certain PIC possèdent des convertisseurs intégrés, il
est possible également d'adjoindre un circuit annexe (CNA ou CAN) qui dialoguera avec le
microcontrôleur et effectuera les conversions analogiques.

2.1.5. Signaux d’entrées-sorties


2.1.5.1. L'horloge système
L’horloge système peut être réalisée soit avec un quartz, soit avec une horloge extérieure ou bien avec
un circuit RC.

Mode XT-HS mode extérieur

Mode RC

Fig 2.3 systèmes d’horloge

La fréquence max d'utilisation va dépendre du microcontrôleur utilisé. Le suffixe indiqué sur le boîtier
donne la nature de l'horloge à utiliser et sa fréquence max.
Suffixe :
LP ( Low Power ) oscillateur à quartz fmax = 200 khz
RC oscillateur RC fmax = 4 Mhz
XT oscillateur à quartz fmax =4 Mhz
HS (High Speed )oscillateur à quartz rapide fmax = 20 Mhz
Un nombre suit le suffixe, il donne la fréquence d'utilisation pour le circuit spécifié :
02 2 Mhz pour les suffixes XT et RC

L.HACINI M1 Electronique des Systèmes Embarqués Page 5


Chapitre2 Architecture du microcontrôleur PIC 16F877

04 4 Mhz pour les suffixes XT et RC


10 10 Mhz pour le suffixe HS
16 16 Mhz pour le suffixe XT
20 20 Mhz pour le suffixe HS

2.1.5.2. Les entrées - sorties


Selon le type de PIC utilisé, on dispose d'un certain nombre de broches d'entrées-sorties, celles-ci
seront chacune configurables soit en entrée soit en sortie.
Un registre interne au PIC nommé TRIS permet de définir le sens de chaque broche d'un port d'entrées-
sorties. En règle générale un bit positionné à 0 dans le registre TRIS donnera une configuration en
sortie pour la broche concernée, si le bit est positionné à 1 ce sera alors une broche d'entrée.

2.2. Le PIC 16F877


La famille des PICs est subdivisée en 3 grandes familles : La famille Base-Line, qui utilise des mots
d’instructions de 12 bits, la famille Mid-Range, qui utilise des mots de 14 bits (et dont fait partie le
16F877), et la famille HighEnd, qui utilise des mots de 16 bits.
Le microcontrôleur PIC 16F877 possède la même structure de base, les mêmes composants techniques,
le même jeu d’instructions (35) et les mêmes modes d’adressages que le PIC 16F84, mais dispose de
nombreuses interfaces supplémentaires qui font de lui plus performants.
Le PIC 16F877 comprend :
 5 ports parallèles
 Un compteur temporisateur TMR0 sur 8 bits avec pré-diviseur
 Un compteur temporisateur TMR1 sur 16 bits avec pré-diviseur, pouvant être incrémenté par
une horloge externe.
 Un compteur temporisateur TMR2 sur 8 bits avec un registre de période sur 8 bits et un pré-
diviseur et un post-diviseur
 Un module de capture sur 16 bits
 Un module de comparaison sur 16 bits
 Un générateur d’impulsions modulées en largeur sur 10 bits)
 Un port série MSSP comprenant une liaison série synchrone maitre/esclave SPI et une liaison
série synchrone maitre/esclave I2C
 Une liaison série synchrone/asynchrone émetteur/récepteur avec possibilité de détection
d’adresse sur 9 bits

L.HACINI M1 Electronique des Systèmes Embarqués Page 6


Chapitre2 Architecture du microcontrôleur PIC 16F877

 Un port parallèle esclave sur 8 bits avec des lignes de contrôle RD, WR et CS
 8 entrées de convertisseurs analogiques numériques 10 bits
 Un circuit de détection Brown-Out Resqet (BOR) pour surveiller la tension d’alimentation
Le composant ne comprenant que 40 connexions, il est évident que celles-ci sont communes à plusieurs
interfaces

Fig 2.4 connexions du PIC 16F877

2.2.1. Les mémoires

2.2.1.1. La mémoire de programme


La mémoire programme contient 8K emplacement de mémoire FLASH sur 14 bits. L’adressage de ses
8K nécessite 13 bits d’adresse. Il faut donc utiliser en plus des 8 bits du PCL, les cinq bits prévus dans
PCLATH.

2.2.1.2. La mémoire RAM, ou mémoire de données


La mémoire RAM du 16F877 de 512 octets, contenant les registres spéciaux SFR(SpecialFonction
Registers) et les registres à usage générale GPR(General PurposeRegisters), est divisée en quatre blocs
mémoire. Ces quatre blocs sont sélectionnés grâce aux bits RP0 et RP1 du registre d’état (STATU).
2.2.1.3. La mémoire EEPROM
Accessible en lecture et en écriture par une procédure spéciale, elle contient 256 octets adressables de
00h à FFh.
L.HACINI M1 Electronique des Systèmes Embarqués Page 7
Chapitre2 Architecture du microcontrôleur PIC 16F877

2.2.1.4. La pile
La pile est constituée de 8 registres de 13 bits situés en dehors de la mémoire de données et en dehors
de la mémoire de programme.

Fig 2.5 Les registres du 16F877

L.HACINI M1 Electronique des Systèmes Embarqués Page 8


Chapitre 3 Programmation et jeu d’instructions

3.1.INTRODUCTION
Une fois le projet établi, l'étape suivante consiste à créer le programme. Le programme source, est une
suite d'ordres dit "Mnémoniques" qui font partie du jeu d'instructions du PIC utilisé. Pour créer le
programme source il faut uniquement un éditeur de texte.
Une fois que le programme source est figé, l'étape suivante consistera à compiler le programme, c'est à
dire à transformer le programme source en un programme dit "binaire" (code machine). L'extension du
fichier sera alors .hex (hexadécimal). Une fois compilé, le fichier binaire sera transféré vers la mémoire
programme du PIC.

3.2.L’ASSEMBLAGE
La transformation du texte en programme, que l’on appelle assemblage, s’effectue en deux temps
appelés passes. Au cours de la première passe le logiciel appelé assembleur, reconnaît chaque symbole
d’instruction (mnémonique), et déduit le code machine correspondant. Après cette première passe,
l’assembleur à défini une table des symboles.
Pendant la deuxième passe, cette table des symboles est utilisée pour achever la traduction.
L’assembleur génère le code machine comme une suite d’octets qui pourront être mis en mémoire,
constituant ainsi le programme exécutable (fichier.hex).une fois l’assemblage est terminé l’utilisateur
dispose de plusieurs fichiers dans l’ordinateur :
 Le fichier source qu’il a édité et qu’il pourra modifier par la suite
 Le fichier listing qui contient toutes les informations nécessaires à la relecture et à la
compréhension du programme
 Le fichier (.hex) qui contient les codes machines exécutés par le microcontrôleur est stocké
sous forme texte sur le disque de l’ordinateur, il contient toutes les informations nécessaires
à son implantation dans la mémoire programme de PIC
 D’autres fichiers de travail générés par l’assembleur notamment un fichier détaillant les
erreurs et avertissements qui subissent dans la source.

3.3. REGLES DE REDACTION EN LANGAGE ASSEMBLEUR

3.3.1. Les directives d’assemblage


Les directives ne sont utiles qu’au logiciel d’assemblage, elles ne font pas partie du programme.
a) La directive ORG : Le programme principal est logé à un endroit défini dans la mémoire programme
du PIC. Une syntaxe nommée ORG permet de choisir l'adresse de début dans laquelle sera logée la
première instruction du programme. On peut placer plusieurs ORG dans un programme.

L.HACINI M1 Electronique des Systèmes Embarqués Page 1


Chapitre 3 Programmation et jeu d’instructions

Exemple1 :
;------------------------------------- Programme principal ------------------------------
ORG 0000h
; Le programme commencera à l'adresse 0000 de la mémoire programme du PIC.

Exemple2 :
;------------------------------------ Initialisation du PIC ---------------------------------
ORG 0000h
GOTO start
;--------------------------------- Programme d' interruption -----------------------------
ORG 0004h
…………………
…………………
;------------------------------------ Programme principal ---------------------------------
start
………………….
………………….

b) La directive LIST : Elle détermine le type de microcontrôleur utilisé.

Exemple :
List P=16F877
c) La directive END : Elle précise où doit s’arrêter l’assemblage, les instructions situées après sont
ignorées.
d) La directive CONFIG : Elle permet de définir les paramètres de fonctionnement du PIC. Pour cela il
suffit de positionner la valeur de chacun des bits du registre de configuration. Pour programmer ce
registre on utilise la directive CONFIG qui n’intervient qu’avec le programmateur. Cette directive n’est
utile que pour modifier la configuration par défaut du microcontrôleur.

Exemple:
_CONFIG_CP_OFF&WDTE_OFF&PWRTE_ON&HS_OSC
Chaque définition est séparée par le symbole &, chaque bit est suivi de ON ou OFF. Le bit CP est à 0,
le bit WDTE (watchdog timer enable) est à 0, le bit PWRTE (power timer enable) est à 1 et le terme
HS définit le type d’horloge utilisé.
e) La directive include : elle permet d’introduire dans le programme les assignations contenues dans le
fichier du microcontrôleur, c'est-à-dire toutes les constantes utiles du microcontrôleur.

Exemple :
include p16F877.inc

L.HACINI M1 Electronique des Systèmes Embarqués Page 2


Chapitre 3 Programmation et jeu d’instructions

3.3.2. Les assignations


Il est souhaitable, pour la compréhension du programme et éventuellement pour qu'une autre personne
désirant suivre ou modifier le programme, de définir des équivalences, qui permettent d'associer une
valeur à un nom. Au moment de l’assemblage, chaque fois que l’assembleur va trouver une étiquette
avec assignation, il la remplacera automatiquement par sa valeur.

Exemple :
table EQU 0x50
A chaque fois dans notre programme que le compilateur rencontrera l'équivalence définie, il la
remplacera par sa valeur numéraire. Il est plus facile de comprendre dans un programme le mot table
plutôt que la valeur 5.

3.3.3. Les définitions


Une définition « define » fonctionne comme une assignation. Les assignations sont utilisées pour les
valeurs, et les définitions pour remplacer un texte plus complexe ou le résultat d’un calcul.

Exemple :
define led PORTA,3 ; led désigne le bit 3 du port A

3.3.4. Les commentaires


Pour la compréhension d'un programme il est utile voire primordial de rajouter des commentaires qui
faciliteront la mise à niveau ainsi qu'un dépannage éventuel. La plupart des compilateurs ignorent, donc
considèrent comme commentaires, tout ce qui suit un point virgule ( ; ).
En début de programme quelques lignes nous permettent de reprendre le fonctionnement sommaire du
programme.

3.3.5. Les étiquette


Les étiquettes dans un programme permettent de remplacer avantageusement une adresse en format
numérique. Elles doivent suivre les règles suivantes :
 le premier caractère doit être une lettre ou un tiret bas
 elle est alphanumérique
 elle ne peut être définie qu’une seule fois
 elle est écrite en première colonne du source
 elle ne peut faire plus de 32 caractères

L.HACINI M1 Electronique des Systèmes Embarqués Page 3


Chapitre 3 Programmation et jeu d’instructions

Exemple
GOTO tempo
Dès que le programme rencontre l'instruction GOTO, il va se "brancher" à l'adresse mémoire que
représente l'étiquette tempo pour exécuter les instructions qui se trouvent derrière cette étiquette.

3.3.6. Les macros


Une macro permet de nommer une séquence d’instructions souvent utilisée et qui peut être insérée dans
un programme par simple appel de son nom. Elle simplifie l’écriture et apparaît comme une
instruction.
Elle se compose d’un nom (étiquette) écrit en première colonne, puis de la directive macro. A la ligne
suivante on place le programme qui constitue la macro. La macro se termine par la directive endm (end
of macro).

Exemple
AAA macro
Bsf PORTB,2 ; mise à 1 du bit 2 du port B
endm

3.3.7. La zone des variables


La directive CBLOCK permet de définir l’adresse du début d’une zone de variables. Ensuite, il suffit
d’écrire le nom de la variable suivi du signe « : » et de la taille utilisée (nombre de registre à usage
général). La fin de la zone est définie par la directive endc.

Exemple
CBLOCK 0x0C ; début de la zone de variables
cmpt : 1 ; zone de 1 octet
table : 8 ; zone de 8 octets
endc ; fin de la zone

3.4. JEU D’INSTRUCTIONS


Le microcontrôleur PIC 16F877 dispose d’un jeu réduit de 35 instructions. Ce jeu d’instruction réduit
implique qu’une opération peut être traduite par plusieurs instructions assembleurs.
La majorité des instructions s’exécutent en un seul cycle d’horloge sauf pour les instructions de
branchement ou certaines autres instructions. Dans ce qui suit on donne en détail toutes les instructions
en précisant le nombre de cycles d’horloge nécessaires et les flags affectés.

ADDLW :( ADD Literal and W )


Additionner le registre W et une valeur immédiate, la somme est stockée en W
Syntaxe : addlw k ;(W)+k  (W)
L.HACINI M1 Electronique des Systèmes Embarqués Page 4
Chapitre 3 Programmation et jeu d’instructions

Nombre de cycle d'horloge : 1


Indicateurs positionnés :
C : si le résultat de l’opération est supérieur à 0xFF (255), C passe à 1
DC : si le résultat de l’opération entraîne un retenue entre le bit 3 et 4, DC passe à 1
Z : si le résultat de l’opération est nul, Z passe à 1
Exemple :
Addlw 0x0F ; W + 0x0F, le résultat est stocké dans W

ADDWF: ( ADD W and F )


Additionner le registre W et ( f ) , la somme est stockée en fonction de d
Syntaxe : addwf f,d ;(W)+(f)  (d)
f est l'emplacement mémoire d'un registre
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : C, DC, Z
d est un paramètre
 si d= 0 le résultat va dans le registre W
 si d= 1 le résultat va dans le registre f
Exemple :
movlw 5 ; charger 5 dans W
movwf zone ; zone vaut 5
movlw 25 ; charger 25 dans W
addwf zone,1 ; résultat=30 sauvé dans zone car d=1

ANDLW : ( AND Literal with W )


Opération " ET " entre le contenu du registre W et l’opérande k
Syntaxe : andlw k ;(W)&k  (W)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : z
Exemple :
movlw B’11001101’ ; charger W
andlw B’11110000’ ; effectuer un ‘ET logique’ résultat B’11000000’ dans W

ANDWF: ( AND W with F )


Opération ‘ET logique’ entre le contenu du registre W et le contenu de f le résultat est stocké en
fonction de d
Syntaxe : andwf f,d ; ( W ) & ( f )  ( d )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : z
Exemple :
R_etat equ 0x03 ; on affecte 03 à la variable R_etat utilisée ci - après
movlw B’00000111’ ; on met le contenu 00000111 dans le registre W
andwf R_etat, 1 ; on élimine les 5 bits de poids fort du reigstre d’adresse R_etat, le résultat
est dans le même registre.

BCF : ( Bit Clear F )


Permet de mettre à 0 un bit d’un registre
Syntaxe : bcf f,b ; 0  ( f{b} ) le bit défini par b (sur 3 bits) est mis à 0 dans le registre
(f), b est compris entre 0 et 7

L.HACINI M1 Electronique des Systèmes Embarqués Page 5


Chapitre 3 Programmation et jeu d’instructions

f est l'emplacement mémoire d'un registre


Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
Avant (x)=B’11111111’
BCF x, 2 ; on met à 0 le bit 2 de (x)
Après (x)=11111011

BSF : ( Bit Set F )


Permet de forcer à 1 un bit d’un registre
Syntaxe : bsf f,b ; 1  ( f{b} ) le bit défini par b (sur 3 bits) est mis à 1 dans le registre
(f), b est compris entre 0 et 7
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
BSF PORTB, 3 on met à 1 le bit 3 du port B

BTFSC: ( Bit Test F Skip if Clear )


Teste le bit sélectionné du registre et saute l’instruction suivante si le bit vaut 0. Dans ce cas
l’instruction prend deux cycles ; sinon, elle n’utilise qu’un cycle machine.
Syntaxe : btfsc f,b ;teste de bit repéré par b de la case mémoire (f) et saute l’instruction
suivante si le bit b=0
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

BTFSS: ( Bit Test F Skip if Set )


Teste le bit du registre et saute l’instruction suivante s’il vaut 1
Syntaxe : btfss f,b ;teste de bit repéré par b de la case mémoire (f) et saute l’instruction
suivante si le bit b=1
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

CALL : (CALL sous-programme) Appel du sous programme


Syntaxe : call étiquette ; appel du sous programme à l’adresse étiquette
Adresse du retour ( PC ) + 1  Haut de la pile
étiquette  ( PC )
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

CLRF : (CLeaR F)
Cette instruction efface le registre f spécifié
Syntaxe : clrf f ; 00  ( f )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z=1

CLRW : (CLeaR W)
Efface le contenu du registre W
Syntaxe : clrw ; 00  W

L.HACINI M1 Electronique des Systèmes Embarqués Page 6


Chapitre 3 Programmation et jeu d’instructions

Nombre de cycle d'horloge : 1


Bit du registre STATUS affecté : Z = 1

CLRWDT : (CLeaR WatchDog Timer)


Remet à 0 le compteur du chien de garde, opération qui permet de provoquer un reset automatique du
microcontrôleur en cas d’arrêt du programme provoqué, par exemple, par un parasite.
Syntaxe : clrwdt ; remet le compteur du watchdog à 0
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés :
TO = 1
PD = 1

COMF: (COMplement F)
Effectue le complément à 1 du registre spcifié
Syntaxe : comf f,d ; NOT(f)  (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté :Z
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 55h puis on complémente cette valeur qui
devient alors AAh.
Reg_temp equ 0x0A ; 0A correspond à l'adresse d'un registre temporaire
movlw B’01010101’ ; on charge 55h dans le registre W
movwf Reg_temp ; on met W dans le registre temporaire
comf Reg_temp, 1 ; on complémente le contenu du registre temporaire

DECF : (DECrement F)
Décrémente le registre spécifié et le met en mémoire selon la valeur de d
Syntaxe : decf f,d ; (f) - 1  (d)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affecté: Z
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 01h puis on décrémente cette valeur qui
devient alors 00h ( flag Z = 1 dans cet exemple ) .
Reg_temp equ 0Ah ; 0A correspond à l'adresse d'un registre temporaire
movlw 01h ; on charge 01h dans le registre W
movwf Reg_temp ; on met W dans le registre temporaire
decf Reg_temp, 1 ; on décrémente le contenu du registre temporaire

DECFSZ : (DECrement F Skip if Zéro)


Décrémente un registre f et saute l'instruction suivante si le résultat de le décrémentation donne une
valeur nulle.
Syntaxe : decfsz f,d ; (f) - 1  ( d ) et sauter l' instruction suivante si f=0
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

GOTO : aller à
Cette instruction effectue ce que l’on appelle un saut inconditionnel. Elle contient les 11 bits de

L.HACINI M1 Electronique des Systèmes Embarqués Page 7


Chapitre 3 Programmation et jeu d’instructions

l’emplacement de destination. Les 2 bits manquants pour reconstituer l’adresse complète sont dans le
registre PCLATH.
Fonctionnement de goto :
 l’adresse de saut sur 11 bits est chargée dans le PC
 les deux bits manquants sont chargés depuis PCLATH (b3 et b4)
 le résultat donne l’adresse sur 13 bits
 la suite du programme s’effectue à la nouvelle adresse du PC
Syntaxe : goto étiquette
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

INCF: (INCrement F)
Incrémente le registre f et range le résultat dans l’emplacement mémoire selon d
Syntaxe : incf f,d ; (f) + 1  (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
incf x,f ; le contenu de x est augmenté de 1
; le résultat est stocké dans x
incf x,w ; le contenu de x est augmenté de 1 et stocké dans W, x n’est pas modifié
; le résultat est stocké dans x

INCFSZ : (INCrement F Skip if Zéro)


Incrémente le registre (f) et saute l'instruction suivante si (f) = 0
Syntaxe : incfsz f,d ;(f) + 1  (d) et saute si le résultat = 0
Nombre de cycle d'horloge : 1 ou 2
Bits du registre STATUS affectés : Aucun

IORLW : (Inclusif OR Literal with W)


Opération logique "OU" entre le registre W et une opérande k, le résultat est mis dans W
Syntaxe : iorlw k ;( W ) OR k  ( W )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté :Z
Exemple :
movlw 0x9A ; charger 0x9A dans W
iorlw 0x35 ; (W)=0xBF

IORWF: (Inclusif OR W with F)


Opération logique "OU" entre le registre W et le contenu du registre (adressage direct), le résultat est
orienté en fonction de la valeur de d.
Syntaxe : iorwf f,d ;( W ) OR ( f )  ( d )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté :Z

MOVF: (MOVe F)
Charge le contenu du registre spécifié dans la destination selon la valeur de d.
Syntaxe : movf f,d ; (f)  (d)

L.HACINI M1 Electronique des Systèmes Embarqués Page 8


Chapitre 3 Programmation et jeu d’instructions

Nombre de cycle d'horloge : 1


Bit du registre STATUS affecté :Z
Exemple :
Movf x,w ; met le contenu de x dans w

MOVLW : (MOVe Literal to W)


Charge une valeur immédiate dans le registre W
Syntaxe : movlw k ; k  ( W ), k est une valeur immédiate
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
Dans cet exemple on charge une valeur dans le registre W
movlw 0x25 ; on charge 25h dans le registre W

MOVWF: (MOVe W to F)
Charge le registre W dans le registre f
Syntaxe : movwf f ;(W)  (f)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
movlw 0x50 ; charge 0x50 dans w
movwf PORTB ; PORTB contient 0x50

NOP: (No OPeration)


Instruction qui ne fait rien et ne modifie rien mais occupe du temps.
Syntaxe : nop
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun

RETFIE: (RETurn From IntErrupt)


Cette instruction provoque un retour d'interruption
Syntaxe : retfie ; retour d’interruption
Haut de pile  ( PC )
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

RETLW : (RETurn with Literal in W)


Retour de sous-programme avec valeur dans W. c’est une instruction équivalente à l’instruction return,
mais permet de sortir d’un sous programme avec une valeur spécifiée dans W.
Syntaxe : retlw k ; k  ( W )puis retour
Haut de pile  ( PC )
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

Exemple :
retlw 0xFF ; retour de sous programme avec W contenant 0xFF

L.HACINI M1 Electronique des Systèmes Embarqués Page 9


Chapitre 3 Programmation et jeu d’instructions

RETURN: (RETURN from subroutine)


Retour de sous-programme. Cette instruction est indispensable à la fin d’un sous-programme, elle
permet de charger le compteur de programme avec l’adresse de retour qui a été sauvegardée dans la
pile.
Syntaxe : Return ; retour d'un sous programme
Haut de pile  ( PC )
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun

RLF: (Rotate Left F through carry)


Rotation vers la gauche en utilisant la retenue. Le bit de retenue C du registre d’état est décalé dans le
registre f et le résultat est placé en fonction de la valeur de d.
Syntaxe : rlf f,d ; (f) rotation gauche avec C  (d)
Carry  ( d0 )
( f0 )  ( d1 )
( f1 )  ( d2 )
( f2 )  ( d3 )
( f3 )  ( d4 )
( f4 )  ( d5 )
( f5 )  ( d6 )
( f6 )  ( d7 )
( f7 )  ( Carry )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : C

RRF: (Rotate Right F through carry)


Rotation à droite de ( f ) en utilisant le bit C
Syntaxe : rrf f,d ; (f) rotation droite avec C  (d)
( f0 )  Carry
( f1 )  ( d0 )
( f2 )  ( d1 )
( f3 )  ( d2 )
( f4 )  ( d3 )
( f5 )  ( d4 )
( f6 )  ( d5 )
( f7 )  ( d6 )
Carry  ( d7 )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : C

SLEEP: Mise en sommeil du microcontrôleur (Power Down mode)


Place le microcontrôleur en sommeil, la consommation de courant est minimale.
Syntaxe : sleep ; arrêt de l’horloge
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : PD=0 et TO=1

L.HACINI M1 Electronique des Systèmes Embarqués Page 10


Chapitre 3 Programmation et jeu d’instructions

SUBLW : (SUBstract W from Literal)


Soustraction entre une valeur littérale (opérande) et le registre W (méthode du complément à deux), le
résultat est placé dans W.
Syntaxe : sublw k ; k - ( W )  ( W ), exécute la soustraction k - contenu de W, résultat dans W
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés: C, DC, Z

SUBWF: (SUBstract W from F)


Soustraction du contenu de W à un registre f
Syntaxe : subwf f,d ;(f)-(W) (d)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Z, DC, C

SWAPF : (SWAP nibbles in F)


Cette operation inverse le quartet de poids faible avec celui de poids fort dans le registre spécifié.
Syntaxe : swapf,d ; ( f bit 0 à bit 3)  ( d bit 4 à bit 7 )
; ( f bit 4 à bit 7)  ( d bit 0 à bit 3 )
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun

XORLW : (eXclusif OR literal with W)


Opération logique XOR (ou exclusif) entre le contenu de W et l’opérande k
Syntaxe : xorlw k ; ( W ) XOR k  ( W )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
movlw 0x55 ; on charge 55h dans le registre W
xorlw 0x3C ; ou exclusif entre le contenu de W et 3Ah, le contenu du registre W = 69h

XORWF: (eXclusif OR W with F)


Opération logique XOR ( ou exclusif ) entre le contenu de W et f le résultat en d
Syntaxe : xorwf f,d ; ( W ) XOR ( f )  ( d )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z

3.5. CALCUL DU TEMPS D’EXECUTION D’UNE INSTRUCTION


Grâce aux caractéristiques du constructeur sur le jeu d'instructions des PIC on peut connaître le nombre
de cycles nécessaires pour l'exécution d'une instruction. Sachant que l'horloge interne divise par quatre
la fréquence issue du quartz, cela donne pour un quartz de 20 Mhz un temps machine de 0.2 µS par
cycle (F =5 MHz donc T =1/F = 0.2 µS).
A chaque fois que l'on désire fabriquer une temporisation, il faut calculer le nombre de temps machine
nécessaire pour exécuter la temporisation afin de déterminer la valeur exacte de la tempo.

L.HACINI M1 Electronique des Systèmes Embarqués Page 11


Chapitre 3 Programmation et jeu d’instructions

3.6. LE REGISTRE STATUS


C’est un registre qui contient les flags qui informent sur le résultat de la dernière opération. Ce registre
contient 8 bits

STATUS IRP RP1 RP0 TO PD Z DC C


03h, 83h, 103h ou183h R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x

 C (Carry) : Il passe à 1 quand une retenue apparaît sur le bit le plus significatif
 DC (Digit Carry) : Ce bit est utilisé principalement lorsque l’on travaille avec des nombres
BCD : il indique un report ou retenue du bit 3 vers le bit 4.
 Z (Zero) : ce bit est positionné à 1 si le résultat de la dernière opération logique ou arithmétique
vaut 0.
 PD (Power Down) : ce bit est actif au niveau zéro. Il est mis à 1 à la mise sous tension. PD est
mis à 0 par l’instruction SLEEP (état de basse consommation). Indique quel événement a
entraîné le dernier arrêt du PIC (instruction sleep ou dépassement du temps du watchdog).
 TO (Time-Out bit) : ce bit est actif au niveau zéro. Il est mis à 1 à la mise sous tension. Ce bit
est mis à 0 par le débordement du chien de garde, il peut indiquer si le redémarrage suit un arrêt
provoqué par débordement du compteur du chien de garde ou d’une mise en sommeil.
 RP0, RP1 (Register bank select) : ces deux bits permettent d’indiquer dans quel bloc de RAM
on veut travailler. Si RP0 et RP1 sont à 0 on utilise le bloc 0. Si RP0 et RP1 sont à 1 on utilise
le bloc 4.
 IRP (Indirect RP) : permet de choisir quel bloc de RAM on veut utiliser en cas d’adressage
indirect.

3.7. LES DIFFERENTS MODES D’ADRESSAGE

3.7.1. Adressage immédiat


Le code opératoire est suivi par l’opérande et ne fait appel à aucune adresse. L’opérande est la valeur à
utiliser par l’instruction.

Exemple :
MOVLW 0x34 ; charge la valeur hexadécimale 34 dans l’accumulateur

3.7.2. Adressage direct

L.HACINI M1 Electronique des Systèmes Embarqués Page 12


Chapitre 3 Programmation et jeu d’instructions

Le code opératoire est suivi d’un octet non signé qui est l’adresse effective de l’opérande à traiter.
L’opérande est l’adresse de la valeur à utiliser par l’instruction. L’adresse écrite sur 7 bits est
complétée, en adressage direct, par les bits RP0 et RP1 du registre STATUS.
Exemple :
MOVF 0x5,W ; charge l’accumulateur W avec la donnée située dans la case mémoire 5.
Si RP0 et RP1 sont à 0, l’adresse 5 est celle du port A dans le bloc mémoire 0 et si RP0 est à 1 et RP1
est à 0, l’adresse 5 devient 85, c’est l’adresse du registre TRISA dans le bloc 1.

3.7.3. Adressage indirect


L’adresse de l’opérande est écrite avec un pointeur d’adresse. L’adressage indirect utilise deux registres
du microcontrôleur : INDF et FSR.
INDF(INDirect File) est à l’adresse 0h. Ce registre est utilisé pour accéder à la donnée pointée par le
registre pointeur d’adresse FSR.
Pour accéder à la donnée contenue dans la case mémoire X, il suffit d’écrire dans le registre FSR
l’adresse X. en lisant le registre INDF, on trouve la valeur contenue dans la case mémoire X.
Le contenu du registre FSR pointe sur une adresse écrite sur 8 bits. Or, la zone RAM contient 4 blocs
(PIC 16F877). L’adresse complète est donc sur 9 bits réalisée par l’ajout du bit IRP du registre
STATUS.

Exemple :
Le registre à l’adresse 7 contient 0x0A.
Pour lire le contenu de cette case il suffit d’écrire 7 dans le FSR, puis de lire le contenu de INDF. En
incrémentant le contenu de FSR, on accédera au contenu de la case mémoire 8.

3.7.4. Adressage relatif


Ce mode d’adressage s’applique aux opérations de branchement ou de saut CALL et GOTO. Il permet
de faire exécuter des instructions placées dans une autre portion de l’espace mémoire de programme
que celle où se déroule le programme en cours. Cela en modifiant le contenu du compteur de
programme. L’adresse de la prochaine instruction à exécuter sera calculée en additionnant le contenu
du compteur de programme avec la valeur du déplacement additionnée de un. Le déplacement est un
octet en binaire signé généralement calculé en fonction d’une étiquette.

Exemple :
etiq decfsz T1,f
goto etiq

L.HACINI M1 Electronique des Systèmes Embarqués Page 13


Chapitre 3 Programmation et jeu d’instructions

Pendant l’assemblage l’étiquette etiq sera remplacée par la valeur du déplacement qui additionnée au
contenu du compteur de programme permettra à l’unité centrale d’effectuer l’instruction decfsz T1,f.
3.8. FORMAT DES INSTRUCTIONS
Une instruction est codée en un seul mot de 14 bits composé :
 D’un code opération ou code machine, disposé sur les bits de poids forts du mot, précisant le
type d’instruction.
 D’une ou plusieurs opérandes codées sur les bits restants précisant l’opération de l’instruction.
On distingue trois grands types d’instruction :
3.8.1. Opérations orientées mots des registres
Dans ce cas des instructions orientées mot, selon l’état du bit du rang 7 de l’instruction, le résultat de
l’instruction sera logé dans l’accumulateur W si d=0 ou dans le registre considéré de la zone mémoire
si d=1.

Exemple :
ADDWF 0x40,1
Cette instruction accomplit l’addition : W+(0x40)  (0x40)
Son codage sur 14 bits est :
ADDWF d 0x40
000111 1 1000000
3.8.2. Opérations de manipulations de bits
L’adresse du bit est écrite sur 3 bits et l’adresse du registre sur les 7 bits de poids faible

Exemple :
BCF 0x40, 3 ; met à 0 un bit dans le registre (0x40)
Son codage sur 14 bits est :
BCF 3 0x40
0100 011 1000000
3.8.3. Opérations de branchement
L’adresse de destination sur 11 bits ne permet qu’un saut à l’intérieur d’une page de mémoire (2Ko).
Pour accéder à une adresse plus lointaine il faut mettre en œuvre les bits b3 et b4 du registre PCLATH.
Exemple :
goto etiq ; etiq est l’étiquette correspondant à la destination
Son codage sur 14 bits est :
101 xxxxxxxxxxx
Code machine adresse de destination

L.HACINI M1 Electronique des Systèmes Embarqués Page 14


Chapitre 4 Les interruptions du PIC 16F877

4.1. INTRODUCTION
Une interruption comme son nom l’indique, interrompt un programme en cours (appelé aussi
programme principal) pour faire exécuter à l’unité centrale un autre travail (suite s’instructions appelée
sous-programme). Celui-ci se termine par une instruction de retour d’interruption (RETFIE) qui permet
à l’unité centrale de reprendre le programme principal où il a été quitté.

4.2. OPERATION EFFECTUEES LORS D’UNE INTERRUPTION SUR LES PIC


La demande étant généralement provoquée par un événement extérieur, elle n’est pas synchrone avec le
déroulement de l’instruction en cours par conséquent :

 l’instruction en cours est d’abord complètement terminée.


 Puis le registre PC contenant l’adresse de retour est seul sauvegardé dans la pile, ce qui impose
au programmeur de sauvegarder si cela est nécessaire les valeurs contenues dans l’accumulateur
et le registre d’état ;
 Le bit GIE (masque général d’interruption) du registre INTCON est mis à 0, il interdit ainsi la
prise en compte d’une nouvelle demande
 L’adresse du sous-programme d’interruption 0x04 est chargée dans le PC puis le sous-
programme d’interruption est effectué.
 Un temps d’attente de 3 ou 4 cycles d’horloge après l’apparition de la demande permet toutes
ces opérations et notamment le chargement du PC de s’effectuer
 Quand le sou programme d’interruption est terminé, celui-ci se termine obligatoirement par
l’instruction RETFI.

Le temps de réaction d’une interruption est calculé de la manière suivante :


 Le cycle courant de l’instruction est terminé.
 Le flag d’interruption est lu au début du cycle suivant.
 Le processeur s’arrête un cycle pour charger l’adresse 0x04 dans le PC.
 Le processeur se connecte alors à l’adresse 0x04 où il lui faudra un cycle supplémentaire pour
charger l’instruction à exécuter.
Remarques :
 Une interruption ne peut pas être interrompue par une autre interruption. Les interruptions sont
donc invalidées automatiquement lors du saut à l’adresse 0x04 par l’effacement du bit GIE
(General Interrupt Enable) du registre INTCON.

L.HACINI MCIL3_Les Microcontrôleurs Page 1


Chapitre 4 Les interruptions du PIC 16F877

 La ligne INT peut être rendu sensible à un front descendant en plaçant à 0 le bit INTEDG
(Interrupt EDGe) du registre OPTION et inversement.
 Les interruptions sont remises en service automatiquement lors du retour de l’interruption.
L’instruction RETFIE agit donc exactement comme l’instruction RETURN, mais elle
repositionne en même temps le bit GIE.
 Le contenu du PC est sauvé sur la pile interne (8 niveaux). Donc, si on utilise des interruptions,
on ne dispose que de 7 niveaux d’imbrication pour les sous-programmes.

4.3. ORIGINE D’UNE INTERRUPTION


Voici un tableau récapitulatif des 14 interruptions disponibles sur le 16F877.

Déclencheur Flag Registre Adresse Enable Registre Adresse


Timer 0 T0IF INTCON 0x0B T0IE INTCON 0x0B
RB0/INT INTF INTCON 0x0B INTE INTCON 0x0B
RB4/RB7 RBIF INTCON 0x0B RBIE INTCON 0x0B
Convert A/D ADIF PIR1 0x0C ADIE PIE1 0x8C
RX USART RCIF PIR1 0x0C RCIE PIE1 0x8C
TX USART TXIF PIR1 0x0C TXIE PIE1 0x0C
Port série SSP SSPIF PIR1 0x0C SSPIE PIE1 0x8C
Module CCP1 CCP1IF PIR1 0x0C CCP1IE PIE1 0x8C
Module CCP2 CCP2IF PIR2 0x0D CCP2IE PIE2 0x8D
Timer 1 TMR1IF PIR1 0x0C TMR1IE PIE1 0x8C
Timer 2 TMR2IF PIR1 0x0C TMR2IE PIE1 0x8C
EEPROM EEIF PIR2 0x0D EEIE PIE2 0x8D
SSP mode I2C BCLIF PIR2 0x0D BCLIE PIE2 0x8D
Port parallèle PSPIF PIR1 0x0C PSPIE PIE1 0x8C
Tableau 4.1. Les sources d’interruptions du 16F877
Avec :
 Déclencheur : Evénement ou fonction qui est la source de l’interruption
 Flag : Bit qui se trouve positionné lorsque l’événement survient
 Registre : Registre auquel le flag appartient
 Adresse : Adresse de ce registre (tous en banque0, avec INTCON présent dans les 4 banques)
 Enable : nom du bit qui permet d’autoriser ou non l’interruption
L.HACINI MCIL3_Les Microcontrôleurs Page 2
Chapitre 4 Les interruptions du PIC 16F877

 Registre : Registre qui contient ce bit


 Adresse : adresse de ce registre (tous en banque1, avec INTCON dans les 4 banques)

4.4. DETERMINATION DE L’ORIGINE DE LA DEMANDE D’INTERRUPTION ET


MASQUE D’INTERRUPTIONS
Il y a plusieurs origines possibles et c’est au programmeur de trouver l’origine de la demande. Pour
cela il faut lire les indicateurs (flags) qui indiquent chacun une source de la demande. Ces bits, situés
dans le registre INTCON, passent à 1 quand une demande est apparue.
Pour qu’une interruption puisse être prise en compte il faut que le GIE (masque général) autorise les
interruptions en étant à 1 et que le masque correspondant à cette interruption soit à 1. De même les
masques d’interruptions sont situés dans le registre INTCON.

4.4.1. Le registre INTCON (INTerrupt CONtrol)


Ce registre se situe à l’adresse 0x0B, dans les quatre banques. Il est donc toujours accessible.

INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF


0Bh, 8Bh,10Bh et 18Bh R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x

 GIE (Global Interrupt Enable) : interdit toutes les interruptions tant qu’il est à 0. Ce bit est mis
à 0 automatiquement pendant un sous-programme d’interruption par l’unité centrale pour éviter
de perturber le déroulement de celui-ci. Il est remis à 1 par l’instruction RETFIE.
 PEIE (PEripheral Interrupt Enable) : il permet de valider toutes les interruptions périphériques
 T0IE (Timer0 Interrupt Enable) : Valide l’interruption générée par le débordement du timer0.
 INTE (INTerrupt Enable) : associé à la connexion RB0/INT de demande externe
d’interruption. Il autorise l’interruption quand il est à 1.
 RBIE (RB port change Interrupt Enable) : autorise quand il est à 1 les interruptions demandées
par un changement d’état de l’une des connexions RB4 à RB7 du port B.
 T0IF (Timer0 Interrupt Flag) : ce bit est mis à 1 quand le compteur TMR0 déborde c’est à dire
quand son contenu passe de FFh à 00h.
 INTF (Interrupt Flag) : signale une transition sur la pin RB0 dans le sens déterminé par
INTEDG du registre OPTION (b6).

L.HACINI MCIL3_Les Microcontrôleurs Page 3


Chapitre 4 Les interruptions du PIC 16F877

 RBIF (port change Interrupt Flag) : ce bit est mis à 1 quand un changement d’état est détecté
sur une des connexions RB4 à RB7 du port B. ces quatre connexions sont indissociables, c'est-
à-dire que l’événement est pris en compte quelle que soit la connexion stimulée.

En fait, MICROCHIP a scindé les interruptions entre les interruptions primaires et les interruptions
secondaires, appelées aussi interruptions périphériques.

4.4.2. Mise en service des interruptions primaires


On dispose de 3 interruptions primaires (Timer 0, RB0/INT et RB4/RB7). C’est à dire utilisables
exactement de la même manière que pour le 16F84. Pour mettre en service une de ces interruptions, on
doit :
1. Valider le bit concernant cette interruption
2. Valider le bit GIE qui met toutes les interruptions choisies en service

4.4.3. Mise en service des interruptions périphériques


Les interruptions périphériques sont tributaires du bit de validation générale des interruptions
périphériques PEIE (PEripheral Interrupt Enable). Les 3 étapes nécessaires à la mise en service d’une
telle interruption sont:
1. Validation du bit concernant l’interruption dans le registre concerné (PIE1 ou PIE2)
2. Validation du bit PEIE du registre INTCON
3. Validation du bit GIE qui met toutes les interruptions en service.

Remarque :
La mise en service de PEIE ne dispense pas l’initialisation du bit GIE, qui reste de toute façon
prioritaire. Cette architecture permet de couper toutes les interruptions d’un coup (effacement de GIE)
ou de couper toutes les interruptions périphériques en une seule opération (effacement de PEIE) tout en
conservant les interruptions primaires.
Tous les indicateurs activés doivent être remis à 0 durant le sous-programme d’interruption.

4.4.4. Les registres PIE1, PIE2, PIR1 et PIR2


Le nombre des sources d’interruptions a augmenté dans le cas du 16F877 par rapport au 16F84. Donc
le registre INTCON ne peut pas les géré tous, les autorisations d’interruptions vont se trouver dans
d’autres registres. Ces registres sont PIE1 et PIE2. Les flags correspondants se trouvent quant à eux
dans les registres PIR1 et PIR2.

L.HACINI MCIL3_Les Microcontrôleurs Page 4


Chapitre 4 Les interruptions du PIC 16F877

Les deux registres d’autorisations (PIE1 et PIE2) se trouvent en banque 1, tandis que les registres de
flags (PIR1 et PIR2) se trouvent en banque 0.

Registre adresse B7 B6 B5 B4 B3 B2 B1 B0
PIE1 0x8C PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
PIR1 0x0C PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE2 0x8D NI réservé NI EEIE BCLIE NI NI CCP2IE
PIR2 0x0D NI réservé NI EEIF BCLIF NI NI CCP2IF
Tableau 4.2. Les registres PIE1, PIE2, PIR1 et PIR2

Il y a quelques bits non implémentés, qui donneront toujours 0 s’ils sont lus, mais aussi 2 bits réservés
qu’il est impératif de maintenir à 0.
Les bits des registres PIEx permettent d’autoriser les interruptions correspondantes, mais ces bits ne
sont opérationnels que si le bit PEIE du registre INTCON est mis à 1. Dans le cas contraire, toutes ces
interruptions sont invalidées.

Registre PIE1
 PSPIE : Lecture/écriture sur le port PSP (Parallel Slave Port)
 ADIE : Conversion analogique/numérique
 RCIE : Réception d’un caractère sur le port série USART
 TXIE : Emission d’un caractère sur le port série USART
 SSPIE : Communication sur le port série synchrone SSP
 CCP1IE : Evénement sur compare/capture registre 1
 TMR2IE : Correspondance de valeurs pour le timer TMR2
 TMR1IE : Débordement du timer TMR1

Registre PIE2
 EEIE : Ecriture dans l’EEPROM
 BCLIE : Collision de bus pour le port série synchrone I2C
 CCP2IE : Evénement sur compare/capture registre 2

Registre PIR1
 PSPIF : Lecture ou écriture terminée sur le port parallèle
 ADIF : Fin de la conversion analogique/numérique
 RCIF : Le buffer de réception de l’USART est plein (lecture seule)

L.HACINI MCIL3_Les Microcontrôleurs Page 5


Chapitre 4 Les interruptions du PIC 16F877

 TXIF : Le buffer d’émission de l’USART est vide (lecture seule)


 SSPIF : Fin de l’événement dépendant du mode de fonctionnement comme suit :
Mode SPI Un caractère a été envoyé ou reçu
Mode I2C esclave Un caractère a été envoyé ou reçu
Mode I2C maître Un caractère a été envoyé ou reçu
 CCP1IF : Evénement compare/capture 1 détecté suivant mode :
Mode capture : capture de la valeur TMR1 réalisée
Mode compare : La valeur de TMR1 atteint la valeur programmée
 TMR2IF : La valeur de TMR2 atteint la valeur programmée
 TMR1IF : Débordement du timer TMR1

Registre PIR2
 EEIF : Fin d’écriture de la valeur en EEPROM
 BCLIF : Collision de bus, quand le SSP est configuré en maître I2C
 CCP2IF : Evénement compare/capture 2 détecté suivant le mode :
Mode capture : capture du TMR1 réalisée
Mode compare : La valeur de TMR1 atteint la valeur programmée

4.5. LE REGISTRE OPTION


Le registre OPTION est un registre utilisable en lecture et en écriture. Il permet de configurer le
prédiviseur du compteur, l’interruption externe INT et de mettre en place des rappels de potentiel sur le
port B. après RESET tous ses bits sont à 1. Ce registre se situe aux adresses 81h et 181h, il est constitué
comme suit :

OPTION-REG RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0


81h et 181h R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1

Avec :
 RBPU : Pull up du port B
Une résistance de rappel (environ 50K) est reliée au +5 volt sur chaque connexion du PORTB,
quand le bit RBPU est mis à 0(actif au niveau bas). Ce bit valide simultanément les résistances
sur toutes les connexions du PORTB.
 INTEDG : sélection du front du signal de demande d’interruption.

L.HACINI MCIL3_Les Microcontrôleurs Page 6


Chapitre 4 Les interruptions du PIC 16F877

- Si INTEDG=1, une interruption est demandée si le niveau sur la connexion RB0(INT) passe
de 0 vers 1 (front montant)
- Si INTEDG=0, l’interruption s’effectue lors de la transition de 1 vers 0 (front descendant).

 TOCS : sélection de la source d’horloge du compteur.


Le timer0 est incrémenté par l’horloge interne Fosc/4 (synchronisé au programme) si TOCS=0,
sinon il compte les impulsions reçues sur la connexion RA4/TOCKI

 TOSE : sélectionne de front de la source d’horloge du compteur


Si TOSE=1, l’incrémentation se fait quand le signal passe de 0 à 1 (front montant) sur la
connexion RA4/TOCKI, et inversement.

 PSA : assignation du prédiviseur


Dans le PIC il y a un prédiviseur. Ceci indique le nombre d’impulsions qui devront être reçues
pour provoquer une incrémentation de la destination.
Ce prédiviseur peut servir à une des deux fonctions suivantes (et pas les deux) : soit il effectue
une prédivision au niveau du compteur du chien de garde (watchdog) si PSA =1, soit il effectue
une prédivision pour le TMR0 si PSA=0 (voir tableau 8.1).

 PS2,PS1,PS0 : réglage de la prédivision


Ces trois bits déterminent la valeur de prédivision pour le registre déterminé par le bit PSA. Il y
a donc 8 valeurs possibles. Les valeurs sont différentes pour le Watchdog et pour TMR0. En
effet, il n’y pas de division par 1 pour ce dernier registre. Si on désire de ne pas utiliser le
prédiviseur, on doit mettre PSA=1 (prédiviseur sur Watchdog) et PS2 à PS0 à 0.

L.HACINI M1 Electronique des Systèmes Embarqués Page 7


Chapitre 4 Les interruptions du PIC 16F877

PSA PS2 PS1 PS0 Taux pour TMR0 Taux pour WD


0 0 0 0 2 1
0 0 0 1 4 1
0 0 1 0 8 1
0 0 1 1 16 1
0 1 0 0 32 1
0 1 0 1 64 1
0 1 1 0 128 1
0 1 1 1 256 1
1 0 0 0 1 1
1 0 0 1 1 2
1 0 1 0 1 4
1 0 1 1 1 8
1 1 0 0 1 16
1 1 0 1 1 32
1 1 1 0 1 64
1 1 1 1 1 128
Tableau 4.3. Les valeurs de prédivision.

4.6. SAUVEGARDE ET RESTAURATION DE L’ENVIRONNEMENT


Lors d’une interruption le programme sauvegarde seulement la valeur du PC pour le retour au
programme principal après l’exécution du sou programme d’interruption, les autres registres doivent
être sauvegardés par le programmeur (si nécessaire), et ce pour permettre au programme de continuer à
fonctionner correctement une fois le traitement de l’interruption terminé.

Exemple :
Supposons qu’un programme interrompu entre les deux instructions suivantes :
movf var,w
btfss STATUS,z

Il est probable que le sous-programme d’interruption utilise une instruction qui modifie le bit Z. on doit
donc restaurer le registre STATUS dans l’état qu’il était avant de sortir du sous-programme
d’interruption. Sinon le test ne se fera pas sur la valeur de var, mais sur une valeur modifié par le sous-
programme d’interruption. De même, le registre de travail W peut aussi être modifié, donc il faut le
sauvegardé également.

4.6.1. Les registres à sauvegarder


Le PC est sauvegardé automatiquement, le programme revient donc à la bonne adresse tout seul. S’il y
a d’autres registres à sauvegarder, ce sera en fonction du fonctionnement du programme. Les registres à
sauver obligatoirement dans la plupart des cas sont STATUS et W.

L.HACINI M1 Electronique des Systèmes Embarqués Page 8


Chapitre 4 Les interruptions du PIC 16F877

Si, dans le sous-programme d’interruption et dans le programme principal, on utilise l’adressage


indirect, on doit également sauvegarder FSR.

4.6.2. La méthode de sauvegarde


Pour sauver les registres W et STATUS on utilise une méthode tout à fait classique. Il importe de
commencer par sauver W avant STATUS, puisque la sauvegarde de STATUS impose de d’abord
charger ce registre dans le registre de travail, ce qui induit donc la perte du registre W.
La sauvegarde se fait par les instructions suivantes :
movwf w_temp ; sauver W dans un registre
swapf STATUS,w ; transfère STATUS dans w
movwf statu_temp ; sauvegarde de STATUS

Ou bien, d’une autre façon :


movwf w_temp ; sauver W dans un registre
movf STATUS,w ; transfère STATUS dans w
movwf statu_temp ; sauvegarde de STATUS

4.6.3. La méthode de restauration


Les instructions de restauration sont :
swapf status_temp,w ; charge le STATUS sauvegardé dans W
movwf STATUS ; restaurer STATUS
swapf w_temp,f ; inverse l’emplacement des bits sauvegardés
swapf w_temp,w ; réinverse et amène le résultat dans W

Ou bien, d’une autre façon :


movf status_temp,w ; charge le STATUS sauvegardé dans W
movwf STATUS ; restaurer STATUS
swapf w_temp,f ; inverse l’emplacement des bits sauvegardés
swapf w_temp,w ; réinverse et amène le résultat dans W

Il est à noter que :


 la première méthode de restauration correspond à la première méthode de sauvegarde
 l’utilisation de deux SWAP pour restaurer W est obligatoire.

4.6.4. La structure de base d’un sous-programme d’interruption


Le sous-programme d’interruption doit avoir la structure suivante :

L.HACINI M1 Electronique des Systèmes Embarqués Page 9


Chapitre 4 Les interruptions du PIC 16F877

;****************************** sous-programme d’interruption *****************************


; sauvegarder les registres
org 0x004 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé

; switch vers différentes interruptions


; on test de quelle interruption il s’agit, on la traite et on efface son flag

;restaurer les registres


swapf status_temp,w ; swap ancien STATUS, résultat dans W
movwf STATUS ; restaurer STATUS
swapf w_temp,f ; inversion de l’emplacement des bits de poids fort et de poids
;faible de l’ancien W
swapf w_temp,w ; ré-inversion de l’emplacement des bits dans W
retfie ; retour de l’interruption

L.HACINI M1 Electronique des Systèmes Embarqués Page 10


Chapitre 5 La liaison SPI du module MSSP
5.1. INTRODUCTION
La liaison SPI (Serial Peripheral Interface) est une liaison série synchrone qui fait partie du module
MSSP. Elle transmet à la fois les données (bits) mais aussi un signal d’horloge qui synchronise la
réception de ces données. Cette liaison permet de relier le microcontrôleur à de nombreux
périphériques équipés de registres à décalage tels que les afficheur, EEPROM à liaison série,
convertisseur, etc. dans ce mode de liaison, il y a un maître et un ou plusieurs esclaves, c’est le maître
qui génère l’horloge nécessaire au transfert en lecture depuis l’esclave ou en écriture vers l’esclave.

5.2. DEFINITIONS
 Le module MSSP (Master Synchronous Serial Port), permet l’échange de données du PIC avec le
mode extérieur, en utilisant des transmissions série synchrones.
 SPI signifie : Serial Peripheral Interface.
 Une liaison série est une liaison qui transfère les données bit après bit (en série), au contraire d’une
liaison parallèle, qui transmet un mot à la fois (mot de 8 bits, 16 bits, ou plus suivant le
processeur).
 La notion de synchrone signifie que l’émetteur/récepteur fournira un signal de synchronisation qui
déterminera non seulement le début et la fin de chaque octet, mais également la position de chaque
état stable des bits.
 Il y en a deux façons d’envoyer les bits à la suite les uns des autres :
 Soit on commence par le bit 7, et on le poursuit par les autres bits jusqu’au bit 0. C’est la
méthode utilisée par le module MSSP.
 Soit on procède d’une façon inverse, d’abord le bit 0 jusqu’au bit de poids le plus fort. C’est de
cette façon que fonctionnera le module USART.

5.3. CONSTITUTION
Cette interface est pilotée par deux registres de la MSSP :
 Le registre de contrôle SSPCON d’adresse 14h.
 Le registre d’état SSPSTAT d’adresse 94h.
 A ces registres s’ajoutent le SSPSR (Synchronous Serial Port Shift Register), qui contient la
donnée en cours de transfert, et le registre SSPBUF (Synchronous Serial Port BUFfer) qui
contient l’octet à envoyer, ou l’octet reçu.

L.HACINI M1 Electronique des Systèmes Embarqués Page 1


Chapitre 5 La liaison SPI du module MSSP
5.4. EXEMPLE DE CABLAGE
Dans le mode SPI, le PIC peut émettre et recevoir. Il peut gérer lui-même l’horloge (mode master) ou
subir l’horloge gérée par un autre microprocesseur (mode slave). Dans ce dernier cas, il peut également
y avoir d’autres esclaves (mode multi-slave).

16F877 maître Circuit esclave


SDO Réception

SDI Emission

SCK Horloge

(a)

(b)

Fig 5.1. Exemples de câblage d’une liaison SPI


(a) Avec un seul esclave (b) avec deux esclaves

Avec :
SD0 (RC5) : Serial Data Out sortie de donnée
SDI (RC4) : Serial Data Input entrée de donnée
SCK (RC3/SDA) : Serial ClocK sortie d’horloge sur maître
(entrée d’horloge sur esclave)
SS (RA5/AN4) : Slave Select
Cette ligne de sélection, qui fait partie du port A, active au niveau bas, permet au maître d’activer la
SPI de l’esclave avec qui dialoguer dans un réseau. En cas de dialogue entre plusieurs
microcontrôleurs, si la connexion SS est au niveau haut le microcontrôleur est maître, et à l’inverse, si

L.HACINI M1 Electronique des Systèmes Embarqués Page 2


Chapitre 5 La liaison SPI du module MSSP
SS est au niveau bas le microcontrôleur est esclave. Toutefois, s’il n’y a qu’un esclave, l’usage de la
connexion SS n’est pas obligatoire.

5.5. FONCTIONNEMENT DE L’INTERFACE


Grâce au câblage du registre à décalage on peut émettre et recevoir simultanément, quand une donnée
est envoyée une autre est reçue. Le transfert est contrôlé par le maître, quand un maître veut recevoir
une donnée d’un esclave, il lui faut écrire un mot dans son buffer, afin de générer l’horloge
indispensable à l’esclave.
Quand un mot est transmis, il faut lire le buffer avant de transmettre à nouveau même si la donnée
reçue est sans intérêt.
Un bit de donnée change sur un front de l’horloge SCK (registre à décalage), et il est verrouillé en
réception sur le front opposé de SCK

Fig 5.2. Chronogramme de fonctionnement d’une liaison SPI

5.5.1. Le mécanisme général de fonctionnement

5.5.1.1. Côté émetteur


L’octet à envoyer est placé dans le registre SSPBUF. La donnée est recopiée automatiquement par le
PIC dans le registre SSPSR, qui est un registre destiné à sérialiser la donnée (la transformer en bits
successifs).
Comme le premier bit à envoyer est le bit 7, le registre devra décaler vers la gauche. IL fonctionne
donc comme l’instruction RLF, sauf que le bit sortant n’est pas envoyé vers le carry, mais directement
sur la ligne SDO. Le mécanisme se poursuit jusqu’à ce que les 8 bits soient envoyés.

5.5.1.2. Côté récepteur


Le bit reçu sur la ligne SDI est entré par le côté droit du registre SSPSR, donc par le bit 0. Ce registre
subit alors un décalage vers la gauche qui fait passer ce bit en position b1. Le bit suivant sera alors reçu

L.HACINI M1 Electronique des Systèmes Embarqués Page 3


Chapitre 5 La liaison SPI du module MSSP
en position b0, et ainsi de suite. Le dernier bit reçu entraîne automatiquement la copie de la donnée
contenue dans SSPSR vers le registre SSPBUF.
Il est à noter qu’il n’y a qu’un seul registre SSPSR, et un seul SSPBUF, ce qui indique que l’émission
et la réception se font simultanément au sein d’un même PIC de la façon suivante :
 On transfère la donnée à émettre dans SSPBUF
 Le PIC copie cette donnée dans SSPSR
 On opère 8 décalages vers la gauche, chaque bit sortant est envoyé vers SDO, chaque bit
entrant
provient de SDI
 Le PIC copie la donnée vers SSPBUF, donc remplace la donnée à émettre par la donnée reçue.
A ce moment, le bit BF est positionné, indiquant que SSPBUF contient une donnée à lire, et le
flag SSPIF est positionné également pour indiquer la fin du cycle. Donc, toute émission
s’accompagne automatiquement d’une réception, et réciproquement, toute réception nécessite
une émission. L’octet éventuellement non nécessaire (reçu ou émis) sera un octet factice, sans
signification, souvent appelé dummy.

5.5.2. Programmation des lignes de l’interface


Les sens de transfert des connexions de l’interface sont à programmer :
 SDO (RC5) es une sortie il faut donc mettre le bit 5 de TRISC à 0.
 Si SCK est une entrée pour l’esclave TRISC(3) doit être à 1.
 Si SCK est une sortie pour le maître TRISC(3) doit être à 0.
 La ligne SDI est l’entrée de données, donc définie en entrée.
Pour SS, la ligne RA5 du port A doit être configurée comme une entrée/sortie numérique dans le
registre de contrôle ADCON1.
Si une connexion n’est pas utilisée, elle doit être programmée en sens inverse de sont utilisation
normale.

5.5.2.1. Le registre de contrôle SSPCON (Synchronous Serial Port CONtrole)


Ce registre est constitué des bits organisé selon le tableau suivant :
SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
14h R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0

Avec :
WCOL : Write COLlision detect bit
L.HACINI M1 Electronique des Systèmes Embarqués Page 4
Chapitre 5 La liaison SPI du module MSSP
SSPOV : SSP receive Overflow indicator bit (=1, perte de l’octet reçu)
Ce bit passé à 1 quand un nouveau mot est reçu alors que le buffer SSPBUF contient la
donnée précédente (débordement). La donnée dans le registre à décalage (SSPSR) est
perdue. En mode esclave, le programme doit lire le SSPBUF afin d’évier le débordement. Ce
bit doit être remis à 0 par programme.
SSPEN : SSP ENable (=1, module SSP en service)
à 1, il met en service le port série et configure les lignes SCK, SDO, SDI et SS. Dans ce cas
il faut que les lignes soient configurées correctement en entrées et en sorties via TRISC.
CKP : ClocK Polarity select bit (détermine le niveau de l’état de repos de l’horloge)
CKP=0 : repos de l’horloge au niveau 0
CKP=1 : repos de l’horloge au niveau 1
SSPM3 à SSPM0: Synchronous Serial Port Mode select bits
Les bits de sélection du mode de fonctionnement comme le montre le tableau suivant :
M3 M2 M1 M0 Origine de l’horloge
0 0 0 0 Fosc/4
0 0 0 1 Fosc/16
0 0 1 0 Fosc/64
0 0 1 1 TMR2 output/2
0 1 0 0 Entrée SCK-SS en service
0 1 0 1 Entrée SCK-SS libre
Tableau 5.1. Mode de fonctionnement

Pour la SPI en maître, ces bits permettent de déterminer l’origine (TMR2 ou OSC) et la fréquence de
l’horloge de transmission, pour la SPI en esclave, ils mettent en service ou non la ligne SS.

5.5.2.2. le registre d’état SSPSTAT (Synchronous Serial Port STATus )


Le registre SSPSTAT permet de suivre le bon fonctionnement de la transmission. Il est constitué de
trois bits selon le tableau suivant :
SSPSTAT SMP CKE BF
94h R/W-0 R/W-0 R-0

Avec :
SMP : data SaMPle timing
Echantillonnage d’un bit sur l’entrée SDI. Permet de définir à quel moment du cycle d’horloge
on effectue la capture du bit présent sur SDI
 SPI mode maître :
SMP=1 : l’échantillonnage de la donnée reçue a lieu à la fin du bit de donnée.
L.HACINI M1 Electronique des Systèmes Embarqués Page 5
Chapitre 5 La liaison SPI du module MSSP
SMP=0 : l’échantillonnage a lieu au milieu du bit.
Ce réglage de l’échantillonnage permet d’être compatible avec tout esclave
 SPI mode esclave :
Dans ce mode de fonctionnement SMP doit être mis à 0.
CKE : SPI ClocK Edge select
Ce bit détermine quel sens de transition de l’horloge accompagne le placement du bit sur SDO
 Si CKP=0
CKE=1 : la donnée est transmise sur un front montant de l’horloge SCK
CKE=0 : la donnée est transmise sur un front descendant de l’horloge SCK
 Si CKP=1
CKE=1 : la donnée est transmise sur un front descendant de l’horloge SCK
CKE=0 : la donnée est transmise sur un front montant de l’horloge SCK
BF : Buffer Full
Ce bit est un indicateur (lecture seule). Il indique quand il est à 1 que le registre de réception
(SSPBUF) est plein. Il faut lire le buffer avant toute autre lecture ou écriture aussi pour le maître
que pour l’esclave.

5.5.2.3. Le registre PIR1


Seul le bit SSPIF du registre PIR1 est utilisé ; il indique la fin d’un transfert dans l’interface en passant
à 1. Une interruption peut être demandée si SSPIE du registre PIE1 l’autorise.

5.6. UTILISATION DE L’INTERFACE


Pour mettre en service l’interface SPI, il faut mettre à 1 le bit SSPEN du registre SSPCON. La structure
de l’interface comprend deux registres, un registre à décalage SSPSR et un registre tampon SSPBUF.
Une écriture dans le registre suffit pour émettre, le bit SSPIF passe à 1 à la fin de l’émission et doit être
remis à 0 avant d’émettre à nouveau. Une nouvelle donnée ne peut donc être envoyée si le précédent
transfert n’est pas terminé.
Une horloge générée par le maître synchronise le décalage et l’échantillonnage sur les deux lignes de
données (SDI et SDO)
Le passage à 1 du bit SSPIF du registre PIR1 qui indique la fin d’un transfert, peut provoquer une
demande d’interruption. Celle-ci est prise en compte si elle est autorisée par le bit SSPIE du registre
PIE1, par le masque des interruptions périphériques PEIE du registre INTCON et par le bit GIE
(masque global)

L.HACINI M1 Electronique des Systèmes Embarqués Page 6


Chapitre 6 Utilisation de l’EEPROM du PIC 16F877
6.1. INTRODUCTION
L’EEPROM est une mémoire que l’on peut programmer et effacer électriquement. Le programme du
microcontrôleur peut directement écrire des données dans cette mémoire non volatile. L’effacement
peut se faire par réécriture de données.

6.2. MISE EN OEUVRE


Le microcontrôleur PIC 16F877 contient 256 octets d’EEPROM, l’adresse relative de l’accès est donc
comprise entre 0x00 et 0xFF, ce qui permet de n’utiliser qu’un registre de 8 bits pour définir cette
adresse. Ces octets sont placés à l’adresse 2100h.
Pour lire ou écrire par programme, on utilise un adressage relatif grâce à un registre spécifique.
L’adresse de début de la zone est 0x00 et l’adresse de fin est 0xFF.
L’utilisation de l’EEPROM se fait grâce à quatre registres :

 EEDATA, à l’adresse 10Ch du bloc mémoire 2, est un registre de transition pour les données
en lecture et en écriture. C’est dans ce registre que transitent les données transférées.

 EEADR, à l’adresse 10D du bloc mémoire 2, précise l’adresse de lecture ou d’écriture dans
l’EEPROM.

 EECON1, à l’adresse 18Ch du bloc mémoire 2, est un registre de contrôle d’accès à la mémoire
EEPROM. Il se compose de 5 bits comme le montre la figure suivante :

EECON1 EEPGD - - - WRERR WREN WR RD


18Ch - - - - R/W-x R/W-0 R/W-0 R/W-x

- RD (ReaD control bit) : ce bit mis à 1 démarre un cycle de lecture. Il est remis à 0
automatiquement à la fin de la lecture. Il ne peut être mis à 0 par programme.
- WR (WRite control bit) : ce bit démarre un cycle d’écriture quand il est mis à 1. il est
mis à 0 automatiquement à la fin du cycle d’écriture et ne peut être mis à 0 par
programme.
- WREN (WRite ENable bit) :ce bit autorise un cycle d’écriture quand il est mis à 1. a la
mise en service du microcontrôleur (Reset), il est à 0.
- WRERR (WRite eeprom ERRor bit) : c’est un indicateur d’erreur en écriture, il passé à 1
quand un cycle d’écriture à été interrompu par un RESET ou par le chien de garde. Il

L.HACINI M1 Electronique des Systèmes Embarqués Page 1


Chapitre 6 Utilisation de l’EEPROM du PIC 16F877
peut être lu par le programmeur pour éventuellement recommencer l’écriture. La donnée
et l’adresse de travail restent inchangées.
- Les bits 4 à 6 : non utilisés
- EEPGD (EEprom ProGram/Data select bit): ce bit permet de sélectionner l’écriture en
mémoire EEPROM ou en mémoire FLASH.

 EECON2, à l’adresse 18Dh du bloc mémoire 2, est un registre de contrôle qui n’existe pas
physiquement, il ne sert qu’a des commandes spécifiques d’écriture. Sa lecture donne 0.
MICROCHIP l’utilise en tant que registre de commande. L’écriture de valeurs spécifiques dans
EECON2 provoque l’exécution d’une commande spécifique dans l’électronique interne du PIC.

6.3. LECTURE DANS L’EEPROM


Pour lire un octet il suffit de mettre une adresse dans le registre d’adresses EEADR, puis de lancer le
cycle de lecture avec le bit RD de registre EECON1. le résultat de la lecture se trouve alors dans le
registre de données EEDATA jusqu’à ce qu’elle soit modifiée par le programme (nouveau cycle de
lecture ou d’écriture).
Ce cycle de lecture est souvent utilisé, il est donc intéressant de le transformer en macro pour simplifier
le programme. Cette macro doit contenir l’adresse de lecture, on réalise une macro avec passage de
paramètre.

LECTEEP macro ADREEP ; ADREEP est le paramètre de la macro


Movlw ADREEP ; mettre l’adresse de l’octet à lire dans w
bcf STATUS, RP0 ; passer au bloc 2
bsf STATUS, RP1
movwf EEADR ; mettre l’adresse dans le registre EEADR
bsf STATUS, RP0 ; passer au bloc 3
bcf EECON1, EEPGD ; utilisation de l’EEPROM
bsf EECON1, RD ; lancer la lecture
bcf STATUS, RP0 ; passer au bloc 2
movf EEDATA, w ; mettre la valeur lue dans w
endm ; fin de la macro

Pour utiliser cette macro, il suffit d’écrire :

LECTEEP 0xYY ; 0xYY est l’adresse de la donnée à lire en EEPROM.

L.HACINI M1 Electronique des Systèmes Embarqués Page 2


Chapitre 6 Utilisation de l’EEPROM du PIC 16F877

Remarque :
L’emplacement physique réel de l’EEPROM commence à l’adresse 0x2100, alors que l’adresse
relative employée dans le programme commence à la valeur 0x00. C’est-à-dire que lorsqu’on
accède à l’adresse EEPROM 0x01 dans le programme, la donnée se trouvera physiquement à
l’adresse 0x2101 du PIC.

6.4. ECRITURE DANS L’EEPROM


Pour écrire il suffit de mettre l’adresse de la destination dans le registre EEADR et l’octet à écrire
dans le registre EEDATA, puis de lancer l’opération d’écriture par la mise à 1 du bit WR du registre
EECON1.
Il est intéressant de créer une macros pour l’écriture, celle-ci devra passer deux paramètres :
l’adresse et la donnée. La macro qui suit doit être appelée après avoir mis la donnée dans
l’accumulateur w, le paramètre adreep est l’adresse d’écriture.

ECREEP macro adreep ; adreep est le paramètre de la macro


bcf STATUS, RP0 ; passer au bloc 2
bsf STATUS, RP1
movwf EEDATA ; mettre la donnée à écrire dans EEDATA
movlw adreep ; mettre l’adresse de l’octet à écrire dans w
movwf EEADR ; mettre l’adresse dans le registre EEADR
bsf STATUS, RP0 ; passer au bloc 3
bcf EECON1, EEPGD ; utilisation de l’EEPROM
bsf EECON1, WREN ; autoriser l’écriture
bcf INTCON, GIE ; masquer les interruptions
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR ; lancer l’écriture
bcf EECON1, WREN ; empêcher une prochaine écriture
endm ; fin de la macro

Remarques :

 L’écriture d’un octet en mémoire EEPROM nécessite une durrée de l’ordre de 4 ms (PIC
16F877 de 20 MHz) cela représente pas moins de 20000 cycles d’instruction. Donc les
écritures en EEPROM nécessitent énormément de temps à l’échelle du PIC.

 A la fin du cycle d’écriture, il s’écoule un certain temps avant que la donnée ne soit écrite en
mémoire. Il faut donc attendre et vérifier que tout soit terminé avant de recommencer un
autre cycle ou de lire cette donnée.

L.HACINI M1 Electronique des Systèmes Embarqués Page 3


Chapitre 6 Utilisation de l’EEPROM du PIC 16F877

 La fin de l’écriture peut être détectée en lisant l’état de l’indicateur EEIF, ou en lisant l’état
du bit WR qui est remis automatiquement à 0 en fin de cycle.

 Le bit WREN n’est pas remis à 0 automatiquement en fin de cycle d’écriture.

 A la fin d’écriture le bit EEIF passe à 1, ce qui permet de demander une interruption si le bit
EEIE le permet

6.5. VERIFICATION DE L’ECRITURE


Dans des EEPROM très souvent programmées parfois à la limite du nombre maximum prévu par le
constructeur, il peut être utile de vérifier l’information écrite.
Cette vérification peut être effectuée par exemple en exécutant les instructions suivantes :

bcf STATUS, RP0


bsf STATUS, RP1 ; passer au bloc 2
movf EEDATA, w ; mettre la donnée dans w
bsf STATUS, RP0 ; passer au bloc 3
lecture
bsf EECON1, RD ; déclancher la lecture
bcf STATUS, RP0 ; passer au bloc 2
subwf EEDATA, w ; soustraction pour comparaison entre donnée
; lue et donnée prévue (dans w)
btfss STATUS,z ; test du bit z
goto erreur ; si z=1 continue le programme
; si z=0 on saute à un sou programme d’erreur

6.6. L’INTERRUPTION DE FIN D’ECRITURE


La fin d’un cycle d’écriture peut être la source d’une demande d’interruption. Pour cela il faut
autoriser cette interruption en mettant à 1 : le masque EEIE du registre PIE2, le masque des
interruptions périphériques PEIE du registre INTCON et le masque global des interruptions GIE.
Cette interruption ne peut survenir qu’après le cycle d’écriture.

6.7. INITIALISATION D’UNE ZONE EEPROM


La directive pour déclarer des valeurs en EEPROM est DE. Ces valeurs seront alors écrites en
EEPROM directement au moment de la programmation. Dans ce cas la directive DE est précédée
par la directive ORG pointant sur un emplacement EEPROM valide (de 0x2100 à 0x21FF).
Exemple :
ORG 0x2100 ; début de la zone EEPROM
DE 2,4,8 ; mettre 2 dans 0x2100, 4 dans
0x2101 etc. ; DE veut dire Data Eeprom

L.HACINI M1 Electronique des Systèmes Embarqués Page 4


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
7.1. INTRODUCTION
Nous avons vu jusqu’à présent que nous pouvons entrer un signal sur les pins du PIC, qui détermine en
fonction du niveau de tension présente, si ce signal était considéré comme un 1 ou un 0 logique. Ceci
est suffisant pour tout signal binaire, c’est-à-dire ne présentant que deux valeurs possibles.
Supposons que nous désirons, avec le PIC, mesurer une valeur analogique, c’est-à-dire, connaître la
valeur de la tension présente sur un pin du PIC. Il existe plusieurs applications qui nécessitent une telle
possibilité, par exemple la mesure de la tension d’une batterie à l’aide d’un PIC. Comme l’électronique
interne du PIC ne comprend que les valeurs binaires, il faut donc transformer cette valeur analogique
en une représentation numérique. Ce procédé s’appelle numérisation, et pour l’effectuer, on a besoin
d’un convertisseur analogique/numérique.

7.2. CONVERSION ANALOGIQUE NUMERIQUE


Un signal analogique peut s’exprimer par une infinité de valeur. Un nombre numérique, au contraire,
dispose d’un nombre fini de valeurs, on parlera de valeurs discrètes. Le problème est donc de savoir
comment passer d’une représentation à l’autre, donc comment convertir d’analogique vers le
numérique. Comme le montre la figure suivante, on a trois étapes :

Quantification

Fig 7.1. Etapes de conversion


 L’échantillonnage
 Action de prélever la valeur du signal à intervalle fixe et répétitif
 Fréquence des échantillons: Te
 Le blocage
 Temps de conversion non nul

L.HACINI Electronique des Systèmes Embarqués Page 1


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
 Maintien de la valeur pendant ce temps
 La quantification
 Réalisé par le convertisseur
 Convertir une valeur analogique en une valeur numérique sur n bits
 Introduit des distordions (Erreur de quantification)

7.3.OBJECTIF DU CONVERTISSEUR ANALOGIQUE NUMERIQUE


Le but est de convertir une tension analogique, comprise entre deux tension de référence Vref- et
Vref+, en une valeur numérique N sur n bits. Le PIC16F877 travaille avec un convertisseur
analogique/numérique intégré qui permet un échantillonnage sur 10 bits. Le signal numérique peut
donc prendre 1024 valeurs possibles.

7.4.LE TEMPS D’ACQUISITION


Le PIC connecte le pin sur laquelle se trouve la tension à numériser à un condensateur interne, qui va se
charger via une résistance interne jusqu’à la tension appliquée. Le pin est déconnectée du condensateur,
et ce dernier est connecté sur le convertisseur analogique/numérique interne. Si le signal varie après le
temps de charge du condensateur interne, cette variation ne sera pas prise en compte, puisque le pin
sera déconnecté du dit condensateur.
Le temps d’acquisition est le temps qu’il faut pour que le condensateur interne atteigne une tension
proche de la tension à convertir. Cette charge s’effectue à travers une résistance interne et la résistance
de la source connectée au pin. Ce temps est incrémenté du temps de réaction des circuits internes, et
d’un temps qui dépend de la température (coefficient de température).
La formule est donc :
Tacq = Tamp + Tc + Tcoff
Le temps de réaction des circuits est typiquement de 2μs ; Tamp = 2μs
Le coefficient de température, il n’est nécessaire que pour les températures supérieures à 25°C. Dans
les autres cas, il n’entre pas en compte. Ce coefficient est typiquement de 0,05 μs par °C qui est
supérieur à 25°C. Il s’agit bien entendu de la ttempérature du PIC, et non de la température ambiante.
Donc, ce temps Tcoff sera au minimum de 0 (à moins de 25°C) et au maximum de (50-25)*0.05, soit
1,25 μs. La température du PIC ne pouvant pas, en effet, excéder 50°C, donc 0 ≤ Tcoff ≤ 1,25μs
Le temps de charge du condensateur.
Le temps de charge dépend de la résistance placée en série avec le condensateur. En fait, il y a deux
résistances, celle de la source du signal, et celle à l’intérieur du PIC. Il est recommandé que la
résistance de source reste inférieure à 10KOhms.

7.5. LA CONVERSION PAR UN PIC 16F877


Une fois le condensateur connecté, et donc, la tension à numériser présente sur l’entrée du
convertisseur, ce dernier va devoir procéder à la conversion. Le principe utilisé ici est celui de
l’approximation successive.
Le temps nécessaire à la conversion est égal au temps nécessaire à la conversion d’un bit multiplié par
le nombre de bits désirés pour le résultat.
Concernant le PIC16F877, il faut savoir qu’il nécessite, pour la conversion d’un bit, un temps qu’on va
nommer Tad. Ce temps est dérivé par division de l’horloge principale. Le diviseur peut prendre une
valeur de 2, 8 ou 32. On divise ici l’horloge principale, et non le compteur d’instructions. Par exemple,
à 20Mz, le temps d’instruction est de 1/20.000.000, soit 50ns. Donc, avec un diviseur de deux, on aura
100ns.

L.HACINI Electronique des Systèmes Embarqués Page 2


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
Donc, en fonction des fréquences utilisées pour le quartz du PIC, il faut choisir le diviseur le plus
approprié. Le tableau suivant reprend les valeurs de diviseur à utiliser pour quelques fréquences
courantes du quartz et pour les PIC.

Diviseur 20Mhz 5Mhz 4Mhz 2Mhz 1,25Mhz 333,3Khz


2 100ns 400ns 500ns 1μs 1,6μs 6μs
8 400ns 1,6μs 2μs 4μs 6,4μs 24μs
32 1,6μs 6,4μs 8μs 16μs 25,6μs 96μs
Osc RC 2-6μs 2-6μs 2-6μs 2-6μs 2-6μs 2-6μs
Tableau 7.1. Valeurs de diviseur utilisé pour quelques fréquences

Il faut préciser que le PIC nécessite un temps Tad avant le démarrage effectif de la conversion, 10 *
Tad pour la conversion des 10 bits du résultat, et un temps supplémentaire Tad à la fin de la
conversion. Donc, le temps total de conversion est de : 12 Tad
En résumé, le temps nécessaire pour effectuer l’ensemble des opérations :
 On charge le condensateur interne (nécessite le temps Tacq)
 On effectue la conversion (nécessite le temps 12 * Tad)
 On doit attendre 2 * Tad avant de pouvoir recommencer une autre conversion
Supposons donc que nous travaillions avec un PIC à 20MHz. Nous utilisons le diviseur par 32. Chaque
Tad vaut donc 32 Tosc. Notre temps de conversion effectif prend donc normalement 12 Tad, soit 12 *
32 Tosc, soit 19,2μs.
Si on accepte de limiter la précision à un nombre inférieur à 10 bits, et en constatant que la
numérisation s’effectue en commençant par les bits les plus significatifs, on peut se dire : N bits me
suffisent, on décide de stopper la conversion après que les bits en question aient été numérisés.
Donc, pour conserver N bits significatifs, on aurait :
Tacq pour charger le condensateur
Tad pour le démarrage
N * Tad pour la conversion

7.5.1. Les valeurs représentées


On donne ici les relations entre valeurs analogiques et représentations numériques. On définit:
VREF- : Tension minimale analogique (référence négative)
VREF+ : Tension maximale analogique (référence positive)
VIN : Tension d’entrée à numériser
Val : valeur numérique obtenue sur 10 bits
Pour une numérisation sur 10 bits, on obtiendra la valeur numérique :
Val = ((VIN - VREF-) / (VREF+ - VREF-)).1023
Et réciproquement, la valeur typique qui a été numérisée correspond à une tension de :
VIN = ((Val/1023) . (VREF+ - VREF-)) + VREF-
Si nous utilisons une tension de référence négative de 0V, c’est-à-dire que la référence de tension
négative est en réalité Vss, nous obtenons deux formules simplifiées :
Val = (VIN / VREF+ ) * 1023
VIN = (Val/1023) * VREF+

Remarque
La tension d’entrée ne peut être supérieure à la tension d’alimentation Vdd du PIC, ni inférieure à sa
tension Vss. Pour mesurer une tension supérieure, par exemple une tension de 15V maximum, il faut

L.HACINI Electronique des Systèmes Embarqués Page 3


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
réaliser un diviseur de tension à partir de deux résistances pour que la tension appliquée reste dans les
limites prévues. Les formules sont tirées de la loi d’ohm.

7.5.2.Pins et canaux utilisés


Le PIC ne contient qu’un seul convertisseur, mais plusieurs pins sur lesquelles connecter les signaux
analogiques. Un circuit de commutation sélectionnera le pin qui sera relié au condensateur de maintien
interne durant le temps Tacq. Ces différentes entrées seront des canaux différents d’un seul et même
convertisseur.
Le 16F877, dispose de 8 canaux d’entrée analogique comme le montre la figure 7.2. Il peut donc
échantillonner jusque 8 signaux différents sur les pins AN0 à AN7. Les pins AN0 à AN4 sont les
dénominations analogiques des pins RA0 à RA3 + RA5, tandis que les pins AN5 à AN7 sont les
dénominations analogiques des pins RE0 à RE2.
La procédure de numérisation, pour le cas où on utilise plusieurs canaux, est la suivante:
 On choisit le canal à numériser, et on met en route le convertisseur
 On attend Tacq
 On lance la numérisation
 On attend la fin de la numérisation
 On attend 2 Tad
 On recommence avec le canal suivant.

Fig 7.2. les canaux du convertisseur A/N

7.5.3. Les tensions de référence


La conversion analogique/digitale nécessite une tension de référence minimale (Vref-) et une tension
de référence maximale (Vref+). Pour le PIC16F877, on a trois modes de fonctionnement possibles :

 Utilisation de Vss comme tension Vref- et de Vdd comme tension Vref+. Dans ce mode, les
tensions de références sont tirées en interne de la tension d’alimentation. Il n’y a donc pas
besoin de les fournir.

L.HACINI Electronique des Systèmes Embarqués Page 4


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
 Utilisation de la pin Vref+ pour fixer la tension de référence maximale Vref+, et utilisation de
Vss comme tension de référence Vref-. Dans ce cas, la tension Vref+ doit donc être fournie au
PIC via la pin RA3.
 Utilisation de la pin Vref+ pour fixer la tension de référence maximale Vref+, et utilisation de la
pin Vref- pour fixer la tension de référence minimale Vref-. Dans ce cas, les 2 tensions de
références devront être fournies au PIC via RA3 et RA2.
Notez que la broche Vref+ est une dénomination alternative de la broche RA3/AN3, tandis que la
broche Vref- est une dénomination alternative de la broche RA2/AN2. Donc, l’utilisation d’une pins
comme entrée analogique interdit son utilisation comme entrée numérique. De même, l’utilisation des
références Vref+ et Vref- interdit leur utilisation comme pin entrée/sortie ou comme pin d’entrée
analogique.

7.6. PROGRAMMATION DU CAN


7.6.1. Les registres ADRESL et ADRESH
Le convertisseur donne un résultat sur 10 bits, donc ce résultat devra obligatoirement être sauvegardé
dans deux registres (ADRESL et ADRESH).
Comme deux registres contiennent 16 bits, et que nous n’utilisons que 10, on a le choix soit justifier le
résultat à droite, soit à gauche. Comme le montre la figure suivante :

(a)

(b)
Fig7.3. sauvegarde du résultat
(a) justification à droite (b) justification à gauche

La justification à droite sera principalement utilisée lorsque nous avons besoin de l’intégralité des 10
bits de résultat, tandis que la justification à gauche est très pratique lorsque 8 bits sont suffisants. Dans
ce cas, les deux bits de poids faibles se trouvent isolés dans ADRESL, il suffit donc de ne pas en tenir
compte. Le choix de la méthode s’effectue à l’aide du bit 7 de ADCON1.

7.6.2.Le registre ADCON1


Il permet de choisir si un pin sera utilisé comme entrée analogique, comme entrée/sortie standard, ou
comme tension de référence. Il permet également de décider de la justification du résultat.
Notons que pour pouvoir utiliser une pin en mode analogique, il faut que cette pin soit configurée
également en entrée par TRISA et éventuellement par TRISE.
Le registre ADCON1 dispose, comme tout registre accessible de notre PIC, de 8 bits, dont seulement 5
sont utilisés :
 b7 : ADFM : A/D result ForMat select, permet de déterminer si le résultat de la conversion sera
justifié à droite (ADFM=1) ou à gauche (ADFM=0).
 b6 : Inutilisé : lu comme 0
 b5 : Inutilisé : lu comme 0
 b4 : Inutilisé : lu comme 0
 b3 : PCFG3 : Port ConFiGuration control bit 3
 b2 : PCFG2 : Port ConFiGuration control bit 2

L.HACINI Electronique des Systèmes Embarqués Page 5


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
 b1 : PCFG1 : Port ConFiGuration control bit 1
 b0 : PCFG0 : Port ConFiGuration control bit 0
Ces quatre derniers bits (b3 à b0) permettent de déterminer le rôle de chaque pin du convertisseur
analogique/numérique. Comme nous avons 16 combinaisons possibles, nous aurons autant de
possibilités de configuration comme le montre le tableau suivant:

PCFG AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref- Vref A/D/R
3à0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0 +
0000 A A A A A A A A Vss Vdd 8/0/0
0001 A A A A Vref+ A A A Vss RA3 7/0/1
0010 D D D A A A A A Vss Vdd 5/3/0
0011 D D D A Vref+ A A A Vss RA3 4/3/1
0100 D D D D A D A A Vss Vdd 3/5/0
0101 D D D D Vref+ D A A Vss RA3 2/5/1
0110 D D D D D D D D - - 0/8/0
0111 D D D D D D D D - - 0/8/0
1000 A A A A Vref+ Vref- A A RA2 RA3 6/0/2
1001 D D A A A A A A Vss Vdd 6/2/0
1010 D D A A Vref+ A A A Vss RA3 5/2/1
1011 D D A A Vref+ Vref- A A RA2 RA3 4/2/2
1100 D D D A Vref+ Vref- A A RA2 RA3 3/3/2
1101 D D D D Vref+ Vref- A A RA2 RA3 2/4/2
1110 D D D D D D D A Vss Vdd 1/7/0
1111 D D D D Vref+ Vref- D A RA2 RA3 1/5/2
Tableau 7.2. Configuration des pins du convertisseur analogique/numérique

Lors d’une mise sous tension, les bits PCFGx contiennent 0000. Le PORTA et le PORTE seront donc
configurés par défaut comme ports complètement analogiques. Ceci explique pourquoi l’utilisation de
ces ports comme ports d’entrées/sorties classiques implique d’initialiser ADCON1, avec0110 ou 0111.

7.6.3.Le registre ADCON0


Ce registre est le dernier utilisé par le convertisseur analogique/numérique. Il contient les bits
manipulés lors de la conversion. Sur les 8 bits du registre, 7 seront utilisés.
 b7 : ADCS1 : A/D conversion Clock Select bit 1
 b6 : ADCS0 : A/D conversion Clock Select bit 0
 b5 : CHS2 : analog Channel Select bit 2
 b4 : CHS1 : analog Channel Select bit 1
 b3 : CHS0 : analog Channel Select bit 0
 b2 : GO/DONE : A/D conversion status bit
 b1 : Inutilisé : lu comme 0
 b0 : ADON : A/D ON bit
Les bits ADCSx sont utilisés pour le choix du diviseur afin de déterminer l’horloge du convertisseur en
fonction de la fréquence du quartz utilisé comme le montre le tableau suivant :
ADCS1 ADCS0 Diviseur Fréquence maximale du quartz
0 0 Fosc/2 1,25Mhz
0 1 Fosc/8 5Mhz
1 0 Fosc/32 20 Mhz
1 1 FRC Si > 1MHz, uniquement en mode « sleep »
Tableau. 7.3. Choix du diviseur

L.HACINI Electronique des Systèmes Embarqués Page 6


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
FRC indique que c’est l’oscillateur RC du convertisseur analogique numérique qui génère l’horloge.

Les bits CHSx sont des bits qui permettent de sélectionner l’entrée analogique à convertir comme le
montre le tableau suivant :
CHS2 CHS1 CHS0 Canal Pin
0 0 0 0 AN0/RA0
0 0 1 1 AN1/RA1
0 1 0 2 AN2/RA2
0 1 1 3 AN3/RA3
1 0 0 4 AN4/RA5
1 0 1 5 AN5/RE0
1 1 0 6 AN6/RE1
1 1 1 7 AN7/RE2
Tableau. 7.4. Choix du canal

Le bit ADON permet de mettre en service le convertisseur. Si le canal a été correctement choisi, le
positionnement de ce bit permet de démarrer la charge du condensateur interne, et donc détermine le
début du temps d’acquisition.
Le bit Go/DONE, il sera placé à 1 par l’utilisateur. Cette action détermine le début de la conversion en
elle-même, qui dure 12 Tad.
Une fois la conversion terminée, ce bit est remis à 0 par l’électronique du convertisseur. Cette remise à
0 est accompagnée du positionnement du flag ADIF du registre PIR1. Ce bit permettra éventuellement
de générer une interruption. On dispose donc de deux façons pratiques de connaître la fin de la durée de
conversion :
 Si le programme n’a rien d’autre à faire durant l’attente de la conversion, on boucle dans
l’attente du passage à 0 du bit GO/Done.
 Si le programme continue son traitement, on peut utiliser l’interruption générée par le
positionnement du flag ADIF.

7.7. LA CONVERSION ANALOGIQUE/NUMERIQUE ET LES INTERRUPTIONS


L’interruption générée par le convertisseur est une interruption périphérique. Les différentes étapes de
sa mise en service sont donc :
 Positionnement du bit ADIE du registre PIE1
 Positionnement du bit PEIE du registre INTCON
 Positionnement du bit GIE du registre INTCON
Toute fin de conversion analogique entraînera une interruption. Il faut remettre à 0 le flag ADIF après
traitement de cette interruption.

7.8. L’UTILISATION PRATIQUE DU CONVERTISSEUR


Pour effectuer une conversion analogique numérique on doit suivre les étapes suivantes :
 Configurer ADCON1 en fonction des pins utilisées en mode analogique, ainsi que les registres
TRISA et TRISE si nécessaire.
 Valider, si souhaitée, l’interruption du convertisseur
 Paramétrer sur ADCON0 le diviseur utilisé
 Choisir le canal en cours de digitalisation sur ADCON0
 Positionner le bit ADON du registre ADCON0
 Attendre le temps Tacq

L.HACINI Electronique des Systèmes Embarqués Page 7


Chapitre 7 Le convertisseur Analogique Numérique du PIC16F877
 Démarrer la conversion en positionnant le bit GO du registre ADCON0
 Attendre la fin de la conversion
 Lire les registres ADRESH et si nécessaire ADRESL
 Attendre un temps équivalent à 2Tad
 Recommencer au quatrième point

L.HACINI Electronique des Systèmes Embarqués Page 8

Vous aimerez peut-être aussi