Sie sind auf Seite 1von 106

Informatique industrielle (microcontrôleurs) EL MORNAN

Page 1
Informatique industrielle EL
(microcontrôleurs) MORNAN

1-Architecture interne d’un système à microprocesseur


L'architecture interne d'un ordinateur se compose essentiellement de trois blocs: le
microprocesseur, la mémoire et les entrées/sorties reliées entre elles par trois bus de
communication; le bus de données, le bus d’adresses et le bus de commande.
Bus de données (8 lignes)

Unité centrale de
traitement microprocesseur Mémoire Entrées/Sorties

Bus d'adresses

Bus de contrôle

Figure 0-1 Architecture interne d’un ordinateur


1.1.1 Le microprocesseur
Un microprocesseur est l'implantation en un seul boîtier, en technologie LSI ou VLSI, d'une
unité centrale de traitement de données CPU et d’une unité arithmétique et logique ALU.
Son principal travail est de fournir aux autres éléments, qui lui sont raccordés, la
synchronisation nécessaire et fonctionnelle du traitement des informations qui lui sont
acheminées.
1.1.2 La mémoire
C'est la partie où l'on retrouve les programmes exécutables et les données à traiter. Cette
section est subdivisée en deux; d'une part, il y a la mémoire latente et d'autre part, la
mémoire vive.
Mémoire morte
C'est la mémoire de lecture; elle contient le programme du système. L'avantage de la ROM
(Read Only Memory), c’est d'être permanente; son contenu ne disparaît pas quand le
système n'est plus alimenté. La ROM contient toujours un programme de chargement
initial ou un moniteur pour permettre le fonctionnement du système dès la mise sous
tension. Dans un contexte de contrôle de processus, presque tous les programmes
résideront en ROM car ils seront rarement changés et devront être protégés des
pannes d'alimentation.
Mémoire vive
C'est la mémoire de lecture et d’écriture du système ou RAM (Random Access Memory). Le
contenu de ce type de mémoire est perdu lorsque l'on coupe l'alimentation. La
mémoire vive (RAM) doit être chargée, avant utilisation, à partir du clavier ou à partir
d’une mémoire de masse comme, par exemple, une unité à ruban magnétique ou une
unité à disque.

Page
2
1.2 Les entrées/sorties

Les entrées/sorties sont nécessaires pour que le microprocesseur communique avec le


monde extérieur et, évidemment, avec l'utilisateur. Il serait tout à fait inutile de réaliser
un ordinateur sans qu'il y ait quelques entrées et quelques sorties afin de communiquer
avec l'extérieur.

1.3 Les bus de communication

Évidemment, pour que le système fonctionne, il doit y avoir une communication entre le
microprocesseur, la mémoire et les entrées/sorties. Cette communication est réalisée à
l'aide de trois bus qui regroupent les signaux, selon leur fonction.

1.3.1 Le bus de données


C'est un bus bidirectionnel sur lequel transitent les données échangées par les éléments du
système.

1.3.2 Le bus d’adresses


Il s'agit d'un bus unidirectionnel, émanant du microprocesseur et se propageant vers les
dispositifs qu'il peut adresser. L'adresse qu'il porte permet d'atteindre une case mémoire
ou un registre spécifique avec laquelle une opération est désirée.

1.3.3 Le bus de contrôle


C'est un groupe de lignes issues de ou allant vers le microprocesseur et reliant ce dernier
à d'autres dispositifs. Son rôle est de véhiculer les signaux destinés à assurer la
synchronisation et la commande de l'ensemble du système. Par exemple, la ligne Reset
et R/W (lecture/écriture), les lignes d'interruptions et l'horloge appartiennent à ce bus

Introduction
Un PIC est un microcontrôleur, c’est une unité de traitement de l’information de
type microprocesseur à laquelle on a ajouté des périphériques internes permettant de
réaliser des montages sans nécessiter l’ajout de composants externes.
Les PICs sont des composants dits RISC (Reduce Instructions Construction Set), ou
encore composant à jeu d’instructions réduit. L'avantage est que plus on réduit le nombre
d’instructions, plus facile et plus rapide en est le décodage, et plus vite le composant
fonctionne.
La famille des PICs est subdivisée en 3 grandes familles : La famille Base-Line, qui
utilise des mots d’instructions (nous verrons ce que c’est) de 12 bits, la famille Mid-
Range, qui utilise des mots de 14 bits (et dont font partie la 16F84 et 16F876), et la
famille High-End, qui utilise des mots de 16 bits

Nous nous limiterons dans ce document à la famille Mid-Range et particulièrement au


PIC 16F84, sachant que si on a tout assimilé, on pourra facilement passer à une autre
famille, et même à un autre microcontrôleur.

Pour identifier un PIC, on utilise simplement son numéro :


 Les 2 premiers chiffres indiquent la catégorie du PIC, 16 indique un PIC Mid-Range.
 Vient ensuite parfois une lettre L, celle-ci indique que le PIC peut fonctionner avec
une plage de tension beaucoup plus tolérante.
 Vient en suite une ou deux lettres pour indiquer le type de mémoire programme :
- C indique que la mémoire programme est une EPROM ou plus rarement une EEPROM
- CR pour indiquer une mémoire de type ROM
- F pour indiquer une mémoire de type FLASH.
 On trouve ensuite un nombre qui constitue la référence du PIC.
 On trouve ensuite un tiret suivi de deux chiffres indiquant la fréquence
d’horloge maximale que le PIC peut recevoir.

Donc, un 16F84-04 est un PIC Mid-Range donc la mémoire programme est de type
FLASH de référence 84 et capable d’accepter une fréquence d’horloge de 4MHz.

Notez que les PICs sont des composants STATIQUES, c’est à dire que la fréquence
d’horloge peut être abaissée jusque l’arrêt complet sans perte de données et sans
dysfonctionnement. Une version –10 peut donc toujours être employée sans problème en
lieu et place d’une –04. Pas l’inverse, naturellement.
Pourquoi choisir un PIC ?
 Les performances sont identiques voir supérieurs à ses concurrents
 Les prix sont les plus bas du marché
 Les outils de développement sont gratuits et téléchargeables sur le WEB
 Le jeu d'instruction réduit est souple, puissant et facile à maîtriser
 Les versions avec mémoire flash présentent une souplesse d'utilisation et des
avantages pratiques indéniables
 La communauté des utilisateurs des PICs est très présente sur le WEB. On trouve
sur le net quasiment tout ce dont on a besoin, tutoriaux pour démarrer,
documents plus approfondis, schémas de programmeurs avec les logiciels qui
vont avec, librairies de routines, forums de discussion . . .

Le PIC 16F84
Les caractéristiques principales du 16F84 sont :
 Une mémoire programme de type flash de 1K (1024) mots de 14 bits
 Une mémoire RAM constituée des registres du microcontrôleur ainsi qu'une
mémoire de données libre de 68 octets.
 Une mémoire EEPROM de 64 octets
 Deux ports d'entrée sortie, un de 8 bits et un de 5 bits
 Un timer/Compteur
 Un chien de garde / compteur
 4 sources d'interruption
 4 types d'oscillateurs sélectionnables
 Protection de code
 Fonctionnement en mode sleep pour réduction de la consommation
 Programmation par mode ICSP (In Circuit Serial Programming)

Aspect externe du 16F84

RA2 1 18 RA1
RA3 2 17 RA0
RA4/T0CKI 3 16 OSC1
MCLR 4 PIC 15 OSC2
VSS 5 16F8X 14 Vdd
RB0/INT 6 13 RB7
RB1 7 12 RB6
RB2 8 11 RB5
RB3 9 10 RB4

Fig. 0-1 : brochage du 16 F84


Les éléments essentiels du 16F84

EEPROM de configuration, 14 bits


PORTA PORTB
Mémoire EEPROM
RA4

Horloge
RAM
système /4 TOSE
16 registres systèmeMémoire
(SFR) programme

1 de type Flash
0
TOCS 68 octets de RAM utilisateur
1

0 TMR0
0 1024
Prescaler
1
1 WDT mots de 14 bits
0
Horloge
PSA
WDT

Fig. 0-2 : les éléments essentiels du 16F84

La mémoire programme (flash)


Cette mémoire de 1024 mots stocke le programme. L'emplacement de celui-ci peut
se trouver à n'importe quel endroit de la mémoire. Cependant il faut savoir que suite à un
RESET ou lors de la mise sous tension, le PIC commence l'exécution à l'adresse 0000H. De
plus, lorsqu'il y a une interruption, le PIC va à l'adresse 0004H. Il est donc conseillé de
placer le début du programme après l'adresse 0004H et de mettre un branchement au
début du programme à l'adresse 0000H et un branchement au début de la routine
d'interruption s'il y en a une à l'adresse 0004H.

La mémoire RAM - Rrgistres


La mémoire RAM est constituée de deux parties :

 Les registres SFR (Special Function Register), ce sont les registres de


fonctionnement du PIC. L'ensemble de ces registres est souvent appelé fichier des
registres. Nous reviendrons sur ces registre un peu plus loin dans ce document.

Les registres GPR (General Propose Register) sont des positions mémoire que
l'utilisateur peut utiliser pour stocker ses variables et ces données. On remarquera
donc que, indépendamment de leur nature, les position de la RAM sont toujours
appelé registres
La mémoire RAM est organisée en deux banks, pour accéder à un registre, il faut
d'abord se placer dans le bank où il se trouve. Ceci est réalisé en positionnant le bit 0
appelés RP0 du registre STATUS.
bank 0 bank 1

00 INDF INDF 80

01 TMR0 OPTION 81

02 PCL PCL 82

03 STATUS STATUS 83

04 FSR FSR 84

05 PORTA TRISA 85

06 PORTB TRISB 86

07 87

08 EEDATA EECON1 88

09 EEADR EECON2 89

0A PCLATH PCLATH 8A

0B INTCON INTCON 8B

0C 8C

. Mémoire Maped in bank0 .

. utilisateur .

. .

2F AF

Tableau 0.1 : les registres et la RAM du 16F84

Pour la mémoire utilisateur, l'utilisation des pages (Bank ) n'est pas nécessaire puisque
le Bank 1 est "mapped" avec le Bank0. Cela signifie qu'écrire une donnée à l'adresse 0CH
ou à l'adresse 8CH revient au même.

LES PORTS D' E/S PORTA ET PORTB


Le PORTA est un port de 5 bits (RA0 à RA4). Chaque E/S est compatible TTL. La
configuration de direction pour chaque BIT du port est déterminée avec le registre TRISA.
La broche RA4 est une sortie à drain ouvert. En entrée, elle est multiplexée avec
l'entrée d'horloge du timer TMR0, elle est donc soit une entrée du port A, soit l'entrée
horloge du Timer TMR0, le choix se fait à l'aide du bit T0CS du registre OPTION. Le choix
du front d'incrémentation du timer se fait par le bit T0SE de ce même registre.

Le PORTB est un port bidirectionnel de 8 bits. Toutes les broches sont compatibles
TTL. La configuration de direction se fait à l'aide du registre TRISB.
Toutes les entrées du port B peuvent être pourvues de “ résistances ” de tirage
(weak pull up) validées par le bit RBPU du registre OPTION. Le pull up est désactivé à la
mise sous tension et quand le E/S sont programmées en sorties

En entrée, la ligne RB0 appelée aussi INT peut déclencher l’interruption

externe INT. En entrée, une quelconque des lignes RB4 à RB7 peut

déclencher l'interruption RBI.

Le Timer TMR0
C’est un compteur libre de 8 bits incrémenté en permanence par l’horloge interne
Fosc/4/Prescaler ou par la broche RA4 du port A, dans ce cas, le bit TOSE du registre
OPTION sélectionne le front actif. Le Prescaler est géré par les bits PSA, PS0, PS1 et PS2 du
registre OPTION.
Toute écriture dans le registre TMR0 inhibe l’incrémentation du compteur TMR0 pendant
deux cycles d’horloge.
Le débordement de TMR0 (FF 00) peut déclencher l'interruption T0IE.

Le Timer Watchdog WDT (Chien de garde)


C’est un compteur incrémenté en permanence (même si le µC est en mode sleep) par
une horloge RC intégrée indépendante de l'horloge principale. Lorsqu’il ce compteur,
arrive déborde, (WDT TimeOut), deux situations sont possibles :

 Si le µC est en fonctionnement normal, le WDT time-out provoque un RESET.


Ceci permet d’éviter de rester planté en cas de blocage du microcontrôleur par
un processus indésirable non contrôlé. Pour éviter un WDT time-out lors de
l'exécution d'un programme, on a deux possibilités :
- Inhiber le WDT d'une façon permanente en mettant à 0 le bit WDTE du mot de
configuration
- Remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction
CLRWDT pour éviter qu'il ne déborde

 Si le µC est en mode SLEEP, il est alors "réveillé" par WDT time-out et


l'exécution du programme continue normalement. Cette situation est souvent
exploitée pour réaliser des temporisations

Durée du time-out
Le Time Out vaut en principe 18 ms. Il est cependant réglable au moyen d’un
pré diviseur (Prescaler) programmable entre 1 et 128 à l'aide des bits PSA, PS0, PS1 et
PS2 du registre OPTION..

L'Horloge
L'horloge peut être soit interne soit externe.
L'horloge interne est constituée d'un oscillateur à
quartz ou d'un oscillateur RC.
Avec l'oscillateur à Quartz, on peut avoir des fréquences allant jusqu'à 4, 10 ou 20 MHz selon le
type de µC.
Le filtre passe bas RS, C2 limite les harmoniques dus à
l’écrêtage et Réduit l’amplitude de l’oscillation. (il n'est
pas obligatoire)

Avec un relaxateur RC, Lorsque la tension aux bornes


de Cext atteint le seuil haut du trigger de Schmitt, la sortie
de celui-ci passe au niveau haut, le transistor MOS devient
fortement conducteur et décharge Cext. Quand la tension
au point OSC1 atteint le seuil bas, le transistor MOS se
bloque et Cext se (re)charge de nouveau avec la constante
de temps RC.

Dans certains cas, une horloge externe


au microcontrôleur peut être utilisée pour
synchroniser le PIC sur un processus
particulier.
La broche OSC2 est alors inutilisée.

Organisation de la mémoire

Le PIC contient de la mémoire de programme et de la mémoire de données. La structure


Harvard des PICs fournit un accès séparé à chacune. Ainsi, un accès aux deux est possible
pendant le même cycle machine.
Mémoire de programme
C'est elle qui contient le programme à exécuter. Ce dernier est téléchargé par liaison série
La Figure montre l'organisation de cette mémoire. Elle contient 1k "mots" de 14 bits dans le
cas du PIC 16F84, même si le compteur de programme (PC) de 13 bits peut en adresser 8k.
L'adresse 0000h contient le vecteur du reset, l'adresse 0004h l'unique vecteur d'interruption
du PIC.

Registre à fonction spéciale (Special Function Register : SFR) :

Les registres à fonction spéciales sont utilisés par le microprocesseur et les périphériques
internes. Ils sont stockés dans la RAM statique , ce qui limite à 8 bits (et non 14 bits) ces
registres. Les SFRs sont toujours stockés dans
les 32 premiers octets de chaque page (bank).
· Registre W :
Le registre W est le registre de travail sur 8 bits pour réaliser des opérations arithmétiques ou
logiques.
· Pointeur de pile S :
Le pointeur de pile S est un ensemble de registre sur 13 bits. Sur les PICs, il y a 8 mots de 13
bits, ce qui limite le nombre maximal d’interruption ou d’appel à des sous-programmes. Le
pointeur de pile S mémorise une adresse, c’est à dire le contenu du compteur programme.
Attention, elle n’est pas manipulable, exclusivement réservée au microprocesseur.
· Compteur programme ou PC :
Le compteur programme, PC, indique l’adresse du prochain code binaire à 14 bits à traiter.
Le registre PC est constitué de deux registres , un registre PCL constitué de 8 bits et un
registre PCLATH constitué de
5 bits. Le registre PC fait donc 13 bits qui correspondent à 8192 mots de 14 bits mais dans
notre cas limité à 4096 mots de 14 bits (voir doc du pic16F648A).
· Registre d’état (Status Register) :
Le registre d’état est un registre sur 8 bits. Chaque bit à une signification particulière :

· Le bit C (Carry) : C est mis à 1 lorsqu’une opération arithmétique génère une retenue. Il
est également utilisé comme indicateur d’erreur lors d’une multiplication ou d’une
division, et sert lors de certaines opérations de décalage ou rotation qui peuvent passer
par son intermédiaire ou non.
· Le bit Z (Zéro) : Z est mis à 1 lorsque le résultat de l’instruction exécuté est nul.
· Les bits RP1 et RP0 : Bits indiquant sur quelle page (bank), le microprocesseur travail en
adressage direct (seul 7 bits d’adresses sont nécessaires).
· Le bit IRP : Bit indiquant sur quelle page (bank), le microprocesseur travail en adressage
indirect (8 bits
d’adresses sont nécessaires).

Les directives les plus utilisées

 LIST : permet de définir le type de PIC utilisé, le format du fichier hex à produire
ainsi que d'autres paramètres. Exemple :
LIST p=16f84
 INCLUDE : permet d'insérer un fichier source
INCLUDE "p16f84.inc"
INCLUDE <mesdeclarations.h>
Page
10
 CONFIG : permet de définir les fusibles de configuration (protection de
code, type d'oscillateur, chien de garde et temporisation du départ)

Page
11
CONFIG H'3FF9'
CONFIG B'11111111111001'
si le fichier p16f84.inc a été inséré, on peut utiliser les constantes prédéfinies :
CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF

Bits (ou "fusibles") de configuration


On se place dans le cadre de l'outil de développement MPLAB de

Microchip. La synthaxe utilisée est alors :

Valeurs
Nom Signification
possible
s
Rend impossible la lecture de la mémoire de
programme Flash
CP ON
et de l'EEPROM (à travers un

Code Protection programmateur) C'est une protection


bit)
contre le piratage industriel.
OFF Lecture possible

A la mise sous tension du µC, lance une


temporisation d'environ 72 ms durant laquelle
PWRTE ON est effectué un RESET interne.
(Power-up
Il est conseillé d'utiliser cette configuration.
Timer Enable
bit) OFF Temporisation désactivée

WDT ON Active le watchdog (chien de garde)

(Watchdog OFF
Timer Enable Désactive le watchdog
bit)
Oscillateur de type Résistance / Condensateur
RC Remarques : économique, réservé aux

applications où
OSC
HS Oscillateur à quartz haute fréquence (4 MHz, 20
(Oscillator MHz ...).
Selection bits) XT Oscillateur à quartz ou à résonateur céramique

LP Oscillateur à quartz de faible puissance (32,768


kHz ...)
Exemple de configuration

Dans le code source (fichier avec extension .asm), les fusibles de configuration sont indiqués
au compilateur avec la directive suivante :

config _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

Remarque

Les bits de configuration ne sont pas modifiables.

Dans l'exemple ci-dessus, pour activer le watchdog et utiliser un oscillateur de type RC, il
faut modifier le code source, recompiler et reprogrammer le µC ...

config _CP_OFF & _WDT_ON & _PWRTE_ON &


_RC_OSC

 EQU : permet de définir une constante ou une variable


: XX EQU 0x20
XX peut être soit une constante soit une variable, l'assembleur fait la correspondance
correcte selon le contexte. Chaque fois que le compilateur rencontrera XX, il la remplacera
soit par la constante 0x20 s'il s'agit d'un adressage immédiat, soit par le contenu de la
mémoire 0x20 s'il s'agit d'un adressage directe

 #DEFINE : définit un texte de substitution


#DEFINE pos(x,y,z) (y-2z+x)
chaque fois que le compilateur rencontrera le texte pos(x,y,z), il le remplacera par (y-
2z+x)

 ORG : définit la position dans la mémoire programme à partir de laquelle seront


inscrites les instructions suivantes.

 CBLOCK/ENDC : définit un bloc de constantes


CBLOCK 0X0C ; var1=0x0C, var2=0x0D, k=0x0D
var1,var
2 k
ENDC

DE : pour déclarer des donnés qui seront stockée dans l'EEPROM de
donnée
ORG 0x2100
DE "Programmer un PIC, rien de plus simple", .70, 'Z'

 DT : pour déclarer un tableau RETLW


proc addwf PCL,f ; saut à la position : (position suivante + W)

DT "Programmer un PIC",23,0x47 ; L'assembleur remplacera cette ligne par la suite d'instructions :


RTLW

'P'

RTLW 'r'
RTLW 'o'

. . .

RTLW 'C'

RTLW 23

RTLW
0x47

 END : indique la fin du programme


Format des nombres
L'assembleur reconnaît les nombres en décimal, hexadécimal, binaire ou octal. Pour
préciser la base il faut utiliser les préfixes précisés dans le tableau ci-dessous :

On peut à l'aide de la directive LIST ou RADIX définir un Base Préfixe Exemple


format par défaut. Si par exemple on place une des (36)
instructions suivantes au début du programme, tous les Décimal D'nnn' D'36'
nombres sans préfix seront interprétés en décimal :
LIST r = dec .nnn .36

RADIX dec Hexadécim H'nn H'2


al
(les radix valables sont dec, hex ou oct) ' 4'

0xn 0x2

Binaire n
B'….' 4
B'00100100'

Octal O'nnn' O'44'

Structure d'un programme écrit en assembleur


Un programme écrit en assembleur doit respecter une certaine syntaxe et un certain
nombre de règles afin qu'il soit facile à lire et à débuguer :

 Tout ce qui commence à la première colonne est considéré comme une étiquette (label)
permettant de faire des renvois et aussi des assignations de constantes et de variables.

 tout ce qui suit un point virgule est considéré comme un commentaire non
interprété par le compilateur

 Un programme apparaît donc comme un texte écrit sur 3 colonnes :


- la colonne de gauche contient les étiquettes
- la colonne du milieu contient les instructions
- la colonne de droite contient des commentaires

 Il existe différentes façons indiquant comment doit être organisé un programme. Voici
un exemple d'organisation :
1) Quelques lignes de commentaire précisant la fonction du programme,

2) Configuration, exemple :

LIST p=16f84;f=inhx16m
INCLUDE "p16f84.inc"
CONFIG H'3FF9'

3) Définition des constantes et des variables,


exemple : led equ 0
x equ 0x0C
cblock

0x0D y,z
u,v,w
endc

4) mettre à l'adresse 0000 (adresse du RESET) une instruction de branchement au


début du programme principal :

org 0
goto debut

5) mettre à l'adresse 0004 (adresse d'interruption) une instruction de branchement au


début de la routine d'interruption :

org 4
call interruption

Si le programme est configuré pour interdire les interruptions, on peut se passer de


cette étape et même de la précédente et commencer le programme principal à
l'adresse 0000 sans même l'utilisation de la directive ORG.

6) Ecrire les sous programmes et les sous programmes d'interruption

7) Ecrire le programme principal

8) terminer avec la directive END


LES INSTRUCTIONS DU 16F84
Tous les PICs Mid-Range ont un jeu de 35 instructions. Chaque instruction est
codée sur un mot de 14 bits qui contient le code opération (OC) ainsi que l'opérande.
A part les instructions de saut, toutes les instructions sont exécutées en un cycle
d'horloge. Sachant que l’horloge fournie au PIC est pré divisée par 4 au niveau de
celle-ci, si on utilise par exemple un quartz de 4MHz, on obtient donc 1000000
cycles/seconde, cela nous donne une puissance de l’ordre de 1MIPS (1 Million d’
Instructions Par Seconde). Avec une horloge de 20MHz, on obtient une vitesse de
traitement plus qu’honorable.

1.3.4 Classement des instructions par nature

INSTRUCTIONS OPERANT SUR REGISTRE Status Cycles


(direct)
ADDWF F,d W+F {W,F ? d} C,DC,Z 1

ANDWF F,d W and F {W,F ? d} Z 1

CLRF F Clear F Z 1

CLRW Clear W Z 1

CLRWDT Clear Watchdog timer TO', PD' 1

COMF F,d Complémente F {W,F ? d} Z 1

DECF F,d décrémente F {W,F ? d} Z 1

DECFSZ F,d décrémente F {W,F ? d} skip if 0 1(2)

INCF F,d incrémente F {W,F ? d} Z 1

INCFSZ F,d incrémente F {W,F ? d} skip if 0 1(2)

IORWF F,d W or F {W,F ? d} Z 1

MOVF F,d F {W,F ? d} Z 1

MOVWF F W F 1

RLF F,d rotation à gauche de F a travers C {W,F ? d} C 1

RRF F,d rotation à droite de F a travers C {W,F ? d} 1

SUBWF F,d F – W {W,F ? d} C,DC,Z 1

SWAPF F,d permute les 2 quartets de F {W,F ? d} 1

XORWF F,d W xor F {W,F ? d} Z 1


INSTRUCTIONS OPERANT SUR BIT

BCF F,b RAZ du bit b du registre F 1

BSF F,b RAU du bit b du registre F 1

BTFSC F,b teste le bit b de F, si 0 saute une instruction 1(2)

BTFSS F,b teste le bit b de F, si 1 saute une instruction 1(2)

INSTRUCTIONS OPERANT SUR DONNEE (Immediat)

ADDLW K W + K W C,DC,Z 1

ANDLW K W and K W Z 1

IORLW K W or K W Z 1

MOVLW K K W 1

SUBLW K K – W W C,DC,Z 1

XORLW K W xor K W Z 1

INSTRUCTIONS GENERALES

CALL L Branchement à un sous programme de label L 2

GOTO L branchement à la ligne de label L 2

NOP No operation 1

RETURN retourne d'un sous programme 2

RETFIE Retour d'interruption 2

RETLW K retourne d'un sous programme avec K dans W 2

SLEEP se met en mode standby TO', PD' 1


Informatique industrielle EL
(microcontrôleurs) MORNAN

L'adressage relatif
L'instruction addwf PCL , f permet de faire ce que l'on appelle un adressage relatif.

Cette technique est largement utilisée pour la gestion des tableaux de données.
Exemple
bcd7seg
addwf PCL,1
retlw 0x40 ; 0
retlw 0x79 ; 1
retlw 0x24 ; 2
retlw 0x30 ; 3
retlw 0x19 ; 4
retlw 0x12 ; 5
retlw 0x02 ; 6
retlw 0x78 ; 7
retlw 0x00 ; 8
retlw 0x10 ; 9

LA PILE
La pile est une zone mémoire particulière.

Pour le PIC 16F84A, elle est constituée de 8 emplacements de

13 bits. La pile intervient dans le mécanisme interne des

instructions :

 CALL
 RETURN
 RETLW
 RETFIE

En effet, c'est dans la pile qu'est mémorisée l'adresse de retour d'une routine.

Quand intervient une instruction CALL ou une interruption, l'adresse de l'instruction


suivante (qui se trouve dans le compteur de programme PC) est sauvegardée dans
la pile.

Quand une instruction RETURN, RETLW ou RETFIE apparaît, le µC lit la dernière


valeur sauvegardée dans la pile, libère l'emplacement et se branche à l'adresse
indiquée.

Avec le mécanisme de la pile, un sous-programme peut appeler un sous-programme


(ou plutôt un sous-sous-programme) : la pile réserve un autre emplacement..

La taille de la pile est limitée à 8 niveaux (pour le PIC 16F84A).


Informatique industrielle EL
(microcontrôleurs) MORNAN

S'il y a plus de 8 routines actives en même temps, le contenu de la pile est écrasé et le
programme ne fonctionne plus correctement.

Cela se traduit par un plantage (le µC ne fait plus rien) ou bien par un comportement
plus ou moins incohérent (le µC fait des choses bizarres) ... problèmes que l'on
retrouve exactement sur des programmes plus complexes (Windows de Microsoft ...).

LES OUTILS DE DÉVELOPPEMENT


Les étapes nécessaires permettant de voir un programme s'exécuter sur un PIC sont
:

 Ecrire un programme en langage assembleur dans un fichier texte et le


sauvegarder avec l'extension .asm
 Compiler ce programme avec l'assembleur MPASM fourni par Microchip. Le
résultat est un fichier avec l'extension .hex contenant une suite d'instruction
compréhensible par le pic.
 Copier le fichier .hex dans la mémoire programme du PIC (mémoire flash) à
l'aide d'un programmateur adéquat. On peut utiliser les programmateurs
de Microchip ou tout autre programmateur acheté ou réalisé par soit même.
 Mettre le PIC dans son montage final, mettre sous tension et admirer le travail.

Microchip propose gratuitement l'outil de développement MPLAB qui regroupe


l'éditeur de texte, le compilateur MPASM, un outil de simulation et le logiciel de
programmation. Le programmateur lui-même, n'est malheureusement pas gratuit.
Pour ce qui nous concerne, nous utiliseront MPLAB pour écrire, compiler et
éventuellement simuler nos programmes, ensuite nous utiliserons un programmateur
pour copier les programme dans la mémoire flash du PIC.
Les interruptions
Une interruption provoque l’arrêt du programme en cours pour aller exécuter une
procédure d'interruption. A la fin de cette procédure, le microcontrôleur reprend le
programme à l’endroit où il s’était arrêté. Comme une interruption est un événement
asynchrone, il faut alors sauvegarder (empiler) le contexte dans lequel se trouvait
le microcontrôleur avant l’interruption, afin qu’il puisse reprendre correctement la
continuité du programme.
Le PIC16F84 possède 4 sources d'interruption. A chaque interruption sont associés
deux bits. Un bit de validation et un drapeau. Le premier permet d'autoriser ou non
l'interruption, le second permet au programmeur de savoir de quelle interruption il
s'agit. Tous ces bits sont dans le registre INTCON à part le drapeau EEIF de
l'interruption EEI qui se trouve dans le registre EECON1.

Page 18
Informatique industrielle EL
(microcontrôleurs) MORNAN
Déroulement d'une interruption
Lorsque l'événement déclencheur d'une interruption intervient, alors son
drapeau est positionné à un. Comme au début de chaque instruction le processeur
vérifie les drapeaux, il verra le drapeau levé et vérifie alors si l'interruption en
question a été validée. Si c'est le cas, l'interruption est déclenchée : le
programme arrête ce qu'il est en train de faire et va exécuter la procédure
d'interruption qui se trouve à l'adresse 4 :
 l'adresse contenue dans le PC (Program Counter) est sauvegardée dans la
pile, puis remplacée par la valeur 0004 (adresse de la routine d'interruption).
 Le bit GIE est placé "0" pour inhiber toutes les interruptions (afin qu'on ne
soit pas dérangés pendant l'exécution de la procédure d'interruption).
 A la fin de la routine d'interruption (instruction RETFIE), le bit GIE est
replacé à l'état haut (autorisant ainsi un autre événement)
 le contenu du PC est rechargé à partir de la pile et le programme est repris là
où on l'a laissé.

Deux remarques importantes sont à faire :

Le drapeau reste à l’état haut même après le traitement de l’interruption. Par conséquen

Seul le PC est empilé. Si cela est nécessaire, les registres W et STATUS doivent
alors être sauvegardés en RAM puis restaurés à la fin de la routine pour que le
microcontrôleur puisse reprendre normalement le cours du programme.

L'interruption INT (Entrée RBO DU PORTB)


Cette interruption est provoquée par un changement d'état sur l'entrée RB0 du
port B quand elle est programmée en entrée. Elle est gérée par les bits :
- INTE : bit de validation (1=oui, 0=non)
- INTF : drapeau
- INTEDG : front de déclenchement 1=montant, 0=descendant (registre OPTION)

L'interruption RBI (RB4 A RB7 DU PORTB)


Cette interruption est provoquée par un changement d'état sur l'une des entrées
RB4 à RB7 du port B, Le front n'a pas d'importance. Les bits associés sont RBIE
(bit de validation) et RBIF (drapeau)

L'interruption TOI : Débordement du Timer TMR0


Cette interruption est provoquée par le débordement du timer TMR0. Les bits
associés sont TOIE (bit de validation) et TOIF (drapeau)

L'interruption EEI : Fin d'écriture dans l'EEPROM


Cette interruption est déclenchée à la fin d'une écriture réussie dans
l'EEPROM. Les bits associés sont EEIE (validation) et EEIF (drapeau).

Page
19
Sauvegarde et restauration du contexte de travail
Il est important que le contexte de travail du programme principal soit le même avant
et après l'exécution de la routine d'interruption.

Cela concerne le registre STATUS et l'accumulateur W qui doivent retrouver le même


contenu (en effet, ces deux registres sont souvent utilisés et donc modifiés pendant la
routine d'interruption).

Voici la procédure préconisée par Microchip :

La routine d'interruption commence par la sauvegarde du registre W puis du registre


STATUS :

org H'0004' ; vecteur d'interruption (directive du compilateur MPLAB)

movwf W_TEMP

swapf STATUS, W

movwf

STATUS_TEMP

La routine d'interruption finit par la restauration du registre STATUS puis du registre W :

swapf STATUS_TEMP, W

movwf STATUS

swapf W_TEMP, f

swapf W_TEMP, W

retfie ; retour d'interruption

Page
20
Page
21
L'Initialisation : RESET

Le RESET peut avoir plusieurs causes :


- Mise sous tension
- Etat 0 sur broche MCLR
- Débordement du timer du chien de garde.

Lorsque le RESET intervient, le µC peut être :


- En fonctionnement normal
- En mode SLEEP.

L'état des registres à la mise sous tension est donné par le tableau ci-dessous :

- MCLR
Registre Power-on Réveil d'un
RESET - WDT on normal SLEEP
operation

Pour le registre STATUS, voir tableau ci-dessous,

Cause du RESET Etat avant TO PD


Mise sous tension 1 1
Normal NA NA
0 sur MCLR
Sleep NA 0
Normal 0 1
Chien de garde
Sleep 0 0

Les registres de contrôle du 16F84

Le registre OPTION ou OPTION_REG (81H)


Le registre d'OPTION contient les bits de contrôles du PRESCALER, de
l'interruption externe INT, de l'horloge du timer TMR0 et du "tirage au plus" du PORT
B.

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

r/w r/w r/w r/w r/w r/w r/w r/w

INTEDG T0CS T0SE PSA PS2 PS1 PS0


RBPU

 BIT 0,1 et 2: Sélectionnent le ratio du PRESCALER.


Ces trois bits déterminent le ratio du prescaler. Les timers TMR0 et WDT
s'incrémente au rythme de l'horloge divisée par le prescaler
rati rati
PS2 PS1 PS0
o o

0 0 0 TMR
2 WD
1

0 0 1 4 2

0 1 0 8 4

0 1 1 16 8

1 0 0 32 16

1 0 1 64 32

1 1 0 128 64

1 1 1 256 128

Tableau : ratios du prescaler

 BIT 3: PSA ( PreScaler Assignment).


Si PSA=1 alors le prescaler est associé avec le
WDT. Si PSA=0 alors le prescaler est associé
avec le TIMER.

 BIT 4: T0SE ( TMR0 Source Edge).


Ce bit détermine sur quel front l'entrée RA4 incrémentera le registre
TMR0 T0SE=1 Front descendant.
T0SE=0 Front montant.

 BIT 5: T0CS ( TMR0 Clock Source)


Ce bit permet de sélectionner l'horloge de
TMR0. T0CS=1 sélection de l'horloge externe
RA4 (PORTA). T0CS=0 sélection de l'horloge
interne.

 BIT 6: INTEDG ( INTerrupt EDGe)


Si INTEDG=1 alors la broche RBO/INT génère une interruption sur un front montant.
Si INTEDG=0 alors la broche RBO/INT génère une interruption sur un front
descendant.

 BIT 7: RBPU ( PORT B Pull-Up).


RBPU=1 Le "tirage au plus" interne du PORT B est
désactivé. RBPU=0 Le "tirage au plus" interne du
PORT B est activé.
Le pull-up est désactivé à la mise sous tension et quand le port est configuré en
sortie
Le registre INTCON (0B,8BH)
Le registre INTCON contient tous les bits de validation et les drapeaux des
différentes interruptions.

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

r/w r/w r/w r/w r/w r/w r/w r/w

EEIE TOIE INTE RBIE TOIF INTF RBIF


GIE

Figure : registre INTCON

 BIT 0:
RBIF
Drapeau de l'interruption RBI qui provient d'un changement d'état d'un des bits
RB4 à RB7. RBIF= 1 : drapeau levé.
RBIF= 0 : drapeau baissé.

 BIT 1: INTF (INT interrupt Flag).


Drapeau d'interruption INT qui provient d'un changement d'état de
l'entrée RB0. RBIF=1 drapeau levé.
RBIF=0 drapeau baissé.

 BIT 2: TOIF ( TMRO Overflow Interrupt Flag).


Drapeau de l'interruption TOI qui intervient au débordement du timer
TMR0 TOIF=1 drapeau levé.
TOIF=0 drapeau baissé.

 BIT 3: RBIE (RB Interrupt Enable).


Bit de validation de l'interruption RBI qui provient d'un changement d'état sur l'une
des entrée RB4 à RB7 du port B.
RBIE=1 : Autorise
l'interruption. RBIE=0 : interdit
l'interruption

 BIT 4: INTE ( INT interrupt Enable).


Bit de validation de l'interruption INT qui provient d'un changement d'état sur
l'entrée RB0 du port B.
INTE=1 : Valide l'interruption
INT. INTE=0 : Interdit
l'interruption INT.

 BIT 5: TOIE (TMRO Overflow Interrupt Enable).


Bit de validation de l'interruption TOI qui intervient au débordement du timer
TMR0 TOIE = 1 : Valide l'interruption.
TOIE= 0 : Interdit l'interruption.

 BIT 6 : EEIE (EE write Interrupt Enable).


Bit de validation de l'interruption EEI qui intervient à la fin d'une écriture
dans l'EEPROM EEIE=1 : Valide l'interruption.
EEIE=0 : Interdit l'interruption
Remarque : le drapeau de cette interruption se trouve dans le registre EECON1
 BIT 7: GIE (Global Interrupt Enable).
Bit de validation globale de toutes les interruptions.
GIE=1 : chaque interruption dépendent de son propre bit de
validation. GIE=0 : Toutes les interruption sont interdite.
Le registre STATUS (03,83H)
Divisé en plusieurs blocks, il contient:

 Les indicateur sur le résultat d'un calcul représenté par les bits d'état C, DC, et
Z.
 Le status d'un RESET par l'intermédiaire des bits PD et TO.
 L'accès aux différents bancs de la mémoire par les bits IRP, RP1 et RP0

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

r/w r/w r r r/w r/w r/w r/w

IRP RP1 RP0 TO PD Z DC C

 BIT0: C (Carry).
Il passe à "1" lorsque le résultat d'une opération dépasse la valeur FF ou d'un
résultat négatif.

 BIT1: DC (Digital Carry).


il se positionne à "1" lorsque une retenue s'est produite entre les bit 3 et 4.

 BIT2: Z (Zero).
Quand il est à "1", il indique que le résultat de l'opération est nul.

 BIT3: PD (Power-Down).
PD=1 après un Power-up ou suite à l'instruction
CLRWDT. PD=0 lorsque l'instruction SLEEP est
exécutée.

 BIT4: TO (Time-Out).
Il passe à "1" après les instructions SLEEP et CLRWDT. Lorsque le WDT (chien
de garde) déborde, ce bit passe à "0".

 BIT5 et 6: RP0 et RP1 (bits de sélection de bancs).


Avec ces 2 bits, on accède aux différents bancs de la mémoire.
RP1 RP0 BANC ADRESSE

0 0 0 00 à 7F

0 1 1 80 à FF

1 0 2 100 à 17F

1 1 3 180 à 1FF

 BIT7: IRP.
Ce bit n'est pas utilisé avec le PIC16F84 et doit rester à "0".

Le registre TMR0 (01H)


C’est le registre d'accès au TIMER/COMPTEUR TMT0.

Les registres FSR et INDF (04,84H et 00,80H).


Les registres FSR et INDF permettent l'adressage INDIRECTE. Dans le registre FSR,
on inscrit l'adresse de la case mémoire à laquelle on veut accéder. Le registre INDF
devient alors une image de cette case mémoire.
En résumé, toute lecture/écriture dans le registre INDF se fait dans la
case mémoire pointée FSR (INDF = [FSR]).

Les registre EEADR(09H) et EEDATA (08H).


Ces registres permettent d'accéder à la mémoire EEPROM avec un adressage
indirect (exactement de la même façon que FSR et INDF). Une lecture/écriture dans
de registre EEDATA se fait dans la position mémoire pointée par EEADR

Le registre EECON1 (88H)


C'est un registre de contrôle de la mémoire EEPROM. Seuls les 5 bits de poids
faible sont utilisés.

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

r/w r/w r/w w w

EEIF WRERR WREN WR RD

 Bit 0: RD (ReaD EEPROM).


Lorsque ce bit est mis à "1", il indique au microcontrôleur que l'on souhaite une
lecture de l'EEPROM. Apres le cycle de lecture, il est mis automatiquement à 0.
 BIT 1: WR (WRite EEPROM).
Lorsque ce bit est mis à "1", il indique au microcontrôleur que l'on souhaite une
écriture dans l'EEPROM. Apres le cycle d'écriture, il est mis automatiquement à 0.

 Bit 2: WREN (EEPROM WRite ENABLE).


C'est un bit de confirmation d'écriture dans l'EEPROM. En effet, il ne suffit pas de
définir un cycle d'écriture uniquement avec le bit WR. Il faut impérativement
valider le bit WREN (WREN=1) pour autoriser une écriture.

 Bit 3: WRERR (EEPROM WRite ERROR flag).


Ce drapeau indique qu'une erreur c'est produite lors d'un cycle d'écriture dans
l'EEPROM. WRERR=1 : une opération d'écriture a échoué.
WRERR=0 : le cycle d'écriture c'est déroulé normalement.

 Bit 4: EEIF ( EEPROM Interrupt Flag).


Drapeau de l'interruption EEI qui intervient à la fin d'un cycle d'écriture réussi dans
l'EEPROM. EEIF=1 : drapeau levé.
EEIF= 0 : drapeau baissé.

Le registre EECON2 (89H).


Ce registre de 8 bits est exclusivement utilisé pour les séquences d'écritures dans
l'EEPROM. Il n'a pas d'adresse physique et la lecture de ce registre retourne une
valeur nulle. C'est un registre de sécurité d’écriture en EEProm de données. Une
donnée ne peut être écrite qu’après avoir écrit successivement 0x55 et 0xAA dans ce
registre.

Le registre TRISA (85H).


Le registre TRISA permet de configurer les E/S du PORTA en entrée ou en sortie.
Si le bit associé est à "1", alors l'E/S est configurée en ENTREE. Si le bit est à "0",
elle est configurée en SORTIE.
Apres un RESET, toutes les E/S sont configurées en ENTREE.
Comme le port A ne comporte que 5 bits, alors les bits 5, 6 et 7 ne sont pas
significatifs

Le registre PORTA (05H).


C'est le registre d'accès au port PORTA.

Le registre TRISB (86H)


Le registre TRISB configure chaque E/S du PORTB en ENTREE ou en SORTIE Si le bit
associé à la porte est à "1", alors elle sera configurée en ENTREE. Si le bit est à "0",
elle sera en SORTIE. Apres un RESET, toutes les E/S sont configurées en ENTREE.

Le registre PORTB (06H).


C'est le registre d'accès du port B
Les registres PCL et PCLATH (02,82H et OA,8AH).
Le PC est un registre de 13 bits :

PC PCL
H
 PCL (8 bits) est la partie basse de PC, il est accessible en lecture écriture
 PCH (5 bits) est la partie haute de PC, il n'est pas accessible directement.
On peut toutefois le modifier indirectement à l'aide du registre PCLATH qui
est une registre SFR accessible en lecture écriture et où seuls 5 bits sont
utilisés.
 Chaque fois qu'on écrit dans PCL, PCLATH est recopié automatiquement dans
PCH

PC PCL
H

PC AT
L H
Ecriture dans PCL

Le PC contient une adresse codée sur 13 bits :

 Le registre PCL contient l'adresse de poids faible (8 bits) du PC


 Le registre PCLATH contient l'adresse de poids fort (5 bits) du PC.

Par exemple :

(PCL) = B'10110011'

(PCLATH) =B'---00010' (les bits 5 à 7 ne sont pas utilisés par le PIC

16F84A) (PC) = B'0001010110011' (adresse 0x2B3 en numération

hexadécimale).

La prochaine instruction que va exécuter le PIC est donc située à l'adresse 0x2B3 de la
mémoire de programme.

Le compteur
Le PIC 16F84 est doté d'un compteur 8 bits. La Figure en donne l'organigramme
 Le timer0 peut fonctionner suivant deux modes en fonction du bit T0CS
(OPTION_REG.5). En
 mode timer (T0CS=0), le registre TMR0 est incrémenté à chaque cycle
machine (si le pré-diviseur n'est pas sélectionné).
 En mode compteur (T0CS=1), le registre TMR0 est incrémenté sur chaque
front montant ou chaque front descendant du signal reçu sur la broche
RA4/T0CKl en fonction du bit T0SE
 (OPTION_REG.4). Si T0SE=0, les fronts montants sont comptés, T0SE=1,
les fronts descendants sont comptés.
 VII.3. Pré-diviseur
 En plus des deux horloges, un pré-diviseur, partagé avec le chien de
garde, est disponible. La période de l'horloge d'entrée est divisée par une
valeur comprise entre 2 et 256 suivant les bits PS2,
 PS1 et PS0 (respectivement OPTION_REG.2, .1 et .0) (Figure). Le bit PSA
(OPTION_REG.3) permet de choisir entre la pré-division de timer0 (PSA=0) ou
du chien de garde (PSA=1).

L'utilisation du mode SLEEP


L'utilisation du mode SLEEP (Power-down mode) n'a d'intérêt que dans les applications
alimentées par piles ou batteries.

En effet, en mode SLEEP la consommation électrique du µC devient très faible.

2- Mise en mode Sommeil

Le µC est placé en mode SLEEP après une instruction SLEEP.

L'instruction SLEEP provoque :

 La mise à 0 du bit /PD du registre STATUS


 La mise à 1 du bit /TO du registre STATUS
 L'inhibition de l'horloge (broches OSC1/CLKIN et OSC2/CLKOUT) ce qui a pour
conséquence d'arrêter le programme (d'où une consommation d'énergie électrique
réduite)
 Le mise à 0 du timer du watchdog (chien de garde)

Attention : le timer du watchdog continue de fonctionner pendant le mode SLEEP (si


le watchdog est actif).

3- Réveil (Power-up)

Le µC se réveille, et reprend une activité normale, quand :

Il y a un RESET externe (niveau bas sur la broche /MCLR) : le programme est


réinitialisé (adresse H'0000' de la mémoire de programme).
La temporisation du watchdog est dépassée (si le watchdog est actif) : le
programme reprend à l'instruction qui suit l'instruction SLEEP.
o Une interruption RB0/INT, RB ou EEPROM survient (si ces interruptions sont autorisées)
o si GIE = 0 : le programme reprend à l'instruction qui suit l'instruction SLEEP
o si GIE = 1 : l'instruction qui suit l'instruction SLEEP est exécutée puis le programme
saute à la routine d'interruption (adresse H'0004' de la mémoire de programme)

Remarque : l'interruption TMR0 ne peut pas réveiller le µC.

Le timer WATCHDOG (chien de garde)

Le timer watchdog (le watchdog pour simplifier) est un dispositif qui permet au µC de
reprendre la main en cas de plantage.

Nous entendons par plantage :

la conséquence d'un bug (dans ce cas, c'est une erreur humaine et il faut corriger
le programme)
la conséquence d'une perturbation électrique qui fait sauter le programme à une
adresse quelconque et inattendue

Le plantage se traduit généralement par un "blocage" : le µC ne fait plus rien ou bien


des choses étranges.

Il faut alors faire un RESET externe (en supposant qu'un bouton poussoir sur la broche
/MCLR a été prévu à cet effet) :

Autrement, il faut couper l'alimentation, attendre quelques secondes que les


condensateurs de filtrage se déchargent, et remettre en route. Nous allons voir que
le watchdog, par logiciel, permet de faire un RESET interne.

- Reset du watchdog

Pour utiliser le watchdog, il faut choisir de l'activer : cela se fait au niveau des bits de
configuration.

Il faut ensuite placer (judicieusement) dans le programme l'instruction CLRWDT.

Cette instruction remet à 0 le timer du watchdog.

Si le timer watchdog dépasse une certaine durée, cela provoque un RESET


interne : le programme est réinitialisé (adresse H'0000' de la mémoire de
programme).

Cette durée dépend des bits PSA, PS2, PS1 et PS0 du registre OPTION_REG :
Taux de Duré
PSAPS2, PS1, prédivisio e
PS0 n indicativ
e
du
0 XXX 1 18 ms

1 000 1 18 ms

1 001 2 36 ms

1 010 4 72 ms

1 011 8 144 ms

1 100 16 288 ms

1 101 32 576 ms

1 110 64 1,15 s

1 111 128 2,3 s

X = 0 ou 1

En effaçant le watchdog à intervalles réguliers (avec CLRWDT), le timer ne doit


normalement jamais "déborder".

En cas de plantage, le timer déborde ce qui génère un RESET, et le programme

redémarre. Remarques :

L'instruction CLRWDT :

 met à 1 le bit /TO du registre STATUS


 met à 1 le bit /PD du registre STATUS

La mémoire EEPROM de données


La mémoire EEPROM (Electrical Erasable Programmable Read Only Memory), est
constituée de 64 octets commençant à l'adresse 0x2100 que l'on peut lire et écrire
depuis un programme. Ces octets sont conservés après une coupure de courant et
sont très utiles pour conserver des paramètres semi permanents.
On y accède à l'aide des registres EEADR et EEDATA : toute lecture écriture dans
le registre EEDATA se fait dans la position mémoire pointée par EEADR.
Deux registres de contrôle (EECON1 et EECON2) sont associés à la mémoire
EEMROM.

Page
30
La durée d’écriture d’un octet étant de l’ordre de 10 ms, la fin de chaque écriture réussie
est annoncé par le déclenchement de l'interruption EEI.

Procédure de lecture dans l'EEPROM de données

 Placer l’adresse de la donnée à lire dans EEADR


 Mettre le bit RD de EECON1 à 1
 Lire le contenu du registre EEDATA

Procédure d'écriture dans l'EEPROM de données

 Placer l’adresse de la donnée à écrire dans EEADR


 Placer la donnée à écrire dans EEDATA
 Placer 0x55 dans EECON2 (processus de sécurité pour éviter une écriture accidentelle)
 Placer 0xAA dans EECON2 (processus de sécurité pour éviter une écriture accidentelle)
 Mettre le bit WR de EECON1 à 1
 Attendre le drapeau EEIF avant de continuer
Les étapes nécessaires pour programmer un pic :
Exemples en assembleur avec 16F84
Calcul de la temporisation
Temporisation précise : utilisation du timer
Temporisation non précise : utilisation des boucles

A chaque fois que l’on désire fabriquer une temporisation, il faut calculer le temps
machine nécessaire pour exécuter cette temporisation afin de déterminer la
valeur exacte de la temporisation.

Sachant que l’horloge interne divise par quatre la fréquence issue du quartz.

Prenons l’exemple d’une temporisation avec un quartz de 4Mhz : l’instruction GOTO


TEMPO dure 2 cycles , et l’instruction DECFSZ 1cycle. Le compteur (retard) est
initialisé à 255. Le PIC fera 255 fois la boucle de temporisation : la temporisation est
donc 3*255=765µs(3cycles *255*1µs)

Exemple d’une temporisation de 0.2s


;------------ Définition des registres temporaires ---------------
retard1 EQU 0x0C ; le registre temporaire retard1 se trouve à l'
adresse 0C
retard2 EQU 0x0F ; le registre temporaire retard2 se trouve à l'
adresse 0F
;------------ Programme de temporisation ( 0.2 s ) ---------------

MOVLW 0xFF ; on met 255 dans le registre W


MOVWF retard1 ; on charge retard1 avec 255 ( FFh contenu du
registre W ) MOVWF retard2 ; on charge retard2 avec 255 ( FFh
contenu du registre W ) tempo
DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction
si

GOTO tempo ; le registre retard1 = 0 sinon retour à tempo

MOVLW 0xFF ; on met 255 dans le registre W

MOVWF retard1 ; on charge retard1 avec 255 ( FFh contenu du registre


W ) DECFSZ retard2,F ; on décrémente retard1 et on saute la
prochaine instruction si GOTO tempo ; le registre retard1 = 0 sinon retour
à tempo
RETURN ; retour au programme principal après l 'instruction CALL
1.1Exemple de temporisateur interne utilisant le
Timer
CLIGNOTER UNE LED, TEMPO AVEC TMR0

;************************** programme led_tmr.asm ***************************


; Clignotement d'une LED reliée à n'importe quelle sortie du port B
; la temporisation est réalisée à l'aide de l'interruption provoquée
; par le débordement du timer TMR0. Ce dernier est cadencé par l'horloge
; interne pré divisée par 256 ce qui donne une période d'interruption
; de 255 x 255 = 65536 µs. à l'aide du compteur TIME, on fait changer
; l'état du port B tous les 8 cycles de TMR0 ce qui donne une temporisation
; de l'ordre de 524288 µs soit un peu plus d'une demi seconde
;***************************************************************************

list p=16f84,f=inhx8m
config _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC
#include

"p16f84.inc" TIME equ

0x10

; ************************************ démarrage sur REST


org 0
goto start

; ************************************ vecteur d'interruption


org 4
bcf INTCON,T0IF ; baisser le drapeau levé par
l'interruption decfsz TIME,f
retfie
comf PORTB
movlw d’8’ ; initialiser
TIME movwf TIME
retfie

start bsf STATUS,RP0 ; select bank1


clrf TRISB ; programme tous les bits du bort B en
sortie movlw B'00000111' ; timer cadencé par
horloge interne
movwf OPTION_REG ; prescaler associé à TMR0, ratio
255 bcf STATUS,RP0 ; select bank0
movlw B'10100000' ; autorisation globale des interruptions
; autorisation de l'interruption par
TMR0
movwf INTCON
movlw d’8’ ; initialise TIME pour le premier
passage movwf TIME
movlw B'00001111' ; met n'importe quelle valeur dans
PORB movwf PORTB

Loo goto Loop ; le PIC reste planté ici et n'en sort que pour aller exécuter une
p
interruption end
Exemple d'application: Un compteur binaire

; Titre : Compteur binaire

; PIC utilisé : PIC 16 F 84

; On réalise un compteur binaire sur les broches RB0 à RB7 d' un PIC 16 F 84 le quartz
utilisé

; est de 4 Mhz , on effectue une tempo environ égale à 0.2 seconde.

;------------ Directive d' assemblage pour MPLAB ---------------

list p=16f84A

#include p16f84A.inc
config H'3FF9'

;------------ Définition des constantes ---------------

#define inter0 0 ; bouton marche

;------------ Définition des registres temporaires ---------------

retard1 EQU 0x0C ; le registre temporaire retard1 se trouve à l' adresse


0C retard2 EQU 0x0D ; le registre temporaire retard2 se trouve à l'
adresse 0D memo EQU 0x0E ; le registre memo tampon se
trouve à l' adresse 0E
;------------ Init des ports A et B ---------------

ORG 0

bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder


; à la 2eme page mémoire ( pour trisa et trisb )

MOVLW B'00000000' ; on met 00 dans le registre W

MOVWF TRISB ; on met 00 dans le port B il est programmé en sortie

MOVLW 0x1F ; on met 1F dans le registre W

MOVWF TRISA ; on met 00 dans le port A il est programmé en entrée

bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder

; à la 1ere page mémoire

;------------ Programme principal ---------------

Main

btfss PORTA,inter0 ; interrupteur 0 ( marche ) appuyé ? si oui on continu sinon

goto Main ; on va à l' étiquette Main


MOVLW 0xFF ; on met 255 dans le registre W

MOVWF retard1 ; on charge retard1 avec 255 ( FFh contenu du registre W )

MOVLW 0xFF ; on met 255 dans le registre W

MOVWF retard2 ; on charge retard2 avec 255 ( FFh contenu du registre W )

MOVF memo, W ; on met memo dans W


MOVWF PORTB ; on met W sur le port B (
leds ) CALL tempo ; on appel la temporisation
MOVLW 0x01 ; on met 1 dans le registre
W ADDWF memo, F ; on additionne
memo + 1
GOTO Main ; retour au début du programme

;------------ Programme de temporisation ( 0.2 s ) ---------------

tempo

DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction


si

GOTO tempo ; le registre retard1 = 0 sinon retour à tempo

MOVLW 0xFF ; on met 255 dans le registre W

MOVWF retard1 ; on charge retard1 avec 255 ( FFh contenu du registre


W ) DECFSZ retard2,F ; on décrémente retard1 et on saute la
prochaine instruction si GOTO tempo ; le registre retard1 = 0 sinon retour
à tempo
RETURN ; retour au programme principal après l 'instruction CALL

END ; fin du programme

Exemple d'application: Les feux tricolores

; Titre : Feux
tricolores PIC utilisé
: PIC 16 F 84
; On réalise des feux tricolores sur les broches RB0 à RB5 d' un PIC 16 C 84

; le quartz est de 4 Mhz , on effectue une tempo longue environ égale à 4 secondes et

; une tempo courte environ égale à 1.5 secondes.

; un bouton marche sur le port A permet de lancer l' application

; RB0=rouge1 RB1=orange1 RB2=vert1

; RB3=rouge2 RB4=orange2 RB5=vert2

;------------ Directive d' assemblage pour PLAB ---------------

list p=16f84A

#include p16f84A.inc
config H'3FF9'
;------------ Définition des constantes ---------------

#define inter0 0 ; bouton marche

#define inter1 1 ; bouton clignotement orange

;------------ Définition des registres temporaires ---------------

retard1 EQU 0x0C ; le registre temporaire retard1 se trouve à l' adresse


0C retard2 EQU 0x0F ; le registre temporaire retard2 se trouve à l'
adresse 0F retard3 EQU 0x10 ; le registre temporaire retard3 se
trouve à l' adresse 10
;------------ Init des ports A et B ---------------

ORG 0

bsf STATUS,5 ; on met à 1 le 5eme bit du registre status pour accéder


; à la 2eme page mémoire ( pour trisa et trisb )

MOVLW 0x00 ; on met 00 dans le registre W

MOVWF TRISB ; on met 00 dans le port B il est programmé en sortie

MOVLW 0x1F ; on met 1F dans le registre W

MOVWF TRISA ; on met 1F dans le port A il est programmé en entrée

bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour accéder

; à la 1eme page mémoire

;------------ Init des feux ROUGE1 et ROUGE2 ---------------

MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB ; on met W sur le port B ( led )

;-------------------- Programme principal ----------------------

debut

MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB ; on met W sur le port B ( led )

btfss PORTA,inter0 ; interrupteur 0 ( marche ) appuyé ? si oui on continu sinon

;va à debut

goto debut

ret_cli

btfsc PORTA,inter1 ; interrupteur 1 ( clignotant ) appuyé ? si oui on


;va à clignote
goto clignote

MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB ; on met W sur le port B ( led )

;--------------- Chargement de la temporisation


---------------------

CALL tempo ; on appel la temporisation 1 ( longue )

MOVLW B'00001100' ; on met 0C dans le registre W ( Vert1 et Rouge2 )

MOVWF PORTB ; on met W sur le port B ( led )

CALL tempo ; on appel la temporisation 1 ( longue )

MOVLW B'00001010' ; on met 0A dans le registre W ( Orange1 et Rouge2 )

MOVWF PORTB ; on met W sur le port B ( led )

CALL tempo2 ; on appel la temporisation courte

MOVLW B'00001001' ; on met 0C dans le registre W ( Rouge1 et Rouge2 )

MOVWF PORTB ; on met W sur le port B ( led )

CALL tempo2 ; on appel la temporisation courte

MOVLW B'00100001' ; on met 24 dans le registre W ( Rouge1 et Vert2 )

MOVWF PORTB ; on met W sur le port B ( led )

CALL tempo ; on appel la temporisation longue

MOVLW B'00010001' ; on met 14 dans le registre W ( Rouge1 et Orange2 )

MOVWF PORTB ; on met W sur le port B ( led )

CALL tempo2 ; on appel la temporisation courte

GOTO debut ; retour au début du programme

;------------ Programme de temporisation longue


---------------

tempo

MOVLW 0xFF ; on met ff dans le registre W


MOVWF retard1 ; on met W dans le registre
retard1 MOVWF retard2 ; on met W dans le
registre retard2 MOVLW 0x12 ; on met 12 dans
le registre W MOVWF retard3 ; on met W
dans le registre retard3
attente

DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction si

GOTO attente ; le registre retard1 = 0 sinon retour à attente

movlw 0xFF ; on recharge retard1

movwf retard1

DECFSZ retard2,F ; on décrémente retard2 et on saute la prochaine instruction si

GOTO attente ; le registre retard2 = 0 sinon retour à attente

movlw 0xFF ; on recharge retard2

movwf retard2

DECFSZ retard3,F ; on décrémente retard3 et on saute la prochaine instruction si

GOTO attente ; le registre retard3 = 0 sinon retour à attente

RETURN ; retour au programme principal après l 'instruction CALL

;------------ Programme de temporisation courte ---------------

tempo2

MOVLW 0xFF ; on met ff dans le registre W


MOVWF retard1 ; on met W dans le registre
retard1 MOVWF retard2 ; on met W dans le
registre retard2 MOVLW 0x07 ; on met 7 dans le
registre W MOVWF retard3; on met W dans le
registre retard3 attente2
DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine instruction si

GOTO attente2 ; le registre retard1 = 0 sinon retour à


attente2 movlw 0xFF ; on recharge retard1
movwf retard1

DECFSZ retard2,F ; on décrémente retard2 et on saute la prochaine instruction si

GOTO attente2 ; le registre retard2 = 0 sinon retour à attente2

movlw 0xFF ; on recharge retard2


movwf retard2

DECFSZ retard3,F ; on décrémente retard3 et on saute la prochaine instruction si

GOTO attente2 ; le registre retard3 = 0 sinon retour à attente2

RETURN

clignote

MOVLW B'00010010' ; on met 12 dans le registre W ( Orange1 et Orange2 )

MOVWF PORTB ; on met W sur le port B ( led )

CALL tempo2 ; on appel la temporisation courte

MOVLW B'00000000' ; on met 00 dans le registre W ( aucune led )

MOVWF PORTB ; on met W sur le port B ( led


) CALL tempo2 ; on appel la temporisation
courte GOTO ret_cli

END

UTILISATION DE L’INTERRUPTION RB0


;----- Application avec un PIC : Gestion d'une interruption sur RB0 ------
; Titre : Interruption sur RB0
; PIC utilisé : PIC 16 F 84
; Ce montage d'initiation à base de PIC 16F84 permet de tester le déroulement d
'une
; interruption. Lorsque la broche RB0 passe de 0 à 1 ( front montant ) alors on
génère
; une IT , on allume une led ( RB7 ) et après une temporisation on éteint celle-ci.
; Une prochaine action sur RB0 redéclenche l ' IT

;------------ Directive d' assemblage pour PLAB

--- - list p=16f84A


#include p16f84A.inc
config H'3FF9'

Page
40
;**** Le programme pricipal commence à l ' étiquette init

****** ORG 0

Page
41
goto init

;**** Le programme d' interruption se déclenche lorsque l' entrée RB0 passe de

0 à 1 *** ORG 4

;*********** Programme d 'interruption **********************

bsf PORTB,7 ; on allume la led connectée

sur rb7

;------------ temporisation ---------------

tempo2
MOVLW 0xFF ; on met ff dans le registre W
MOVWF retard1 ; on met W dans le registre
retard1 MOVWF retard2 ; on met W dans le
registre retard2 MOVLW d'52' ; on met 7 dans
le registre W MOVWF retard3 ; on met W dans
le registre retard3

attente2

DECFSZ retard1,F ; on décrémente retard1 et on saute la prochaine


instruction si GOTO attente2 ; le registre retard1 = 0 sinon retour à
tempo

movlw 0xFF ; on recharge


retard1 movwf retard1

DECFSZ retard2,F ; on décrémente retard2 et on saute la prochaine


instruction si GOTO attente2 ; le registre retard2 = 0 sinon retour à
tempo

movlw 0xFF ; on recharge


retard2 movwf retard2
DECFSZ retard3,F ; on décrémente retard3 et on saute la prochaine
instruction si GOTO attente2 ; le registre retard3 = 0 sinon retour à
tempo
bcf PORTB,7 ; on éteint la led connectée sur rb7
bcf INTCON,INTF ; on remet à 0 le bit du registre d' IT qui est passé à 1

RETFIE ; retour d 'interruption


;************* Programme d' INIT **************************
init
retard1 EQU 0x0C ; le registre temporaire retard1 se trouve à l'
adresse 0C retard2EQU 0x0F ; le registre temporaire retard2 se trouve
à l' adresse 0F retard3 EQU 0x0E ; le registre temporaire retard3 se
trouve à l' adresse 0F bsf STATUS,5 ; on met à 1 le 5eme bit du
registre status pour accéder
; à la 2eme page mémoire ( pour configurer trisa et trisb
; -> broches en entrée ou en sortie )
MOVLW B'00000001' ; rb0, en entrée ( rb0 sera la broche utilisée
; pour l ' interruption )
MOVWF TRISB
bsf OPTION_REG,INTEDG ; Le passage de 0 à 1 sur RB0 provoque une
IT; sur un front montant ( choix du front sur RB0 )
bcf STATUS,5 ; on remet à 0 le 5eme bit du registre status pour
accéder
; à la 1ere page mémoire
bsf INTCON,INTE ; autorise l ' IT sur RB0
bsf INTCON,GIE ; autorise les
Interruptions clrf PORTB

;************ Programme principal en rebouclage *********************

debu
sleep ; mise en sommeil du PIC conso : 3.2 mA, attente
t

impulsion sur GOTO debut


RB0
;*********** Fin du programme ***********

end
COMMANDE D'UN AFFICHEUR 7 SEGMENT PAR LE PORT B

;*********************************** programme 7seg_bcl.asm ******************


; Afficher un compteur 4 bits sur un afficheur 7 segment Anode Commune
; connecté au port B. Le tableau de décodage 7 segments est situé dans
; la mémoire programme.
; La temporisation d'affichage est réalisée par boucle
;*************************************************************************************

list

p=16f84,f=inhx8m
include <p16f84.inc>
config _CP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC

C1 equ 0x0C ; compteur en position 0x0C de la


T1 equ 0x0D ;RAM
T1,T2,T3 = compteurs
T2 equ 0x0E temporisateur
T3 equ 0x0F

; ************************************ démarrage sur REST


org 0x00
goto main

; ************************************ vecteur d'interruption


org 0x04 ; normalement on ne devrait jamais passer
clrf INTCON ;par-là
aucune interruption autorisée
retfie

; *************************** Codes 7 segments anode commune


bcd7seg
addwf PCL,1
retlw 0x40 ;0
retlw 0x79 ;1
retlw 0x24 ;2
retlw 0x30 ;3
retlw 0x19 ;4
retlw 0x12 ;5
retlw 0x02 ;6
retlw 0x78 ;7
retlw 0x00 ;8
retlw 0x10 ;9
retlw 0x08 ;A
retlw 0x03 ;B
retlw 0x46 ;C
retlw 0x21 ;D
retlw 0x06 ;E
retlw 0x0E ;F

; ******************************** Routine de temporisation


tempo movwf T3
bcltmp decfsz T1,f
goto bcltm
p
decfsz T2,f
goto bcltmp
decfsz T3,f
goto bcltmp
return

; *************************************** Programme principal


main bsf STATUS,RP0 ; passage en bank 1 des
registres
clrf TRISB ; port B en
sortie bcf STATUS,RP0 ;
passage en bank 0
loop movf

C1,w andlw

0x0F
call bcd7seg
movwf PORTB ; affichage
movlw 4 ; 0.59
s call tempo
incf C1,1
goto

loop end
5V

fb
g

ec
dp
a b c d e f g P
PIC16f84 

Rb0 RB1 RB2 RB3 RB4 RB5 RB6 RB7


La compilation se fait a l’aide du logiciel MPLAB de Microchip

Simulation d’un PIC sous Proteus


Pour faire cela il est nécessaire d’avoir :
-> Proteus qui contient le module de simulation des pic (Module VSM)
-> Un schéma dont tout les composants sont simulables (ou ceux qui le sont pas :
exclus de la simulation :
exemple les borniers )
-> Un fichier exécutable (code machine) FICHIER.HEX, OU MIEUX un code machine
+ informations de Débugage :FICHIER.COF
1. Présence Module VSM

Le module VSM effectue la simulation du microprocesseur à partir de votre code


source. Vérifier la présence du module VSM adapté au microprocesseur à simuler
sous Proteus.
-> Lancer Licence Manager :
VSL pour PIC 16 XXXX dans l’exemple.
2. Fichier à simuler
Editer les propriétés du Microprocesseur puis sélectionner le fichier source, on peut
utiliser :
VERSION 1 : Soit le fichier_source.HEX

VERSION 2 : Soit le fichier_source.COF (contenant le fichier source et les directives


de désassemblage)
Il est préférable d’utiliser plutôt ce fichier. Ce qui permet des mises au point plus
efficace (mode pas à pas)

Pour lancer la simulation il suffit de cliquer sur l’icone « PLAY verte » en bas de page
Pour lancer la simulation en mode pas à pas (et débogage) :

En exécutant la simulation en mode pas à pas , vous pouvez ensuite exécuter le


programme par pas, mettre
des points d’arrêt dans le programme, voir l’état des registres, etc...
Circuits d’interfaces avec le microcontrôleur
1 Utilisation des leds

2-AFFICHEUR LCD

2.1 Présentation :
L’afficheur LCD, autrement appelé un afficheur à cristaux liquide. Il consomme
relativement de 1 à5 mA et constitué de deux lames de verre, distante de 20 µm
environ, sur lesquelles sont dessinées les mers nantisses formant les caractères.
L’application entre les deux faces d’une tension alternative basse fréquence de
quelques volts (3à5V) le rend absorbant .Un afficheur à cristaux liquide ne peut
être utilisé qu’avec un bon éclairage ambiant .Son lisibilité augmente avec
l’éclairage
2.2 Principe de fonctionnement :
on utilise le mode 4 bits de l’afficheur LCD. Dans ce mode, seul les 4 bits de poids
fort (D4à D7) de l’afficheur sont utilisés pour transmettre les données et les lires. Les
4bits de poids faible (D0à D3) sont alors connectés à la masse, on a donc besoin
hors alimentation de sept fils pour commander l’afficheur. Les données sont écrites
séquentiellement les quatre bits de poids fort suivi des quatre bits de poids faible.
Une impulsion positive d’au moins 450ns doit être envoyée
sur la ligne E pour valider chaque demi -octet. On peut après chaque action sur
l’afficheur vérifier que celui-ci est en mesure de traiter l’information suivante .Pour
cela, il faut demander une lecture en mode commande et tester le flag Busy BT.
Lorsque BF=0, l’afficheur est près à recevoir une nouvelle commande ou donnée.

2.3 Présentation d’un écran LCD :


Qu’il soit à une ou deux lignes, un afficheur LCD se présente sous la forme
suivante :

Au-dessus de l’écran à cristaux liquides proprement dit, on trouve une série de 14


broches aux rôles Suivantes :

Broche 1 : masse ;
 Broche 2 : Vcc ;
 Broche 3 : luminosité ;
 Broche 5, R/W : sélection du mode lecture ou écriture :

0 écritur
e
1 lectur
e
 Broche 6, E : Commande des opérations d’écriture ou de lecture ;
Broche 7à 14 : utilisées pour le transfert des données ou des instructions. Le transfert
peut se faire sur 8 bits, toutes les broches sont alors utilisées, ou sur 4 bits, dans ce
cas, seules les broches 11 à 14 sont utilisées.
Page
50
U1
OSC1/CLKIN 33
OSC2/CLKOUT
RB0/INT
34
RW LCD
RB1 RB2 RB3/PGM
1MCLR/Vpp/THV 35 LM032L
RB4 RB5 RB6/PGC RB7/PGD
36 RS E

8 7D2 D3 D4 D5 D6 D7
2 37
RA0/AN0
3
RA1/AN1 RA2/AN2/VREF- RA3/AN3/VREF+ RA4/T0CKI 38

VSS VDD VEE


4 39
5

RS RW E
40
6
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
8 RC1/T1OSI/CCP2
17
RE0/AN5/RD
RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT
18

4
RE1/AN6/WR

D0 D1
23

GND VCC VEE


RE2/AN7/CS
24

RS RW E
25
26
RD0/PSP019
RD1/PSP120
RD2/PSP221
RD3/PSP322
RD4/PSP427
RD5/PSP528
RD6/PSP629
RD7/PSP730
PIC16F877
VDD=VCC VSS=GND

Montages de l’afficheur LCD avec le PIC

3- Le clavier
3.1 Présentatio
n:
Le clavier est le périphérique le plus commode pour saisir du texte, mais dans notre
carte on va utiliser un clavier alphanumérique à 16 touches matricées pour saisir
des numéros et un peut d’alphabets, pour connecter le clavier au microcontrôleur
on est besoin d’un codeur de clavier 74LS922 pour préserver les ressources du
microcontrôleur.
3.2 Principe de fonctionnement :

Le clavier se compose de 16 touches reparties sur une matrice de 4 lignes (chaque


ligne contient 4 touches) 4 pistes sont disposées horizontalement (elles
correspondant aux 4 lignes de touches) et 4 autres pistes sont disposées
verticalement (elles correspondant aux 4 colonnes de touches). Chaque touche agit
comme un bouton poussoir qui établit le contact entre une des 4 pistes horizontales
et une des 4 pistes verticales.

Chaque touche est un interrupteur, normalement en position ouverte .Lorsqu’une


touche est appuyée un signal électrique est envoyé vers le codeur, circuit
électronique très simple qui associe à chaque signal un code (par exemple le code
ascii de la touche). Ce signal peut être utilisé pour envoyer une interruption au
processeur à fin qu’il traite l’information. Les codeurs réellement utilisés assurent
de fonctions supplémentaires comme le décodage automatique des touches
appuyées longtemps.
4 Circuit ULN2003
L’ULN est un composant qui à pour rôle de commander les relais. Il comporte deux
transistors, deux diodes et deux résistances. Le fait qu’il renferme tous les
composants lui permet d’avoir une longue durée de vie et de minimiser les pertes de
courant.

L’ULN est capable d'écouler un courant max de 500mA par transistor et supporte une
tension max de 50V. Ainsi vous pouvez connecter directement la majorité des relais
sans problème

Figure : Structure interne de l’ULN2003


Circuit ULN2803
L'ULN2803 est décrit comme "un conducteur à 8 lignes". Cela signifie qu'il contient le
circuit pour contrôler huit lignes de productions individuelles, chaque acte
indépendamment des autres.
5-Les moteurs
5-1. Moteur pas à
pas :

Moteur pas à pas

5.2 Présentation :
Le moteur pas à pas est un moteur qui tourne en fonction des impulsions
électriques reçu dans ses bobinages. L’angle minimal entre deux modifications des
impulsions électrique s’appelle un pas .On caractérise un moteur par le nombre de
pas par tour.
5.3 Principe de fonctionnement :
Pour identifier le brochage du moteur ,un simple ohmmètre(calibre 100 ou
200ohms)permet de déterminer d’une part les trois fils appartenant chaque
bobinage [P1-com1-P1\]et[P2-com2- P2\] ,d’autre part le point milieu d’un bobinage
donnée(si la résistance entre le commun et une phase vaut alors que celle entre
les deux phase vaut2R) .les deux les deux bobinages sont interchangeable, ainsi
que les deux phases extrêmes d’un même bobinage (P1etP1\) ; signalons que cette
dernière manipulation entraîne un changement du sens de rotation. Un cycle étant
réalisé en quatre étapes successives, la séquence ment est donc effectué par un
compteur binaire à quatre sorties, lesquelles présenteront donc cinq combinaisons
différentes (0000, 0001, 0010, 0100, 1000).Les étapes défilent au rythme de l’horloge
intégrée au compteur.

5.4 Connexion du moteur pas à pas sur la carte :


Le moteur pas à pas+ULN2003A sont connectés aux lignes RD0 à RD3 du
microcontrôleur.

5.5 Moteur à courant continue :


Le moteur à courant continue est une machine électrique tournante constitué de deux
parties principales : le stator (la partie fixe) et le rotor (la partie mobile).

Moteur à courant continue

5.6 Connexion du moteur

Dans ce figu
re on à utiliser deux relaies pour changer le rotation du moteur à courant
continue.
sensLes
dedeux pins MCC1 et MCC2 relier avec les pins RE0 etRE1 du
microcontrôleur.
Lorsqu'on veut commander le sens de rotation d’un moteur (à courant continu ou pas à
pas) on est souvent obligé d'inverser la polarité. De plus il est généralement
préférable de pouvoir faire varier la vitesse du moteur. La solution est d’utiliser le pont
en H.

Figure : Principe du pont en H


En regardant les schémas, on voit le sens de rotation du moteur : sur le schéma a ; le
moteur est à l'arrêt (on devrait même dire qu'il est freiné : en effet court-circuiter les
deux pôles d'un moteur revient à le freiner).

Sur le schéma b ; il tourne dans le sens inverse du schéma c, et enfin sur le


schéma d ; il est freiné. Et bien voici la base du pont en H, toute l'idée réside
dans ce schéma. Bien sûr, pour l'implémenter, il va nous falloir remplacer les
interrupteurs par des transistors.

IN1 IN2 TAT MOTEUR

0 0 ARRE
T
0 1 SENS
1
1 0 SENS
2
1 1 ARRE
T

Figure : Tableau des différentes séquences


Lorsqu'on arrête le moteur, et qu'il continue à tourner avec l'inertie, il se comporte
comme une génératrice. Pour éviter d'avoir des courants dans les transistors on
monte des diodes de roues libres.

Figure: Schéma d’un pont en H

Commande de 2moteurs DC avec

L293D
6-Les relais
Les relais sont pilotés via un transistor de commande, une diode de roue libre est
montée aux bornes du relais pour la protection du transistor

Montage du relais
7 Isolation à l’aide d’un opto- triac

Exemple de commande d’une lampe.

8 Isolation galvanique à
l’aide d’un
opto_transistor

Page
60
9 Affichage 7ségments multiplexé

10-Les touches de commande


Si on dispose de trois boutons poussoirs (SW0, SW1 et SW2)qui sont reliés à trois entrées
numériques du microcontrôleur en les reliant respectivement aux résistances (R10
,R9 et R8) de rappel à la source Vcc de moyenne valeurs (2.2 KΩ) pour ne pas
consommer plus de l’énergie .

SW O RE0
12 RE1 RE2
SW 1
12

SW 2
12
R10 R9R8
2.2k2.2k2.2k

VCC

Montage des boutons poussoirs


11-Communication série avec RS232
Le circuit adaptateur de niveau de tension TTL :RS232 permet alors de
relier un interface (exemple le téléphone au port série d’un
PC) .

Présentation :
Les liaisons séries permettant la communication entre deux systèmes
numériques en limitant le nombre de Fils de transmission..

 DCD (Data Carrier Detecte ) : Cette ligne est une entrée active à l’état haute.
Elle signal à l’ordinateur qu’une liaison a été établie avec un correspondant.
 RX( Reciver Data) : Cette ligne est une entrée.C’est ici que transitent les
informations du correspondant vers l’ordinateur.
 TX (Transmit Data ) : cette ligne est une sortie. Elle permet la véhicule des
données de l’ordinateur vers le correspondant.
 DTR (Data Terminal Ready ) :Cette ligne est une sortie active à l’état haut Elle
permet à l’ordinateur de signaler au correspondant que le port série à été libéré
et qu’il peut être utilisé s’il le souhaite.
 GND (GrouND) : c’est la masse.
 DSR (Data Set Read) : Cette ligne est une entrée active à l’état haut. Elle
permet au correspondant de signaler qu’une donnée est prête.
 RTS (Request To Send ) : cette ligne est une sortie active à l’état haut. Elle
indique au correspondant que l’ordinateur veut lui transmettre des
données..
 CTS (Clear To Send ) : Cette ligne est une entrée active à l’état haut.Elle indique à
l’ordinateur que le correspondant est prêt à recevoir des donnés.
 RI( RING Indicator) :Cette ligne est une entrée active à l’état haut.Elle permet à
l’ordinateur de savoir si un correspondant veut initier une communication avec
lui.

Fonctionnement :
Pour pouvoir dialoguer avec le PC, le microcontrôleur utilise son module
USART signifie (Universal Synchronous Asynchronous Reciever Transmitter ).

C’est donc un module qui permet d’envoyer et de recevoir des données en mode
série, soit de façon synchrone, soit asynchrone. Le module USART de notre PIC
gère uniquement deux pins,à savoir RC6/TX/CK et RC7/RX/DT.

Une liaison série synchrone nécessite une connexion dédiée à l’horloge, donc il
reste une seule ligne pour transmettre les données. Alors qu’en mode asynchrone on
n’a pas besoin d’une ligne d’horloge, il nous restera alors deux lignes pour
communiquer, chacune étant dédiée à un sens de transfert. Nous pourrons donc
envoyer et recevoir des données en même temps.

Les liaisons RS 232 sont des liaisons asynchrones très utilisées en


informatique. Elle nécessite que l’émetteur et le récepteur soit informé de la vitesse
choisie de transfert.

Puisque le récepteur connaît la vitesse du transfert il peut se passer de signal


de synchronisation.

Trois lignes sont nécessaires à cette

liaison. TX : transmission de donnés.

RX:récepteur de donné.
GND :masse

Grâce à cette liaison la carte peut servir d’interface entre un PC et un montage


extérieure afin d’adapter les signaux TTL du microcontrôleur au standard RS232

Un MAX232 est montée de faucon classique, les lignes RX, TX et la masse sont
disponibles sur un connecteur DB9 mâle qui permet ainsi de relier la carte au PC avec
un simple câble série.
11-2 MAX 232

Le circuit intégré MAX232 qui câble avec ces condensateurs au tantale de 1µF ,
permet d’adapter les niveaux de tension entre le PC et le téléphone comme
certains PC ne disposent pas d’une puissance suffisante sur leur port série, c’est le
cas notamment des portable , il est possible de connecter une alimentation
externe délivrant une tension de 12V
12 BUS I2C

Le bus I2C (inter integrated circuit ce qui donne IIC et par contraction I2C), a
été propos initialement par Philips mais adopté de nos jours par des très fabricants.
C’est bus de communication de type série.
1. Présentation :

Le bus I2C qui n’utilise que deux lignes de signal (et les masses correspondantes
bien sûr) permet à un certain nombre d’appareils d’échange des informations sous
forme série avec un débit pouvant atteindre 100 Kbits par seconde ou 400 kbits par
seconde pour les versions les plus récentes. Même si ces débits peuvent sembler
relativement faibles, les premières applications du bus I2C sont des applications
audio ou vidéo pour lesquelles la simplicité de mise en œuvre est nettement plus
importante qu’un débit élevé.
Les points forts du bus I2C sont :
Premièrement c’est un bus série bifilaire utilisant une ligne de données appelée SDA
(Serial Data) et une ligne d’horloge appelée SCL (Serial Clock).
Les données peuvent être échangées dans les deux sens sans restriction.

Le bus est multi-maître : chaque abonné dispose d’une adresse codée sur 7 bits, on
peut donc connecter simultanément 128 abonnés d’adresses différentes sur le même
bus.
Un acquittement est généré pour chaque octet de donnée transféré.
Le bus peut travailler à une vitesse maximum de 100 K bits par seconde (ou 400 Kbits
par seconde) étant entendu que son protocole permet de ralentir automatiquement
l’équipement le plus rapide pour s’adapter à la vitesse de l’élément le plus lent, lors
d’un transfert.

Le nombre maximum d’abonnés n’est limité que par la charge capacitive maximale du
bus qui peut être de 400pF.
Les données envoyées par paquets de huit bits indépendants(le bit de poids fort est
envoyé le premier) sur la ligne SDA, chaque octet est suivie par un bit
d’acquittement .La ligne SCL fonctionne comme une horloge sérielle d’un registre à
décalage, tant que cette ligne est à l’état haut les données de la ligne SDA doivent
être stables.
Certaines combinaisons particulières de niveaux et de fronts des deux lignes
déterminant la condition de départ ou d’arrêt de la transmission des données.
Condition de départ : Un front descendant sur SDA quand SCL est à l’état
haut. Condition d’arrêt : Un front montant sur SDA quand SCL est à l’état
haut.
13 Module horloge temps réel :

PCF8583 :

Le PCF8583 fonctionne en véritable horloge calendrier c'est-à-dire en mode de 24


heures et sur une période de vingt quatre ans. Il possède une sortie d’interruption
et de la RAM qui possède 232 octets disponibles en plus de ceux de sa propre
fonction.
Figure : Schéma de brochage
Caractéristiques électriques :

- consommation faible de courant.

- garantie de la fonction d’horloge et de rétention de mémoire sous 1v (et 2µA) ce qui


permet de le secourir facilement par une batterie.
Figure : architecture interne du PCF8583

2. Connexion de PCF8583:

L’horloge temps réel PCF8583 à accès I2C est raccordée à la ligne RC3 du Pic pour
l’horloge (SCL) et à RC4 pour les données (SDA), la liaison aux lignes RC3 et RC4
s’effectue en changeant l’état
du SW9. Les résistances R48 et R49 maintiennent positivement ces signaux au repos.
Le montage contient aussi une pile rechargeable pour alimenter le PCF8583 en
cas où la carte n’est pas alimentée.

Le bus I2C appartient à la catégorie des bus série par opposition aux bus parallèle ou
les données sont transmises par bloc, les données sont ici envoyées bit par bit par
groupe d’octet sur la ligne SDA.La ligne SCL fonctionne comme une horloge sérielle
d’un registre à décalage. Tant que la ligne SCL est à l’état haut les données de la
ligne SDA doivent être stables.

Lorsque la ligne SCL est à l’état bas, le circuit qui émet les données peut modifier l’état.

Figure: condition de validité des données sur le bus I2C

Certaines combinaisons particulières de niveaux et de fronts des deux lignes


déterminant la condition de départ ou d’arrêt de la transmission des données.
 Condition de départ : Un front descendant sur SDA quand SCL est à l’état haut.
 Condition d’arrêt : Un front montant sur SDA quand SCL est à l’état haut.
Pic 16F877 :
Le pic 16F877 est un circuit intègre contenu dans un boîtier nommer « DIL 40 », il
présente 40 broches, 20 de chaque coté. Les broches sont virtuellement numérotées
ere
de 1 à 40. La 1 broche est placé dans le coin situé à gauche de l’encoche de
repérage.

Figure : Les pins du 16F877

1. Les PINS de 16F877 :

 MCLR
Cette broche sert à initialiser le microcontrôleur.
Le microcontrôleur dispose de plusieurs sources de RESET :

• POR.

• EXTERNAL RESET

• WDT

• BOR

• POR: (POWER ON RESET) Mise sous tension.

Un front montant sur MCLR déclenche l'initialisation du microcontrôleur. Le temps


nécessaire est au minimum de 72ms et au maximum de 72ms+1024*Tosc. Le
microcontrôleur dispos en interne d’un circuit de détection de niveau, quand la
tension VDD est comprise entre 1.2V et 1.7V, il démarre une procédure
d’initialisation.
Cette broche peut être simplement reliée à VDD si on n’a pas besoin de RESET
externe. Par contre si on souhaite implanter un bouton de remise à zéro, on pourra
câbler un simple réseau RC sur la broche MCLR.
Remarque importante : On peut se passer de circuit RC à la seule condition que le
temps de monté de VDD soit suffisamment rapide (au minimum 50mV/ms). Si le
temps de montée est inférieur à 50mV/ms, il faut rajouter un réseau RC.
• EXTERNAL RESET (Mise à l’état bas de MCLR). Remise à zéro extérieure. Il faut
appliquer un niveau bas sur l'entrée RESET pendant au moins 2μS pour que
l'Initialisation soit prise en compte.
• WDT: Chien de garde.

Si le WDT arrive à la fin du temps de garde sans avoir été rafraîchi il y aura alors une
initialisation du microcontrôleur.
• BOR: Baisse de l’alimentation.

Si la tension VDD chute en dessous de 4V pendant 100μS au moins, le


microcontrôleur peut générer un RESET.

 Oscillateur : OSC1 et OSC2 ou CLKIN et CLOUT.


Ces broches permettent de faire fonctionner l’oscillateur
interne du PIC. On peut utiliser 3 types d’oscillateurs :
- Un quartz ou résonateur céramique

- Un oscillateur externe

- Un réseau RC

Remarque : Les instructions standards durent 1 cycle machine (sauf les instructions
de sauts 2
cycles). Le microcontrôleur utilise 4 coups d’horloge pour réaliser un cycle machine.

Si la fréquence du QUARTZ est de 20MHz (T=50nS), une instruction sera exécutée


toutes les 200nS, Dans ce cas là, le microcontrôleur a une puissance de calcul de
5MIPS (5 Millions d’instructions par secondes ! ! !).
La fréquence MAX est de 20MHz pour les microcontrôleurs dont les références se
terminent par - 20.Par exemples : 16F876-20 (20MHz max) et 16F876-04 (4MHz
max).

C1

1nF
U1
OSC1/CLK INRB 0/INT
X1 13
OSC2/CLK OUTRB1
33
34
CRYS T AL14
C2 1
MCLR/V pp/T HVRB2
35
36
RB3/PGM 37
2 RA0/AN0RB4 38
1nF 3 RA1/AN1RB5 39
4 RA2/AN2/V RE F-RB6/PGC 40
5 RA3/AN3/V RE F+RB7/PGD RA4/T 0CKI
6 RA5/AN4/S SRC0/T 1OS O/T 1CKI RC1/T 1OSI/CCP2
7 RE0/AN5/RDRC2/CCP 1
15
RE1/AN6/W RRC3/S CK /S CL 16
8 RE2/AN7/CSRC4/SDI/S DA RC5/SDO RC6/T X/CK 17
9 RC7/RX/DT 18
10
23
24
RD0/PS P0 RD1/PS P1 RD2/PS P2 RD3/PS P3 25
RD4/PS P4 RD5/PS P5 RD6/PS P6 RD7/PS P7 26

19
20
21
22
27
28
29
30

PIC16F877

Brochage du circuit d’oscillation PIC16F877

Page
70
Remarque : La consommation du circuit sera d'autant plus faible que la fréquence sera
petite, cela peut être intéressant pour des applications de faible consommation
(alimentation autonome).

Pour des applications faible consommation, on peut utiliser les séries LF (Low
Frequency and Low Power).

 Alimentation : VDD et VSS.


Ce sont les broches d'alimentation du circuit. Les tensions qui peuvent être appliquées
vont :
- De 4,5V à 6V pour la gamme standard F.
- De 2 à 6V pour la gamme étendue LF.
L'intensité du courant consommé peut aller de 1μA à
10mA. La consommation du microcontrôleur sera
fonction de :
- La tension d'alimentation.

- La fréquence interne.

- Le mode de fonctionnement.

De plus ces bornes doivent être découplées par deux condensateurs :

- 1μF électrolytique.
- 10nF céramique.

 L’Interruption : RBO/INT.
Cette broche à une double fonction elle peut être utilisée comme une broche
standard RBO ou comme une entrée d’interruption INT.

Si cette broche est utilisée comme une entrée d'interruption externe, elle doit être
maintenue à un niveau haut par l'intermédiaire de résistances de 10 kΩ pour ne
pas déclencher d’interruptions imprévues, cela permet aussi de relier plusieurs
sources d'interruptions sur une même ligne (OU CABLE).

2. Architecture interne du16F877 :

Comme pour tous les circuits intègre, chacun de ses broches à une ou plusieurs
fonctions qui sont résumées par un sigle mnémotechnique.

Ce microcontrôleur présente une architecture Harvard, les données sont placées dans
une mémoire de type RAM de 368 bytes. La mémoire de programme est constituée
de mot de 14 bytes, est type FLASH (non volatile).

Ces ressources sont donc précieuses, en comparaison de celles d’autres composantes.


Le 16F877 possède encore 5 ports (A à E) et 3 temporisateurs (timers), ce
diagramme bloc présente les composantes du 16F877 :
Figure 2: Architecture interne du PIC 16F877

*Les 5 ports sont d’entrées sorties input/output, ils sont bidirectionnels :

-Le port A (6 bits) I/O pure et/ou convertisseur analogique et/ou


TIMER 0. La broche RA4 5Entrée du timer 0 T0CKI) est de type
DRAIN OUVERT.
-Le port B (8 bits) I/O pure et/ou programmation in situ ICSP/ICD, RB0 est entrée
d’interruption externe.
-Le port C (8 bits) I/O pure et/ou SPI/I2C et/ou USART.
-Le port D (8 bits) I/O pure et/ou port parallèle 8 bits associé au port E.

-Le port E (3 bits) I/O pure et/ou pilotage du port E RE0/R, RE1/WR et RE/CS.

Remarque : Si le PIC est utilisé en mode ICSP/ICD il faut laisser libre les broches
RB3/PGM, RB6/PGC ainsi que RB7/PGD) et les configurer en entrée.

• Le PORT C (8 bits) I/O pure et/ou TIMER 1 et/ou SPI / I2C et/ou USART.
• Le PORT D (8 bits) I/O pure et/ou port parallèle 8 bits associé au PORT E.
• Le PORT E (3 bits) I/O pure et/ou pilotage du PORT E RE0/RD, RE1/WR et RE2/CS.

 Configuration des PORTx, les registres PORTx et TRISx.


Tous les ports sont pilotés par deux registres :

- Le registre de PORTx, si le PORT x ou certaines lignes de PORT X sont configurées


en sortie, ce registre détermine l’état logique des sorties.
- Le registre TRISx, c’est le registre de direction. Il détermine si le PORTx ou certaines
lignes de port sont en entrée ou en sortie. L’écriture d’une 1 logique correspond à
une entrée (1 comme Input) et l’écriture d’une 0 logique correspond à une sortie (0
comme Output).
Au RESET toutes les lignes de ports sont configurées en entrées.

Remarque : Les registres TRISx appartiennent à la BANQUE 1 des SFR.

Lors de l’initialisation du microcontrôleur il ne faut pas oublier de changer de page


mémoire pour les configurer.
Le tableau ci dessous représente les caractéristiques de PIC :

Tableau de caractéristiques

. Les mémoires du PIC 16F877 :

Les mémoires sont de trois types différents :

3.1 La mémoire FLASH :

C’est une mémoire programme de taille 8ko. Chaque case mémoire unitaire est de
taille 13 bits. Cette mémoire est de type mémoires stable, c'est-à-dire qu’on peut
réécrire dessus à volonté, car le 16F877 est caractérisé par la possibilité d’écrire des
données. La zone mémoire est caractérisée
par une adresse de 13 bits, alors ceci nous impose donc pour l’adressage les
registres EEAR et EEADRH. De même, nous aurons pour les données, les registres
EEDATA et EEDATH.

3.2 La mémoire RAM :

Cette mémoire de taille 368 octets est une mémoire d’accès rapide et elle est
volatile (les données seront perdus lorsque elle n’est plus sous tentions). Elle
contient tous les registres de configuration du PIC ainsi que les différents registres
de données. Elle contient également les variables utilisées par le programme. La
RAM est la mémoire la plus utilisée. Toutes les données qui y sont stockées sont
perdues lors d’une coupure de courant.

La RAM est subdivisée de plus en deux parties dans chacune on trouve des « cases
mémoire spéciales » appelée REGISTRES SPECIAUX et des cases mémoire « libre »
dont on peut se servir provoque un fonctionnement spécial du PIC ou la mise en
service d’une fonction particulière.
3.3 L’EPROM Interne :

Le pic 16F877contient également la mémoire électriquement effaçable. Ce type de


mémoire est d’accès plus lent. Pour gérer cette EEPROM on a besoin de quatre
registres, à savoir EEDR, EEDATA, EECON1 et EECON2.

Le registre EEADR est utilisé pour placer l’adresse relative en EEPROM, tandis que
le EEDATA contient la donné à lire ou à écrire.
L’adresse relative de l’accès EEPROM est donc comprise entre 0000 et 00FF ce qui
nous permet d’utiliser un registre de huit bit pour définir cette adresse.

4. Les Timers :

Il possède 3 timers qui sont :

-Le Timer0 (8bits) : il peut être incrémenté par des impulsions extérieures via la
broche (TOCKI/RA4) ou par l’horloge interne (Fosc/4).

-Le Timer1 (16 bits) : il peut être incrémenté soit par l’horloge interne par des
impulsions sur la broche T1CKI/RC0 ou par un oscillateur (RC ou quartz) connecté
sur les broches T1OSO/RC0 et T1OSI/RC1.

- Le Timer2 (8bits) : il est incrémenté par l’horloge interne, celle peut être pré
divisée. Tous ces timers peuvent déclencher une interruption interne, s’ils
ont été autorisés.
5. L’unité centrale :

 Organisation mémoire
Comme les PICs utilisent un bus pour les instructions et un bus pour les
données, il faut considérer deux plans mémoire l’un pour les instructions et l’autre
pour les données ainsi que les registres internes.
Figure 3 : Plan Mémoire pour les instructions

(Code programme)

Le plan mémoire est linéaire les adresses vont de 0000h à 1FFFh (8k mots de 14
bits), par page de 2K mots. On peut remarquer, le vecteur de reset est figé en
0000h.

Les PICs n’ont qu’un seul vecteur d’interruption en 0004h. Lors d’une
interruption, le sous programme associé devra déterminer quel périphérique a
demandé une interruption.

La pile utilisée par les sous programmes n’est pas implantée en mémoire de donnée
comme avec les microcontrôleurs classiques, mais dans la mémoire programme.
Elles sont utilisées lors d’appels de sous programmes, on ne peut pas imbriquer
plus de 8 sous programmes (Ce qui est déjà beaucoup).

6. Les interruptions :

6.1 Présentation :

Le microcontrôleur dispose de plusieurs sources d'interruptions.

• Une interruption externe, action sur la broche INT/RB0.

• Débordement du TIMER0.

• Changement d’état logique sur une des broches du PORTB (RB4 à RB7).

• Une interruption d’un des périphériques (PEIE).

- Fin de programmation d’une case mémoire de l’EEPROM.

- Changement d’état sur le PORTD (PSPIE).

- Fin de conversion analogique numérique (ADIE).

- Réception d’une information sur la liaison série (RCIE).


- Fin d’émission d’une information sur la liaison série (TXIE).
- Interruption SPI ou I2C du module MSSP (SSPIE).

- Interruption du registre de capture et/ou de comparaison 1 (CCPI1E).

- Interruption du registre de capture et/ou de comparaison 2 (CCPI2E).

- Débordement du TIMER1 (TMR1E).

- Débordement du TIMER2 (TMR2E).

- Collision de BUS (BCLIE)

6.2 Fonctionnement :

Lors d’un événement dans un ou plusieurs des circuits périphériques (ADC,


EEPROM, USART- SCI, MSSP-I2C-SPI, TIMER1, TIMER2) comme par exemple : la
fin de conversion, la fin de programmation d’un octet dans l’EEPROM, la réception
d’une information, la détection d’un front, etc.… et si le bit de l’interruption
concernée a été autorisée (EEIE, PSPIE, ADIE, RCIE, TXIE, SSPIE, CCP1IE,
TMR2IE, TMR1IE, CCP2IE ou BCLIE : Registres PIE1 et PIE2) alors une
interruption périphérique est déclenchée. Pour que celle-ci soit prise en compte il
faut que le bit d’autorisation des interruptions périphériques soit positionné à 1
(PEIE) ainsi que le bit GIE d’autorisation globale des interruptions du registre
INTCON.
Pour qu’une interruption du type TIMER0 ou INT/RB0 ou PORTB soit prise en
compte il suffit que le bit local d’autorisation d’interruption soit positionné à 1 (T0IE
ou INTE ou RBIE) ainsi que le bit GIE d’autorisation globale des interruptions du
registre INTCON.

Dans ces conditions le programme en cours d’exécution est interrompu et le


microcontrôleur exécute le programme d’interruption à partir de l’adresse 0x0004. Au
début de celui-ci il faut que le logiciel vérifie quel périphérique a déclenché
l’interruption.

Le programme se déroule normalement. Survient un événement spécifique. Le


programme principal est interrompu (donc, subit une INTERRUPTION), et va traiter
l’événement, avant de reprendre le programme principal à l’endroit où il avait été
interrompu .L’interruption est donc une RUPTURE DE SEQUENCE ASYNCHRONE,
c’est à dire non synchronisée avec le déroulement normal du programme. Vous
voyez ici l’opposition avec les ruptures de séquences synchrones, provoquées par le
programme lui-même (goto, call, btfss…).

Mécanisme générale d’une interruption :

Une routine d’interruption est un sous-programme particulier, déclenché par


l’apparition d’un événement spécifique. Cela a l’air un peu ardu, mais vous allez voir
que c’est très simple.

Voici donc comment cela fonctionne :

Le programme se déroule normalement


 L’événement survient
 Le programme achève l’instruction en cours de traitement
 Le programme saute à l’adresse de traitement de l’interruption
 Le programme traite l’interruption
Le programme saute à l’instruction qui suit la dernière exécutée dans le
programme principal.

Il va bien sûr de soi que n’importe quel événement ne peut pas déclencher une
interruption. Il fault que 2 conditions principales soient remplies :

L’événement en question doit figurer dans la liste des événements susceptibles de


provoquer une interruption pour le processeur sur lequel on travaille
L’utilisateur doit avoir autorisé l’interruption, c’est à dire doit avoir signalé que
l’événement en question devait générer une interruption.

Le programme principal ne sait pas quand il est interrompu, il est donc crucial de lui
remettre ses registres dans l’état où ils étaient avant l’interruption.

En effet, supposons que l’instruction xxx ait positionné un flag (par exemple, le bit
d’indicateur Z). Si par malheur, la routine d’interruption a modifié ce bit, le
programme ne pourra pas se poursuivre normalement.

Nous voyons également que l’instruction xxx termine son exécution avant de se
brancher sur la routine d’interruption. Une instruction commencée n’est donc jamais
interrompue.

Mécanisme d’interruption sur les PICs :

les PICs répondent au fonctionnement général ci-dessus, mais elles ont


également leurs particularités. Voyons maintenant le principe des interruptions sur
les PICs

Tout d’abord, l’adresse de début de toute interruption est fixe. Il s’agit toujours de
l’adresse 0x04. Toute interruption provoquera le saut du programme vers cette
adresse.

Toutes les sources d’interruption arrivant à cette adresse, si le programmeur utilise


plusieurs sources d’interruptions, il lui faudra déterminer lui-même laquelle il est
en train de traiter.

Les PICs en se connectant à cette adresse, ne sauvent rien automatiquement, hormis


le contenu du PC, qui servira à connaître l’adresse du retour de l’interruption. C’est
donc à l’utilisateur de se charger des sauvegardes.

Le contenu du PC est sauvé sur la pile interne (8 niveaux). Donc, si vous utilisez
des interruptions, vous ne disposez plus que de 7 niveaux d’imbrication pour vos
sous-programmes. Moins si vous utilisez des sous-programmes dans vos interruption.

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. Celui-ci est achevé, puis le processeur s'arrête un cycle pour charger
l'adresse 0x04 dans PC. Le processeur se connecte alors à l'adresse 0x04 où il lui
faudra un cycle supplémentaire pour charger l'instruction à exécuter. Le temps mort
total sera donc compris entre 3 et 4 cycles.
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 (que nous allons voir).
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 convertisseur

Le CAN est un périphérique intégré destiné à mesurer une tension et la convertir


en nombre binaire qui pourra être utilisé par un programme.
Le16F877 travaille avec un convertisseur analogique/numérique qui permet un
échantillonnage sur 10 bits. Le signal numérique peut donc prendre 1024 valeurs
possibles. On sait que pour pouvoir numériser une grandeur, nous devons connaître la
valeur minimale qu’elle peut prendre, ainsi que sa valeur maximale, Les pics
considèrent par défaut que la valeur minimale correspond à leur Vss d’alimentation,
tandis que la valeur maximale correspond à la tension positive d’alimentation Vdd. le
principe de la conversion suit la séquence est la suivante :
- Le pic connecte le pin sur laquelle se trouve la tension à mesurer à un condensateur
interne, qui va se charger via une résistance interne jusque la tension appliquée.

Le pin est déconnecté du condensateur, et ce dernier est connecté sur le


convertisseur analogique/numérique interne.

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 notre pic, il
faut savoir qu’il nécessite, pour la conversion d’un bit, un temps nommé Tad.

Ce temps est dérivé par division d’horloge principale. Le diviseur peut prendre une valeur
de 2, 8 ou
32. Le temps de conversion Tad ne peut détendre, pour des raisons électroniques, en
dessous de
1.6 us pour les versions classiques de 16F87x, et en dessous de 6 us pour les
versions LC. Donc en fonction des fréquences utilisées pour le quartz du pic, on choisit
le diviseur le plus approprié.

Voici un tableau qui reprend les valeurs de diviseur à utiliser pour quelques
fréquences courantes du quartz et pour les PICs de type classique :

Diviseu 20Mh 5Mhz 4Mhz 2Mhz 1,25Mh 333,3Kh


r z z z
2 100n 400n 500n 1µs 1,6µ 6µs
s s s s
8 400n 1,6µs 2µs 4µs 6,4µ 24µs
s s
32 1,6µ 6,4µs 8µs 16µs 25,6µ 96µs
s s
Osc 2-6µs 2-6µs 2-6µs 2-6µs 2-6µs 2-6µs
RC

Les valeurs 400ns; 1,6µs; 2µs; 4µs; 6,4; 24µs correspondent au meilleur diviseur en
fonction de la fréquence choisie, en ce qui nous concerne puisqu’on utilise une
fréquence de 4MHZ, on utilisera la valeur de 2µs dans notre programmation. Il faut
à présent préciser que le PIC nécessite un temps Tad avant le démarrage effectif de
la conversion, et un temps supplémentaire Tad à la fin de la conversion.
Résumons donc 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.

Figure : cycle de conversion

Le module de conversion utilise 4 registres disposés comme suit :

*Registre de Résultat High (ADRESH)

*Registre de Résultat Low (ADRESL)

*Registre0 de Contrôle (ADCON0)

*Registre1 de Contrôle (ADCON1)

Regardons cela de prés dans la figure ci-dessous :

Configuration interne du module de convertisseur analogique/numérique :

Figure : module du convertisseur


On voit très bien sur ce schéma que les pins AN2 et AN3 servent selon la position
du sélecteur d’entrée analogique ou de tension de référence. Le sélecteur de canal
permet de sélectionner lequel des 8 canaux va être appliqué au convertisseur
analogique/digital.

On voit que la sélection de la source des tensions de référence dépend de bits


du registre ADCON1, tandis que le canal sélectionné pour être numérisé dépend
d’ADCON0. C’est le registre ADCON1 qui détermine si ce port sera utilisé comme
port I/O ou comme port analogique. Nous en aurons besoin dans la programmation.

 Les registres ADRESL et ADRESH :


Le convertisseur donne un résultat sur 10 bits, et donc que ce résultat devra donc
obligatoirement être sauvegardé dans 2 registres. Ces registres sont tout
simplement les registres ADRESL et ADRESH. Comme 2 registres contiennent 16
bits, et que nous n’en utilisons que 10, Microchip nous a laissé le choix sur la façon
dont est sauvegardé le résultat, nous pouvons soit justifier le résultat à gauche, soit
à droite
La justification à droite complète la partie gauche du résultat par des « 0 ». Le résultat
sera donc de la forme :

ADRESH ADRESL

0 0 0 0 0 0 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0

La justification à gauche procède bien évidemment de la méthode inverse :

ADRESH ADRESL

B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 0 0 0 0 0 0

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 vous suffisent. Dans ce cas, les 2 bits de poids faibles se trouvent isolés dans
ADRESL, il suffit donc de ne pas en tenir compte. Cette approche est destinée à nous
épargner des décalages de résultats.

Le choix de la méthode s’effectue à l’aide du bit 7 d’ADCON1.


Le registre ADCON1 :

Ce registre permet de déterminer le rôle de chacune des pins AN0 à AN7. Il


permet donc 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.
Pour pouvoir utiliser un pin en mode analogique, il faudra que ce pin soit configuré
également en entrée par TRISA. Le registre ADCON1 dispose, comme tout registre
accessible de notre PIC, de 8 bits, dont seulement 5 sont utilisés :

1.2 Tableau : le registre ADCON1

Page
80
B7 ADFM A/D result format select
B6 INUTILISE lu comme « 0 »

B5 INUTILISE lu comme « 0 »

B4 INUTILISE lu comme « 0 »

B3 PCFG3Port Configuration control bit 3

B2 PCFG2Port Configuration control bit 2

B1 PCFG1Port Configuration control bit 1

B0 PCFG1Port Configuration control bit 0

Le bit ADFM permet de déterminer si le résultat de la conversion sera justifié à


droite (1) ou à gauche (0). Nous trouvons dans ce registre les 4 bits de configuration
des pins liés au convertisseur analogique/numérique. Ces bits nous permettent
donc de déterminer le rôle de chaque pin.

Comme nous avons 16 combinaisons possibles, nous aurons autant de possibilités de


configuration

Le registre ADCON0 :
Ce registre est le dernier utilisé par le convertisseur analogique/numérique. Il
contient les bits que nous allons manipuler lors de notre conversion. Sur les 8 bits
de notre registre, 7 seront utilisés.
Tableau : le registre ADCON0 :

B7 ADCS A/D conversion Clock Select


1 bit 1

B6 ADCS A/D conversion Clock Select


0 bit 0

B5 CHS2 Analog Channel Select


bit2
B4 CHS Analog Channel Select
1 bit1
B3 CHS Analog Channel Select
0 bit0
B2 GO/DON A/D conversion status
E bit

B1 Inutilis lu comme « 0
é »

B0 ADO A/D ON
N bit

l’oscillateur : L’horloge est un système qui peut être réalisée soit avec un QUARTZ(a),
soit avec une horloge extérieur(b), soit avec un circuit RC(c), dans ce dernier la
stabilité du montage est limitée.

La fréquence maximale d’utilisation va dépendre de Microcontrôleur utilisé. Le suffixe


indiqué sur le

boîtier donne la nature de l’horloge à utiliser et sa fréquence maximale