Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Cours de Microcontroleur

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 39

1- GENERALITES…………………………………………………………………………….

1-1 Du Microprocesseur au microcontrôleur

1-2 Les différentes familles des PICs

1-3 Identification d’un PIC

2- PRESENTATION GENERALE DU PIC 16F84A………………………………………………4

2-1 Classification du PIC 16F84A

2-2 Brochage du PIC 16F84A

2-3 Architecture Interne

3-DESCRIPTION ET FONCTIONNEMENT DES PRINCIPALES PARTIES INTERNES………..6

3-1) La mémoire de programme

3-2) La mémoire EEPROM

3-3) La mémoire RAM

3-4) Les ports d’entrées / sorties

3-5) Le timer

4 -ETUDE DU JEU D’INSTRUCTIONS EN ASSEMBLEUR ……………………………………...13

5- LES DIRECTIVES D’ASSEMBLAGE . ………………………………………………..30

6- MISE EN ŒUVR E …………………………………………………………………... ….32

1
1-GENERALITES

1-1) Du microprocesseur au microcontrôleur

Le Processeur est l’élément central d’un système informatique : il interprète les


instructions et traite les données d’un programme . Il a besoin de certains éléments externes pour
fonctionner :

 Une horloge pour le cadencer (en général à quartz)


 Des mémoires (vive et morte) sont chargées de stocker le programme qui sera exécuté
ainsi que les données nécessaires et les résultats obtenus
 Des périphériques pour interagir avec le monde extérieur
Ces éléments sont reliés par 3 bus :
 Le bus d’adresses qui permet au microprocesseur de sélectionner la case mémoire
ou le périphérique auquel il veut accéder pour lire ou écrire une information
( instruction ou donnée)
 Le bus de données qui permet le transfert des informations entre différents éléments
 Le bus de contrôle qui indique si l’opération en cours est une lecture ou une
écriture, si un périphérique demande une interruption pour faire remonter une
information au processeur ,etc (voir figure ci-dessous).

Bus d’adresses

ROM RAM Ports


Processeur Programme Données d’E/S

Bus de données

lecture
écriture
bus de contrôle

Structure d’un système à microprocesseur

Le développement d’un tel système à base de microprocesseur se trouve donc pénalisé par
 La nécessite de prévoir l’interconnexion de ces composants (bus , câblage,
nappes de connexion)
 La place occupée physiquement par les composants
 La consommation énergétique
 Le cout financier
Par rapport à des systèmes électroniques à base de microprocesseurs , les microcontrôleurs
permettent de diminuer la taille en rassemblant ces éléments essentiels dans un seul circuit
intégré , la consommation électrique et le coût des produits. Un microcontrôleur est donc un
composant autonome , capable d’exécuter le programme contenu dans sa mémoire morte dès
qu’il est mis sous tension. Selon les modèles et les conditions de fonctionnement , les
2
microcontrôleurs peuvent avoir besoin de quelques composants externes (quartz ,quelques
condensateurs). Ils sont fréquemment utilisés dans les systèmes embarqués , comme les
téléphones mobiles, les jouets, l’électroménager ,les télécommandes, automobile, baladeurs,
transport aérien/ maritime/ fluvial ,récepteurs GPS ,etc

Il existe plusieurs fabricants de microcontrôleurs tel que INTEL, MOTOROLA, ATMEL,


ZILOG, PHILIPS , MICROCHIP , etc.

Le microcontrôleur que nous allons étudier est celui de la sociteté Americaine « Microchip »
,car par rapport aux autres fabricants , les microcontrôleurs de Microchip sont facilement
disponibles sur le marché ; leur jeu d’instruction est réduit ,gratuité des outils de
développement(logiciels) .Le prix des composants et des programmateurs sont aussi à la portée
de toutes les bourses . Ces circuits connaissent actuellement un succès que l’on peut , sans
exagérer qualifier de planétaire et sont largement utilisés dans l’industrie.
Ils sont connus sur la dénomination PIC(Peripheral Interface Controller) qui est sous copyring de
Microchip.

MICROCONTROLEUR
EXTERIEUR

3
1-2 Les différentes familles des PICS

Les PICs sont subdivisés à l’heure actuelle en 3 grandes familles :


- La famille Base-Line qui utilise des mots d’instructions de 12 bits
- La famille Mid-Range qui utilise des mots d’instructions de 14 bits
- La famille High-Range qui utilise les mots d’instructions de 16 bits

1-3 Identification d’un PIC

Pour identifier un PIC , vous utiliserez simplement son numéro


Les deux premiers chiffres indiquent la famille du PIC
Vient ensuite parfois la lettre L : Celle–ci indique que le PIC peut fonctionner avec une plage de
tension beaucoup plus tolérante( 2V à 5,5V).
Ensuite , vous trouvez :
-C indique que la mémoire programme est une EPROM ou plus rarement une EEPROM
-CR pour indiquer une mémoire de type ROM
Ou F pour indiquer une mémoire de type FLASH
Notez à ce niveau que seule une mémoire FLASH ou EEPROM est susceptible d’être effacée ,
donc n’espérez pas reprogrammer vos PICs de type CR. Pour les versions C, par exemple le
16C84 peut être reprogrammé , il s’agit d’une mémoire EEPROM. Le 12C508 ,par exemple ,
possède une mémoire programme EPROM , donc effaçable uniquement par exposition aux
ultraviolets. Donc , l’effacement nécessite une fenêtre transparente sur le Chip.

Un composant qu’on ne peut reprogrammer est appelé O.T.P pour One Time Programming :
composant à programmation unique.

Puis vous constatez que les derniers chiffres identifient précisément le PIC.

Enfin vous verrez sur les boitiers le suffixe « -XX » dans lequel XX représente la fréquence
d’horloge maximale que le PIC peut recevoir.

EXEMPLE :
PIC 16 F 87 - 04
Fréquence maximale de fonctionnement = 4MHz

Identifie précisément le PIC

Type de mémoire programme (F = FLASH)

Famille de PIC : (16 ≡ Mid-Range )

appellation contrôlée par Microchip.

2-PRESENTATION GENERALE DU PIC16F84A


2-1) Classification du PIC16F84A

4
Le PIC16F84A est un microcontrôleur de la famille des Mid-Range .Il dispose d’un bus de
données de huit bits . Chaque registre de données dans laquelle chaque emplacement ( défini par
une adresse) possède huit cases pouvant contenir chacune un bit.

2-2) Brochage du PIC16F84A


Le PIC16F84A est un circuit intégré de technologie CMOS( Complémentary Métal Oxyde
Semi-conducteur) composé de 18 broches ( figure 2)

RA2 1 18 RA1

RA3 2 17 RA0

RA4/TOCLK 3 16 OSC1/CLKIN
I
MCLR 4 15 OSC2/CLKOUT

VSS 5 PIC16F84A 14 VDD

RB0/INT 6 13 RB7

RB1 7 12 RB6

RB2 8 11 RB5

RB3 9 10 RB4

Figure 2
Le PIC16F84A est composé de :
 Un port A de 5 bits de RA0 ~ RA4
 Un port B de 8 bits RB0 ~ RB7
chacun des bits de ces ports peut être configuré comme une entrée ou une sortie. Certaines de
ces broches ont aussi d’autres fonctions ( interruption ,timer)
 deux entrées oscillateur sur lesquelles se branche l’horloge ( QUARTZ ; RC etc…)
_____
 Une entrée de MCLR pour la remise à zéro.
 Vss et VDD pour la masse et l’alimentation
2-3) Architecture interne simplifiée

5
Figure 3

Le PIC16F84A utilise l’architecture Harvard comme la plus part des PICS .


Elle consiste en la séparation du bus d’instructions du bus de données, ce qui permet aux
instructions d’être exécutées en un seul cycle , sauf les sauts qui en utilisent deux . Lorsqu’on

6
utilise une architecture Harvard les mots de programme peuvent avoir une largeur (nombre de
bits) différente de celle des mots de la mémoire de données et des registres. Par exemple
pour le PIC16F84A :
- bus d’instructions : 14 bits
- bus de données : 8 bits
L’architecture classique traditionnelle est celle de von Neumann ou on utilise le même bus pour
les instructions et les données .

3-DESCRIPTION ET FONCTIONNEMENT DES PRINCIPALES PARTIES INTERNES

3-1) La mémoire de programme


La mémoire de programme est constituée de 1K mots(1024 emplacements ) de 14 bits chacun .
C’est dans cette zone que vous allez écrire votre programme. Elle est non volatile et elle est type
FLASH c’est-à-dire elle peut être programmée et effacée par l’utilisateur via un programmateur
et un PC. La technologie utilisée permet plus de 1000 cycles d’effacement et d’écriture.

 Déroulement d’un programme


A la mise sous tension , le processeur va chercher la 1ere instruction qui se trouve à l’adresse
0000 de la mémoire de programme, l’exécute puis va chercher la 2eme instruction à l’adresse
0001 ainsi de suite sauf cas de saut ou appel de sous programme.(voir figure 4).

1FFFH

Figure 4

 On constate sur cette figure 4 que la mémoire de programme contient 1024


emplacements( 3FF en hexadécimale) contenant 14 bits ( de 0 à 13 ) . Une instruction
occupe un emplacement qui est défini par une adresse . Le processeur peut alors
sélectionner l’emplacement souhaité grâce au bus d’adresse et il peut lire son contenu( ici
7
l’instruction) grâce au bus d’instruction. Cet adressage s’effectue à l’aide d’un compteur
de programme (CP) ou PC (Programm counter) qui lors de la mise sous tension démarre à
zéro puis s’incrémente de 1 tous les quatre coups d’horloge , on exécute bien ainsi les
instructions les urnes à la suite des autres.
 Mais il arrive que dans un programme on fasse appel à un sous programme dont l’adresse
de l’instruction ne se retrouve pas juste après celle qui est en train d’être exécutée . C’est
le rôle de la pile qui sert à emmagasiner de manière temporaire l’adresse d’une
instruction. Elle est automatiquement utilisée chaque fois que l’on appelle un sous
programme et elle permet une fois que l’exécution du sous programme est terminée de
retourner dans le programme principal juste après l’endroit ou l’on a appelé le sous
programme. On constate que cette pile possède huit niveaux, cela signifie qu’il n’est pas
possible d’imbriquer plus de huit sous programmes , car au delà de huit ,le processeur ne
sera plus capable de retourner à l’adresse de base du programme principal.
 L’adresse 0000 est réservé au vecteur RESET , cela signifie que c’est à cette position
que l’on accède chaque fois qu’il se produit une réinitialisation ( 0 volts sur la patte
MCLR) . C’est pour cette raison que le programme de fonctionnement du microcontrôleur
doit toujours démarrer par cette adresse.
 L’adresse 0004 est assignée au vecteur interruption et fonctionne de manière similaire à
celle du vecteur de RESET. Quand une interruption est produite et validée , le compteur
ordinal PC se charge avec 0004 et l’instruction stockée à cet emplacement est exécutée.

3-2) La mémoire EEPROM

La mémoire EEPROM (Electrical Erasable Programmable Read Only Memory), est constituée
de 64 octets que vous pouvez lire et écrire depuis votre programme. Ces octets sont conservés
après une coupure de courant et sont très utiles pour conserver des paramètres semi permanents.
3-3) La mémoire RAM
La mémoire RAM (Random Acces Memory) est organisée en 2 pages (voir figure5). Dans
chacune des pages nous allons trouver des « cases mémoires spéciales » appelées REGISTRES
SPECIAUX.Ils permettent la configuration et la surveillance de l’etat du processeur et de ses
periphériques ; ces registres sont accessibles en lecture ou en ecriture suivant leur fonction.
Le bus d’adresse qui permet d’adresser la RAM est composé de 7 fils (voir figure3) ce qui veut
dire qu’il est capable d’adresser 128 emplacements différents . Or , chaque page de la RAM est
composée de 128 octets, le bus d’adresse ne peut donc pas accéder aux deux pages , c’est
pourquoi on utilise une astuce de programmation qui permet de diriger le bus d’adresse soit sur
la page 0 ,soit sur la page 1. Cela est réalisé grâce à un bit d’un registre spécifique( le bit RP0 du
registre STATUS) dont nous verrons le fonctionnement plus loin .
La RAM de données proprement dite se réduit donc à la zone notée GPR ( registre à usage
général ) ( voir figure5) qui s’étend de l’adresse 0Ch ( 12 en décimale ) jusqu’à 4Fh( 79
décimale) soit au total 68 registres en page 0 et autant en page 1 , mais on constate que les
données écrites en page 1 sont redirigées en page 0 cela signifie qu’au final l’utilisateur dispose
uniquement de 68 registres( donc 68 octets de mémoire vive) qui permettent le stockage de
variables ; ils sont accessibles en lecture et en ecriture par le programme ; sachant qu’ à la mise
hors tension , ces données sont perdues.

8
MEMOIRE DE DONNEES
RAM

REGISTRES
SPECIAUX

REGISTRES A
USAGE GENERAL

NON INPLEMENTES
7FH FFH

Page 0 Page 1
Figure 5
Nous allons détailler un à un les registres spéciaux et voir comment on peut accéder à la page 0
ou à la page 1 .

 Adresse 00 et 80 , INDF . Ce registre spécial contient la valeur du registre pointé par le


FSR (on parle d’adressage indirect) INDF n’est pas un registre physique.
 Adresse 01 , TMRO . Contenu du timer0 ( 8 bits) . il peut être incrémenter par l’horloge
( fosc/4) c'est-à-dire les 4 coups d’horloge ou par l’horloge sur la broche RA4 .
 Adresse 02 et 82 , PCL . Contient les 8 bits de poids faibles du compteur ordinal
(PC) .Les 5 ( 12-8 ) bits de poids forts sont dans PCLATH.
 Adresse 03 et 83 , STATUS registre d’état
Les cinq bits de poids faibles de ce registre sont en lecture seule , ce sont des témoins

9
( drapeaux ou flag en Anglais) caractérisant le résultat de l’opération réalisée par l’ UAL
. Le bit RP0 est lui en lecture / écriture et c’est lui qui permet de sélectionner la page
dans la mémoire RAM .
___ __
RP0 TO PD Z DC C

Si RP0 = 0 on accède à la page 0(Bank0) et si RP0 = 1 On accède à la page 1(Bank1)


__
TO ( Timer Out) : Ce bit passe à « 0 » lorsque le timer chien de garde (WDT)
atteint la fin de comptage .
__
PD ( Power Down ) : Ce bit passe à « 0 » lorsque le microcontrôleur rencontre
l’instruction particulière « Sleep »(mise en sommeil) qui détermine le mode de
mise en veille du PIC en bloquant les impulsions d’horloge nécessaires au
cadencement de tous les échanges. Le PIC attend un événement pour repartir
Z ( Zéro) : Ce bit passe à « 1 » lorsque le résultat est nul pour une opération
arithmétique et logique.
DC ( Digit Carry) : retenue sur un quartet ( 4 bits)
C ( Carry) : retenue sur un octet ( 8 bits).
Au reset , seul le bit RP0 de sélection de page est fixé ( RP0 =0 , page 0)
 Adresse 04 et 84 , FSR( File Select Register) Registre de sélection de registre : il
contient l’adresse d’un autre registre de la mémoire de données( adressage indirect ). On
dit le FSR est un « pointeur »
 Adresse 05 , PORTA . Ce registre contient l’état des lignes du PORTA ( voir chapitre sur
les ports).
 Adresse 06 , PORTB . Ce registre contient l’état des lignes du PORTB ( voir chapitre sur
les ports).
 Adresse 08,EEDATA ,(EEpromDATA register): C’est dans ce registre que va transiter la
donnée à écrire vers ou la donnée lue en provenance de l’EEPROM.
 Adresse 09 , EEADR ,(EEprom ADress Register) : Contient l’adresse de la donnée lue
ou écrite dans l’ EEPROM de données .
 Adresse 0A et 8A , PCLATH voir l’adresse 02 PCL.

 Adresse 0B et 8B, INTCON. Contrôle des 4 interruptions

GIE EEIE TOIE INTE RBIE TOIF INTF RBIF

GIE : ( Global Interrupt Enable) : mis à 1 autorise toutes les interruptions non masquées
par leur bit individuel
EEIE : ( EEprom Interrupt Enable) : autorise les interruptions de fin d’écriture dans
l’EEPROM
TOIE : ( Timer 0 Interrupt Enable) : autorise l’interruption provoquée par le
débordement du Timer 0
INTE : ( Interrupt Enable) : autorise l’interruption provoquée par un changement d’état
sur la broche RB0/ INT.
RBIE : ( RB Interrupt Enable) : autorise les interruptions provoquée par un changement
d’états sur l’une des broches RB4 à RB7.
Si ces bits sont mis à 1 , ils autorisent les interruptions pour les lesquels ils sont dédiés
10
Drapeaux :
TOIF : (Timer0 Interrupt Flag ) est mis à 1 en cas de débordement du timer 0
INTF ( Interrupt Flag) est mis 1 si une interruption est générée par la broche RBO/ INT
RBIF ( RB interrupt Flag) : est mis à 1si une interruption est générée par l’une des
broches RB4- RB7
 Adresse 81 , OPTION

RBPU/ INTEDG TOCS TOSE PSA PS2 PS1 PS0

RBPU/ ( RB Pull Up ) Résistances de tirage à VDD des entrées du port B


Si RBPU/ = 0 les résistances de pull-up sont connectées en interne sur l’ensemble
du port B.
INTEDG ( Interrupt Edge ) sélection du front actif de l’interruption sur RB0/INT
( 1 pour front montant et 0 pour front descendant)
TOCS ( TMR0 Clock Source ) sélection du signal alimentant le TMR0
( 0 pour horloge interne 1 pour le signal appliqué sur RA4/ TOCLK
TOSE (TMR0 Source Edge) sélection du front actif du signal le TMR0
( 0 pour front montant, 1 pour front descendant )
PSA ( prescaler assignement ) 0 pour timer0 et 1 pour chien de garde WDT
PS2…0 ( Prescaler 210) sélection de la valeur du diviseur de fréquence pour les
Timers
 Adrese 85 , TRISA . Direction des données pour le port A : 0 pour sortie et 1 pour entrée
( voir chapitre des ports)
 Adresse 86 , TRISB . Direction des données pour le port B : 0 pour sortie et 1 pour entrée
( voir chapitre des ports)
 Adresse 88 , EECON1 (EEprom CONtrol register1) : Contrôle le comportement de l’
EEPROM de données

EEIF WRERR WREN WR RD

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


WRERR ( Write Error) : passe à 1 si erreur d’écriture .
WREN ( Write Enable) : 0 pour interdire l’écriture dans l’ EEPROM de données
WR ( Write) :1 pour écrire une donnée . Bit remis automatiquement à 0
RD ( Read) : 1 pour lire une donnée .Bit remis automatiquement à 0

 Adresse 89 , EECON2 . Registre de sécurité d’écriture dans l’ EEPROM de données .


Une donnée ne peut être écrite qu’après avoir écrit successivement 0X55 et 0XAA dans
ce registre .

3-4) Les ports d’entrées / sorties


11
Le PIC16F84A est équipé de 13 lignes d’entrées/sorties réparties en deux ports :
 Le port A : RA0 à RA4
 Le port B : RB0 à RB7
Chaque ligne peut être configurée soit en entrée, soit en sortie, et ceci indépendamment l’une de
l’autre. Les registres TRISA et TRISB permettent de les configurer. Le bit de poids faible(b0) du
registre TRISA correspond à la ligne RA0 , le bit b1 de TRISA correspond à RA1 et ainsi de
suite. Il en est de même pour le PORT B et le registre TRISB ( bit bo de TRISB correspond à
RB0 b1 à RB1 ainsi de suite). Si l’on veut placer une ligne en sortie ,il suffit de mettre le bit
correspondant dans TRISA ou TRISB à 0 ( retenez 0 comme Output =sortie) . Si l’on veut placer
une ligne en entrée ,il suffit de mettre le bit correspondant dans TRISA ou TRISB à 1 ( retenez 1
comme Input= entrée ).
Les bits des deux ports PORTA et PORTB permettent soit de lire l’état d’une ligne si celle-ci est
en entrée , soit de définir le niveau logique d’une ligne si celle-ci est en sortie. Lors d’un RESET
toutes les lignes sont configurées en entrées .
 Particularité du PORTA : les bits b7 à b5 des registre TRISA et PORTA ne
correspondent à rien car il n’y a que 5 lignes ( RA0 à RA4) . RA4 est une ligne à
drain ouvert , cela veut dire que configurée en sortie cette broche assure 0Volt à l’etat
bas ,mais qu’a l’état haut , il est nécessaire de fixer la valeur de la tension grâce à une
résistance de tirage ( pull up en anglais).
 Particularité du PORTB : il est possible de connecter de façon interne sur chaque ligne
une résistance de tirage ( pull up) dont le rôle consiste à fixer la tension de la patte (
configurée en entrée) à un niveau haut lorsque qu’aucun signal n’est appliqué sur la
patte en question . Pour connecter ces résistances , il suffit de placer le bit RBPU/ du
registre OPTION à 0.
Courant sur les pattes : les pattes peuvent drainer les courants suivants :
- Courant maximal absorbé : 25mA par patte
- Courant maximal fourni : 20mA par patte

3-5) Le Timer
Dans la majeure partie des applications , il est nécessaire de contrôler le temps , afin de ne pas
occuper le microcontrôleur qu’à cette tache. On le décharge en utilisant un timer. Le PIC16F84A
dispose de deux timers, un à usage général (TMRO) et un autre utilisé pour le chien de Garde
(Watch dog ;WDT).
Le TMRO est un compteur ascendant de 8 bits qui peut être chargé sur une valeur initiale
quelconque ( voir figure 5 ci-dessous).

Figure 5
Le TMRO peut remplir deux fonctions :
12
-Temporisateur ou contrôle du temps .Son entrée d’incrémentation est alors l’horloge qui
correspond au cycle instruction (Fosc/4).Il est possible d’utiliser un pre-diviseur de fréquence que
nous verrons plus loin.
-Compteur d’événements, dans ce cas les impulsions d’entrées du timer sont fournies par la patte
RA4/ TOCK1
Le choix s’effectue grâce au bit (TOCS) du registre OPTION.
Le pic 16F84A dispose d’un pré-diviseur de fréquence qui peut être assigné soit au chien de
garde soit au TMRO ( uniquement un à la fois).L’assignation du pre-diviseur se fait grâce au bit
PSA du registre OPTION.
Suivant que le pre-diviseur est assigné au chien de garde ou au TMRO, La valeur de la pre-
division n’est pas la même, il faut donc être vigilant lors de la programmation ( voir figure 6 ).

REGISTRE OPTION

RBPU/ INTEDG TOCS TOSE PSA PS2 PS1 PS0

PS2 PS1 PS0 Diviseur du TMR0 Diviseur du WDT


0 0 0 2 1
0 0 1 4 2
0 1 0 8 4
0 1 1 16 8
1 0 0 32 16
1 0 1 64 32
1 1 0 128 64
1 1 1 256 128

FIGURE 6

3-6) Le Watch dog


a) rôles du Watch dog
Le Watchdog est destiné à vérifier qu’un programme ne s’est pas égaré dans une zone non valide
du programme, ou s’il n’est pas bloqué dans une boucle sans fin (bug du programme). Il sert
également à réveiller un PIC placé en mode SLEEP.

b) Utilisation correcte du Watch dog


b-1) La première chose à faire est de paramétrer le registre CONFIG pour la mise en
service du Watch dog afin de profiter de cette protection intégrée.
Si on indique « WDT_ON » dans un programme qui ne gère pas le Watch dog,
celui-ci redémarrera sans arrêt, et donc ne fonctionnera pas, car il ne contiendra
aucune instruction CLRWDT.
b-2) Placer plusieurs instructions CLRWDT dans le programme en s’arrangeant pour
qu’une instruction CLRWDT soit reçue dans les délais requis par le PIC, en tenant
compte du temps minimum de 7ms.
b-3) Ce qu’il ne faut pas faire :
Il ne faut jamais placer l’instruction CLRWDT dans une routine d’interruption

3-7) Interruptions
13
Le PIC 16F84A dispose de 4 sources d'interruptions :
- Interruption sur la broche RB0/INT
- Interruption "RB" : sur changement du niveau logique d'au moins une de ces 4 broches
: RB4, RB5, RB6 ou RB7 (port B)
- Interruption de débordement du registre TMR0 (H'FF' -> H'00')
- Interruption de fin d'écriture de l'EEPROM

a) Le mécanisme des interruptions :


Quand une interruption survient, le programme principal est interrompu :
Le µC finit l'exécution de l'instruction en cours puis il se branche vers le sous-programme
d'interruption (la routine d'interruption).
Quand la routine d'interruption est achevée (instruction retfie), le µC retourne au programme
principal, à l'endroit exact où il l'avait quitté.

b) Cas d'une seule source d'interruption :


Soit l’application où l'on désire utiliser l'interruption sur la broche RB0/INT. Il peut s'agir d'un
bouton poussoir connecté sur la broche RB0/INT :

 RBPU/ = 0 : activation des résistances de pull-up du port B (bit 7 du registre OPTION_REG

 INTEDG = 0 : l'interruption de la broche RB0/INT est active sur un front descendant (bit 6 du
registre OPTION_REG)
On veut donc provoquer une interruption quand on appuie sur le bouton poussoir.
Pour cela, il faut commencer par autoriser les interruptions de manière globale :

 GIE = 1 (bit 7 du registre INTCON)

Puis, on autorise uniquement l'interruption qui nous intéresse :


 INTE = 1 (bit 4 du registre INTCON) : autorise l'interruption sur la broche RB0/INT

 RBIE = 0 (bit 3 du registre INTCON) : désactive l'interruption "RB"

 T0IE = 0 (bit 5 du registre INTCON) : désactive l'interruption de débordement du registre TMR0

 EEIE = 0 (bit 6 du registre INTCON) : désactive l'interruption de fin d'écriture de l'EEPROM


14
Enfin, on initialise le drapeau (flag) INTF à 0 (bit 1 du registre INTCON).
Tout cela se fait pendant la phase d'initialisation du programme principal par :
movlw B'10010000'
movwf INTCON
Maintenant, quand on appuie sur le bouton poussoir, le drapeau INTF est automatiquement
mis à 1.
Le µC prend en compte cette interruption quand il a connaissance du niveau haut de drapeau
INTF .
Le mécanisme des interruptions est lancé.
 Il faut remettre le drapeau INTF à 0 avant de quitter la routine d'interruption (bcf
INTCON, 1).
Sinon, le µC se rebranche indéfiniment sur la routine d'interruption (puisque INTF = 1) : le
programme est planté !

 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 0x04 ; vecteur d'interruption (directive du compilateur MPLAB)
movwf SAVE_W
swapf STATUS, W
movwf SAVE_STAT
La routine d'interruption finit par la restauration du registre STATUS puis du registre W :
swapf SAVE_STAT, W
movwf STATUS
movf SAVE_W, W
retfie ; retour d'interruption

 Organigramme du processus d’interruption


15
Remarques
Une interruption ne peut pas interrompre une routine d'interruption. Si une autre interruption survient
pendant l'exécution de la routine d'interruption, elle est pour l'instant ignorée.
Elle sera prise en compte à la fin de la routine d'interruption, c'est à dire au moment où le µC
retourne au programme principal.En fait, cela se comprend facilement quand on sait que le bit
GIE est automatiquement :
- mis à 0 au début de la routine d'interruption (désactivation de toutes les interruptions)
- mis à 1 à la fin de la routine d'interruption (activation de toutes les interruptions)
La routine d'interruption commence à l'adresse H'0004' de la mémoire de programme (autrement dit,
le vecteur d'interruption est situé à l'adresse 0x04).
4-ETUDE DU JEU D’INSTRUCTIONS EN ASSEMBLEUR

16
Le PIC 16F84A fait partie de la famille des circuits RISC ( Reduced Instruction Set Computer
ou Composant à jeu d’instructions réduits ) . Il dispose seulement 35 instructions ( voir
tableau), soit une centaine de moins que le microcontrôleur 68HC11 de MOTOROLA par
exemple.Toutes les instructions sont codées en un seul mot de 14 bits (0 à 13).
Bits
Mnémonique Opérande Explication Cycles
affectés
Instructions qui manipulent des registres
ADDWF f,d Additionne W et f 1 C,DC,Z
ANDWF f,d AND de W et f 1 Z
CLRF f Mise à 0 de f 1 Z
CLRW Mise à 0 de W 1 Z
COMF f,d Complement f 1 Z
DECF f,d Decrement f 1 Z
INCF f ,d Increment f 1 Z
IORWF f ,d Inclusive OR W with f 1 Z
MOVF f,d Deplacement de f 1 Z
MOVWF f Deplacement de W dans f 1
RLF f,d Rotation à gauche avec retenue 1 C
RRF f,d Rotation à droite avec retenue 1 C
SUBWF f,d Soustrait W de f 1 C,DC,Z
SWAPF f ,d Inversion des 4 bits haut et bas 1
XORWF f,d OU exclusif logique entre W et f 1 Z
Instructions qui manipulent des bits
BCF f,b Mise à 0 du bit b de f 1
BSF f,b Mise à 1 du bit b de f 1
Instructions qui manipulent les opérandes immédiats
ADDLW K Additionne littéral à W 1 C,DC,Z
ANDLW K AND entre Littéral et W 1 Z
IORLW K OR entre littéral et W 1 Z
MOVLW K Déplacement de littéral dans W 1 Z
SUBLW K Soustrait W de literal (K-W) 1 C,DC, Z
XORLW K OU exclusif entre literal et W
Instructions de saut
BTFSC f,b Bit Test f , Skip if Clear 1(2)
BTFSS f,b Bit Test f , Skip if Set 1(2)
DECFSZ f,d Decrement f , Skip if 0 1(2)
INCFSZ f,d Increment f, Skip if 0 1(2)
Instruments de commande et spéciales
CALL K Appel de sous programme 2
CLRWDT Mise à 0 du WDT 1 TO/ PD/
GOTO K Branchement sur une adresse 2
NOP Aucune opération 1
RETFIE Return d’une interruption 2
RETLW K Retour et charge de W avec literal 2
RETURN Retour de sous-programme 2
SLEEP Mise en mode Stanb-by ou sommeil 1 TO/ PD/
Avec f : Registre(File Register)
17
d: Destination de l’opération
K: Valeur immédiate (Littéral value)
b: Position du bit dans l’octet

NB Déclaration des valeurs littérales en assembleur


Binaire b’01011’
Figure 7
Décimal 23 ou .23 ou d’23’
Hexadécimal 0xF2 ou h’F2’

4-1 Les modes d’adressages

4-1-1 L’adressage immédiat ou littéral


Le registre est chargé immédiatement avec une valeur donnée.
Exemple : MOVLW 0x55 ; charger la valeur 0x55 dans W.

4-1-2 L’adressage direct


On charge un registre avec le contenu d’un registre.
Exemple : MOVF f , W ; charger le contenu de f dans W.

4-1-3 L’adressage indirect


Il fait appel à 2 registres INDF (INDirect File) et FSR (File Selector Register).

a) Le registre INDF
Le registre INDF n’est pas un registre physique. L’adresser revient à adresser le registre dont
l’adresse est contenue dans le registre FSR. Il est de ce fait un pointeur. Il est situé à l’adresse
0x00.
Ce registre n’existe pas vraiment. Ce n’est qu’un procédé d’accès particulier à FSR utilisé par le
PIC pour des raisons de facilité de construction électronique interne.

b) Le registre FSR

Il est situé à l’adresse 0x04 dans les 2 banques. Il n’est donc pas nécessaire de changer de banque
pour y accéder, quelle que soit la banque en cours d’utilisation.
L’adressage indirect est un peu particulier sur les PICs, puisque c’est toujours à la même adresse
que se trouvera l’adresse de destination. Comment cela se passe t-il ?
- Premièrement, on doit écrire l’adresse pointée dans le registre FSR.
- Ensuite on accède à cette adresse pointée par le registre INDF.
On peut dire que INDF est en fait le registre FSR utilisé pour accéder à une case mémoire.
Donc quand on veut modifier une case mémoire pointée, on modifie FSR, quand on veut
connaître l’adresse d’une case pointée, on accède également à FSR. Si on veut accéder au
contenu d’une case pontée, on y accède via INDF.

4-2 Etude détaillée des instructions

18
4-2.1 L’instruction « GOTO » (aller à)

Cette instruction effectue ce qu’on appelle un saut inconditionnel, encore appelé rupture de
séquence synchrone inconditionnel.

Exemple

Start
goto plusloin ; saute à l’instruction qui suit l’étiquette plus loin
xxxxxxx
xxxxxxxx
plusloin
xxxxxxxx ; instruction exécutée après le saut : le programme se poursuit ici

Remarquez que vous pouvez sauter en avant ou en arrière.

4-2.2 L’instruction « INCF » (INCrement File)

Cette instruction provoque l’incrémentation de l’emplacement spécifié (encore appelé File).

Syntaxe

incf f,d

comme pour toutes les instructions que nous verrons , f représente file, c'est-à-dire
l’emplacement mémoire(Registre) concerné pour cette opération.
et d représente la destination si d est égale à :
- f( la lettre f) ou 1 : dans ce cas le résultat est stocké dans l’emplacement mémoire.
- W(la lettre W) ou 0 : dans ce cas , le résultat est laissé dans le registre de travail, et le
contenu de l’emplacement mémoire n’est pas modifié.

La formule est donc (f) + 1-> (d)

Bit du registre STATUS affecté


Le seul bit affecté par cette opération est le bit Z
Z vaudra 1 si (f) avant l’exécution valait 0XFF

Exemples

incf mavariable , f ; le contenu de ma variable est augmenté de 1


; le résultat est stocké dans mavariable.
incf mavariable , w ; Le contenu de mavariable est chargé dans w et augmenté de 1. W
;contient donc le contenu de mavariable + 1. mavariable n’est pas
; modifié

4-2.3 L’instruction « DECF » (DECRement File)


19
Décrémente l’emplacement spécifié. Le fonctionnement est strictement identique à l’instruction
précédente.

Syntaxe

Decf f , d ; (f) – 1 -> (d)

Bit du registre STATUS affecté


Le seul bit affecté par cette opération est le bit Z
Si avant l’instruction ,(f) vaut 1 , Z vaudra 1 après l’exécution( 1-1=0)

Exemples

decf mavariable , f ; décrémente mavariable, résultat dans mavariable


decf mavariable , w ; prends (mavariable) – 1 et place le résultat dans w

4-2.4 L’instruction « MOVLW » (MOVe Literal to W)

Cette instruction charge la valeur spécifiée (valeur littérale, ou encore valeur immédiate), dans le
registre de travail W. On parle d’adressage immédiat ou littéral.

Syntaxe

movlw k ; k représente une valeur de 0x00 à 0xFF.

Bit du registre STATUS affecté


Aucun ( même si vous chargez la valeur ‘0’ )

Exemple

movlw 0x25 ; charge 0x25 dans le registre w

4-2.5 L’instruction « MOVF » (MOVe File)

Charge le contenu de l’emplacement spécifié dans la destination

Syntaxe

movf f,d ; (f) -> (d)

Bit du registre STATUS affecté


Une fois de plus , seul le bit Z est affecté ( si f vaut 0 , Z vaut 1)

Exemple 1
20
movf mavariable,w ; charge le contenu de mavariable dans w.

Nous parlerons ici d’ADRESSAGE DIRECT

Exemple 2

movf mavariable , f

Que fait cette instruction ? si vous avez tout suivi , elle place le contenu de mavariable dans
mavariable . Dire que cela ne sert à rien est tentant mais prématuré.
En effet , si le contenu de mavariable reste bien inchangé , par contre le bit Z est positionné .
Cette instruction permet donc de vérifier si (mavariable)=0.

4-2.6 L’instruction « Movwf » (MOVe W to File)

Permet de sauvegarder le contenu du registre de travail W dans un emplacement mémoire.

Syntaxe

movwf f ; (W) -> (f)

Bit du registre STATUS affecté


Aucun

Exemple
movlw 0x50
movwf mavariable

4-2.7 L’instruction « ADDLW » (ADD Literal and W)

Cette opération permet d’ajouter une valeur littérale (adressage immédiat) au contenu du
registre de travail W.

Syntaxe

addlw k ; (W) + k -> (W)

Bits du registre STATUS affectés


Z : si le résultat de l’opération vaut 0 , Z vaudra 1
C : si le résultat de l’opération entraine un débordement ,C vaudra 1
DC : si le résultat de l’opération entraîne un report du bit 3 vers le bit 4 DC vaudra 1

Exemple
21
movlw .253 ; charger 253 en décimal dans W
addlw .4 ; Ajouter 4.W contient 1, Z vaut 0, C vaut 1(débordement)
addlw .255 ; ajouter 255 W vaut 0, C vaut 1, Z vaut 1

4-2.8 L’instruction « ADDWF » (ADD W and F)


Ne pas confondre avec l’instruction précédente. Une nouvelle fois, il s’agit ici d’un
ADRESSAGE DIRECT. Le CONTENU du registre W est ajouté au CONTENU du registre F

Syntaxe

addwf f,d ; (w) + (f) -> (d)

Bits du registre STATUS affectés


C , DC et Z

Exemple
movlw .12 ; charger 12 dans W
movwf mavariable ; mavariable vaut maintenant 12
movlw .25 ; charger 25 dans W
addwf mavariable,f ; résultat : (W) + (mavariable), donc 25+12, résultat = 37 sauvé
; dans mavariable (,f).

4-2.9 L’instruction « SUBLW » (SUBtract W from Literal)

Attention, ici il y a un piège. L’instruction aurait du s’appeler SUBWL. En effet, on soustrait W


de la valeur littérale, et pas l’inverse.

Syntaxe

sublw k ; k – (W) -> (W)

Bits du registre STATUS affectés


C , DC et Z

Notez ici que le bit C fonctionne de manière inverse que pour l’addition . Ceci est commun à la
plupart des microcontrôleurs du marché.
Si le résultat est positif , donc pas de débordement C=1 . S’il y a débordement , C devient 0

Exemple 1
movlw 0x01 ; charger 0x01 dans W
sublw 0x02 ; soustraire W de 2
; résultat : 2 – (W) = 2-1 = 1
; Z = 0, C = 1, donc résultat positif

22
Exemple 2
movlw 0x02 ; charger 0x02 dans W
sublw 0x02 ; soustraire 2 – (w) = 2 –2 = 0
; Z = 1 , C = 1 : résultat nul

Exemple 3
movlw 0x03 ; charger 0x03 dans W
sublw 0x02 ; soustraire 2 – (W) = 2 – 3 = -1
; Z = 0, C = 0, résultat négatif

4-2.10 L’instruction « SUBWF » (SUBtract W from F)

Nous restons dans les soustractions, mais cette fois, au lieu d’un adressage immédiat, nous avons
un ADRESSAGE DIRECT.

Syntaxe

subwf f,d ; (f) – (W) -> (d)

Bits du registre STATUS affectés


C , DC et Z

Exemple
movlw 0x20 ; charger 0x20 dans w
movwf mavariable ; mettre w dans (mavariable) (0x20)
movlw 0x1F ; charger 0x1F dans w
subwf mavariable,w ; (mavariable) - (w) -> (w)
; 0x20 – 0x1F = 0x01
; résultat dans w, C=1, Z=0
movwf autrevariable ; sauver 0x01 dans une autre variable

4-2.11 L’instruction « ANDLW » (AND Literal with W)

Cette instruction effectue une opération « AND » bit à bit entre le contenu de W et la valeur
littérale qui suit.
Syntaxe

andlw k ; avec k = octet : (w) & k -> (w)

Bit du registre STATUS affecté


Z

Exemple
movlw B’11001101’ ; charger w
andlw B’11110000’ ; effectuer un ‘and’ (&)

23
b7 b6 b5 b4 b3 b2 b1 b0
1 1 0 0 1 1 0 1
and 1 1 1 1 0 0 0 0
= 1 1 0 0 0 0 0 0

Rappelez-vous qu’on effectue un AND entre chaque bit de même rang . Seuls restent donc
positionnés à 1 les bits dont les opérandes valent 1. Donc , le fait d’effectuer un AND avec
La valeur B’ 11110000’ MASQUE les bits 0 à 3 , et ne laisse subsister que les bits 4 à7 .

4-2.12 L’instruction « ANDWF » (AND W with F)

Maintenant, vous devriez avoir bien compris. De nouveau la même opération, mais en
ADRESSAGE DIRECT.
Syntaxe

andwf f,d ; (f) AND (w) -> (d)

Bit du registre STATUS affecté


Z

Exemple
movlw 0xC8 ; charger 0XC8 dans w
movwf mavariable ; sauver dans mavariable
movlw 0xF0 ; charger le masque
andwf mavariable,f ; (mavariable) = 0xC0 (on a éliminé le quartet faible).

4-2.13 L’instruction « IORLW » (Inclusive OR Literal with W)

Et oui, les mêmes instructions, mais pour le OU inclusif. Inclusif signifie simplement le contraire
d’exclusif, c’est à dire que le bit de résultat vaudra 1 si un des bits ou les deux bits opérandes =1.

Syntaxe

iorlw k ; (w) OR k -> (w)

Bit du registre STATUS affecté


Z
Exemple
movlw 0xC3 ; charger 0xC3 dans W
iorlw 0x0F ; FORCER les bits 0 à 3
; résultat ; (w) = 0XCF

b7 b6 b5 b4 b3 b2 b1 b0
24
1 1 0 0 0 0 1 1
OR 0 0 0 0 1 1 1 1
= 1 1 0 0 1 1 1 1

Donc avec un OU Inclusif ( OR) , on peut FORCER n’importe quel bit à 1( pour rappel , avec
AND , on peut forcer n’importe quel bit à 0 ).

4-2.14 L’instruction « IORWF » (Inclusive OR W with File)


Effectue un OR entre (w) et l’emplacement spécifié. C’est donc une instruction en
ADRESSAGE DIRECT. Je ne donnerais pas d’exemple, vous devriez avoir compris.

Syntaxe

Iorwf f,d ; (w) OR (f) -> (d)

Bit du registre STATUS affecté


Z

4-2.15 L’ instruction « XORLW » (eXclusive OR Literal with W)

Par opposition au OU INCLUSIF, voici maintenant le OU EXCLUSIF. Sa table de vérité est la


même que le ou inclusif, excepté que lorsque les 2 bits sont à 1, le résultat est 0.
Cette instruction va donc servir à INVERSER n’importe quel bit d’un octet. En effet, si vous
effectuez « 1 xor 0 », vous obtenez 1, si vous effectuez « 0 xor 0 », vous obtenez 0. Donc, si vous
appliquez xor 0, la valeur de départ est inchangée.
Si par contre vous appliquez « 0 xor 1 » , vous
obtenez 1, et avec « 1 xor 1 », vous obtenez 0. En appliquant xor 1, vous inversez le bit, quelque
soit son état initial.
Maintenant, vous pouvez donc FORCER un bit à 1 avec OR, MASQUER un bit (le mettre à 0)
avec AND, et l’INVERSER avec XOR.

Syntaxe
xorlw k ; (w) xor k -> (w)

Bit du registre STATUS affecté


Z

Exemple
movlw B’11000101’ ; charger W
xorlw B’00001111’ ; xor avec la valeur de W
; résultat : B ‘11001010’
; les 4 bits de poids faibles ont été inversés

b7 b6 b5 b4 b3 b2 b1 b0
25
1 1 0 0 0 1 0 1
XOR 0 0 0 0 1 1 1 1
= 1 1 0 0 1 0 1 0

Remarquez que tous les bits de l’octet initial ont été inversés par chaque bit de la seconde
opérande qui étaient à 1.

4-2-16 L’instruction « XORWF » (eXclusive OR W with F)

C’est exactement la même opération que XORLW, mais en ADRESSAGE DIRECT.

Syntaxe
xorwf f,d ; (w) xor (f) -> (d)

Bit du registre STATUS affecté


Z

4-2-17 L’instruction « BSF » (Bit Set F)


C’est une instruction qui permet tout simplement de forcer directement un bit d’un emplacement
mémoire à 1.

Syntaxe

bsf f,b ; le bit n° b est positionné dans la case mémoire (f)


; b est évidemment compris entre 0 et 7

Bit du registre STATUS affecté


Aucun

Exemples
Bsf STATUS , C ; positionne le bit C à 1 dans le registre STATUS
bsf mavariable , 2 ; positionne bit 2 de (mavariable) à 1

4-2-18 L’instruction « BCF » (Bit Clear F)

C’est une instruction qui permet tout simplement de forcer directement un bit d’un emplacement
mémoire à 0

Syntaxe
bcf f,b ; le bit n° b est mis à 0 dans la case mémoire (f)
; b est évidemment compris entre 0 et 7

Bit du registre STATUS affecté


Aucun

Exemples
26
bcf STATUS , C ; positionne le bit C à 0 dans le registre STATUS
bcf mavariable , 2 ; positionne b2 de (mavariable) à 0

4-2-19 L’instruction « RLF » ( Rotate Left through Carry)

Rotation vers la gauche en utilisant le carry.


L’opération de rotation effectue l’opération suivante : Le bit de carry C est mémorisé ensuite
chaque bit de l’octet est déplacé vers la gauche . L’ancien bit 7 sort de l’octet par la gauche et
devient le nouveau carry . Le nouveau bit 0 devient l’ancien carry .il s’agit donc d’une rotation
sur 9 bits.
Syntaxe
rlf f,d ; (f) rotation gauche avec carry-> (d)

Bit du registre STATUS affecté


C
Exemple1
Un petit exemple vaut mieux qu’un long discours.
bsf STATUS,C ; positionne le carry à 1
movlw b’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rlf mavariable,f ; rotation vers la gauche

C b7 b6 b5 b4 b3 b2 b1 b0
f 1 0 0 0 1 0 1 1 1
rlf 0 0 0 1 0 1 1 1 1

Vous voyez que tous les bits ont été décalés vers la gauche ‘ C’ a été réintroduit dans bo . le
résultat reste sur 9 bits.

Exemple 2
bcf STATUS,C ; positionne le carry à 0
movlw b’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rlf mavariable,f ; rotation vers la gauche

Si vous avez compris , le résultat sera B’00101110’ , avec le carry à 0 .


Si le carry est à 0 au départ et on effectue un simple décalage vers la gauche. Que se passe t-il ?
Prenons B’00010111’ , soit 23 en décimal . Décalons –le , nous obtenons B’00101110’ , soit 46
en décimal . Nous avons donc effectué une multiplication par 2 .Retenez ceci , cela vous sera
utile par la suite .

4-2-20 L’instruction « RRF » ( Rotate Right through Carry)


Rotation vers la droite en utilisant le carry
L’opération de rotation effectue l’opération suivante : Le bit de carry C est mémorisé ensuite
chaque bit de l’octet est déplacé vers la droite . L’ancien bit 0 sort de l’octet par la droite et
devient le nouveau carry . L’ancien carry devient le nouveau bit 7 .il s’agit donc également d’une
rotation sur 9 bits.
Syntaxe
27
rrf f,d ; (f) rotation droite avec carry-> (d)

Bit du registre STATUS affecté


C
Exemple1
bsf STATUS,C ; positionne le carry à 1
movlw b ’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rrf mavariable,f ; rotation vers la droite

b7 b6 b5 b4 b3 b2 b1 b0 C
f 0 0 0 1 0 1 1 1 1
rrf 1 0 0 0 1 0 1 1 1

Vous voyez que tous les bits ont été décalés vers la droite ‘ C’ a été réintroduit dans b7 . le
résultat reste sur 9 bits.

Exemple 2
bcf STATUS,C ; positionne le carry à 0
movlw b’00010111’ ; charge la valeur dans w
movwf mavariable ; initialise mavariable
rrf mavariable,f ; rotation vers la droite

Si vous avez compris , le résultat sera B’00001011’ , avec le carry à 1

Si le carry est à 0 au départ et on effectue un simple décalage vers la droite. Que se passe t-il ?
Prenons B’0000100’ , soit 4 en décimal . Décalons –le , nous obtenons B’00000010’ , soit 2 en
décimal . Nous avons donc effectué une division par 2.

4-2.21 L’instruction « BTFSC » (Bit Test F, Skip if Clear)

Traduit littéralement, cela donne : Teste le bit de l’emplacement mémoire et saute s’il vaut 0. Il
s’agit ici de votre premier saut conditionnel ou rupture séquence synchrone conditionnelle .
Il faut retenir pour tous ces types de saut , on ne saute que l’instruction suivante . En effet , la
syntaxe ne contient pas d’adresse de saut , comme nous allons le voir.

Syntaxe

btfsc f, b ; on teste le bit b de la mémoire (f).


; si ce bit vaut 0, on saute l’instruction suivante, sinon
; on exécute l’instruction suivante.
xxxx
xxxx

Bit du registre STATUS affecté


Aucun
Exemple1
28
btfsc STATUS,C ; tester si le bit C du registre STATUS vaut 0
bsf mavariable,2 ; non (C=1), alors bit 2 de mavariable mis à 1
xxxx ; la suite du programme est ici dans les 2 cas

Exemple 2

movlw 0x12 ; charger 12 dans le registre de travail


subwf mavariable,f ; on soustrait 0x12 de mavariable
btfsc STATUS,C ; on teste si le résultat est négatif (C=0)
goto positif ; non, alors au saute au traitement des positifs
xxxx ; on poursuit ici si le résultat est négatif

4-2.22 L’instruction « BTFSS » (Bit Test F, Skip if Set)

Traduit littéralement, cela donne : Teste le bit de l’emplacement mémoire et saute s’il vaut 1.
Toutes les remarques de l’instruction « BTFSC » restent valables.
Syntaxe

Btfss f, b ; on teste le bit b de la mémoire (f)


; si ce bit vaut 1, on saute l’instruction suivante, sinon
; on exécute l’instruction suivante.
xxxx
xxxx

Bit du registre STATUS affecté


Aucun

Exemple

btfss STATUS,C ; tester si le bit C du registre STATUS vaut 1


bsf mavariable,2 ; non (C=0), alors bit 2 de mavariable mis à 1
xxxx ; la suite du programme est ici dans les 2 cas
4-2.23 L’instruction « DECFSZ » (DECrement F, Skip if Z)

Nous poursuivons les sauts conditionnels avec une instruction très utilisée pour créer des boucles.
Cette instruction décrémente un emplacement mémoire et saute l’instruction suivante si le
résultat de la décrémentation donne une valeur nulle.

Syntaxe

decfsz f, d ; (f) –1 -> (d). Saut si (d) = 0

Bit du registre STATUS affecté


Aucun

Exemple1
29
movlw 3 ; charger 3 dans w
movwf compteur ; initialiser compteur
movlw 0x05 ;charger 5 dans w
boucle ; étiquette
addwf mavariable , f ; ajouter 5 à ma variable
decfsz compteur , f ; décrémenter compteur et tester sa valeur
goto boucle ; si compteur pas 0, on boucle
movf mavariable , w ; on saute ici si compteur est 0

4-2.24 L’instruction « INCFSZ » (INCrement F, Skip if Zero)

Je ne vais pas détailler cette instruction, car elle est strictement identique à la précédente, hormis
le fait qu’on incrémente la variable au lieu de la décrémenter.

Syntaxe

incfsz f,d ; (f) + 1 -> (d) :

Bit du registre STATUS affecté


Aucun

4-2.25 L’instruction « SWAPF » (SWAP nibbles in F)

Nous pouvons traduire cette instruction par : «inverser les quartets dans F ». Cette opération
inverse simplement le quartet (demi-octet) de poids faible avec celui de poids fort.

Syntaxe

swapf f,d ; inversion des b0/b3 de (f) avec b4/b7 -> (d)

Bit du registre STATUS affecté


Aucun

Exemple
movlw 0xC5 ; charger 0xC5 dans w
movwf mavariable ; placer dans mavariable
swapf mavariable , f ; (mavariable) = 0x5C

4-2.26 L’instruction « CALL » (CALL subroutine)

Cette opération effectue un saut inconditionnel vers un sous-programme. Voyons ce qu’ est un
sous programme . Et bien il s’agit tout simplement d’une partie de programme qui peut être
appelée depuis plusieurs endroits du programme dit « principal ».
Le point de départ est mémorisé automatiquement de sorte que qu’après l’exécution du sous-
programme , le programme continue depuis l’endroit ou il était arrivé. Voyez les exemples dans
la description de l’instruction « RETURN . »
30
Syntaxe

call étiquette ; appel de la sous-routine à l’adresse étiquette.

Bit du registre STATUS affecté


Aucun

MECANISME
Lors de l’exécution de l’instruction, l’adresse de l’instruction suivante est sauvegardée sur le
sommet d’une pile ( exactement comme une pile d’assiettes ) . Lorsque la sous-routine est
terminée , l’adresse sauvegardée est retirée de la pile et placée dans le PC . Le programme
poursuit alors depuis l’endroit d’où il était parti .
Notez que si le sous-programme ( ou sous –routine) appelle lui-même un autre sous –
programme, l’adresse sera également sauvée au dessus de la pile . Attention , cette pile a une
taille limitée à 8 emplacements .Il existe aucun moyen de tester la pile , vous devez donc gérer
vos sous-programmes pour ne pas dépasser 8 emplacements , sinon votre programme se plantera.
Notez que lorsque vous sortez d’un sous –programme , l’emplacement est évidemment libéré .
La limite n’est donc pas dans le nombre de fois que vous appelez votre sous programme , mais
dans le nombre d’imbrications ( sous –programme qui en appelle un autre qui en appelle un
autre) etc.

4-2.27 L’instruction « RETURN » (RETURN from subroutine)

Retour de sous-routine. Va toujours de pair avec une instruction call. Cette instruction indique la
fin de la portion de programme considérée comme sous-routine (SR). Rappelez-vous que pour
chaque instruction Call rencontrée ,votre programme devra rencontrer une instruction RETURN.

Syntaxe

Return ; fin de sous-routine. Le PC est rechargé depuis la pile, le


; programme poursuit à l’adresse qui suit la ligne call.

Bit du registre STATUS affecté


Aucun

Exemple

movlw 0x CA ; valeur du compteur


movwf compteur ; initialiser compteur de boucles
boucle
decfsz compteur ,f ; décrémente compteur , saute si 0
goto boucle ; boucler si pas 0
xxx ; instruction quelconque
xxx ; instruction quelconque
xxx ; instruction quelconque
31
call tempo ; appel du sous -programme
xxx ; instruction quelconque

xxx ; instruction quelconque


xxx ; instruction quelconque
call tempo ; appel du sous -programme
xxx ; instruction quelconque

tempo ; étiquette de début de la sous-routine


movlw 0x25 ; charger w avec 0x25
movwf compteur ; initialiser compteur boucles
boucle 1
decfsz compteur,f ; décrémenter compteur , sauter si 0
goto boucle 1 ; boucler si pas 0
return ; fin de la sous-routine
xxx ; instruction quelconque

4-2.28 L’instruction « RETLW » (RETurn with Literal in W)

Retour de sous-routine avec valeur littérale dans W. C’est une instruction très simple : elle
équivaut à l’instruction return, mais permet de sortir d’une sous-routine avec une valeur spécifiée
dans W.

Syntaxe

retlw k ; (w) = k puis return

Bit du registre STATUS affecté


Aucun

Exemple
test ; étiquette de début de notre sous-programme
btfss mavariable,0 ; teste le bit 0 de mavariable
retlw 0 ; si vaut 0, fin de sous-programme avec (w)=0
retlw 1 ; sinon, on sort avec (w) = 1

4-2.29 L’instruction « RETFIE » (RETurn From IntErrupt)

Cette instruction indique un retour d’interruption


Cette instruction agit d’une manière identique à RETURN, excepté que les interruptions sont
remises automatiquement en service au moment du retour au programme principal.

Syntaxe

retfie ; retour d’interruption


32
Bit du registre STATUS affecté
Aucun

4.30 L’instruction « CLRF » (CLeaR F)

Cette instruction efface l’emplacement mémoire spécifié.

Syntaxe

clrf f ; (f) = 0

Bit du registre STATUS affecté


Z : Vaut donc toujours 1 après cette opération .

Exemple

Clrf mavariable ; (mavariable) = 0

4-2.31 L’instruction « CLRW » (CLeaR W)

Cette instruction efface w

Syntaxe

clrw ; (w) = 0

Bit du registre STATUS affecté


Z : Vaut donc toujours 1 après cette opération .

4-2.32 L’instruction « CLRWDT » (CLeaR WatchDog)


Remet à 0 le chien de garde de votre programme
C’est un mécanisme très pratique qui permet de provoquer un reset automatique de votre PIC en
cas de plantage du programme ( parasite par exemple).
Le mécanisme est très simple à comprendre, il s’agit pour votre programme d’envoyer cette
instruction à intervalles réguliers. Si la commande n’est pas reçue dans le délai imparti , le PIC
redémarre au début .

Syntaxe

clrwdt ; remet le timer du watchdog à 0

Bit du registre STATUS affecté


Aucun
4-2.33 L’instruction « COMF » (COMplement F)

33
Effectue le complément à 1 de l’emplacement mémoire spécifié. Donc, inverse tous les bits de
l’octet désigné .

Syntaxe

comf f,d ; Inverse (f) -> (d)

Bit du registre STATUS affecté


Z

Exemple
movlw B’11001010’ ; charge valeur dans W
movwf mavariable ; initialise mavariable
comf mavariable,w ; charge l’inverse de mavariable dans W
; (W) = B’00110101’

4-2.34 L’instruction « SLEEP » (Mise en sommeil)

Place le PIC en mode de sommeil.

Syntaxe

Sleep ; arrêt de la PIC

Bit du registre STATUS affecté


Z

4. 35 L’instruction « NOP » (No Operation)

Comme vous devez être fatigués, et moi aussi, je vous présente l’instruction qui ne fait rien, qui
ne positionne rien, et qui ne modifie rien. On pourrait croire qu’elle ne sert à rien. En fait elle est
surtout utilisée pour perdre du temps.

Syntaxe

nop ; tout simplement

Ceci termine l’analyse des 35 instructions utilisées normalement dans les PICs.

5- Les directives d’assemblage

34
Elles servent à indiquer à l’assembleur de quelle manière il doit travailler. Ce sont donc des
macro commandes destinées à l’assembleur lui-même. Ces directives sont :

5-1 La directive ORG

ORG : définit l’adresse de l’instruction qui va suivre, utilisé pour le Reset et l’Interruption.

Le Reset se situe à l’adresse 0x0000 et se déclare de la façon suivante :


ORG 0x0000 ; Déclaration du Reset
GOTO Start
5-2 La directive EQU
La directive EQU permet de faire des assignations.
Les assignations se comportent comme une simple substitution. Au moment de l’assemblage,
chaque fois que l’assembleur va trouver une assignation, il la remplacera automatiquement par sa
valeur.
Un autre avantage est que si on remplace la valeur d’une assignation, le changement sera effectif
pour tout le programme.
Exemple : mavaleur EQU 0x0E ; mavaleur est affectée à la valeur 0x0E

5-3 La directive CONFIG


Elle contient « les fusibles » qui fixent le fonctionnement du PIC. C’est une directive de
configuration.
La syntaxe utilisée est alors:
Nom Valeurs Signification
possibles
CP OFF Lecture possible
(Code ON Rend impossible la lecture de la mémoire de programme FLASH et de
Protection l’EEPROM ( à travers un programmateur). C’est une protection contre
Bit) le piratage industriel
PWRTE OFF Temporisation désactivée
(Power-up A la mise sous tension du microcontrôleur, lance une temporisation
Timer Enable ON d’environ 72ms durant laquelle est effectuée un RESET interne
Bit)
WDT ON Active le watchdog ( Chien de garde)
( Watchdog
Timer Enable
OFF Désactive le watchog
Bit)
RC Oscillateur de type Resistance /Condensateur
OSC Remarques: économique ,réservé aux applications ou la précision de la
( Oscillator base de temps n’est pas critique
Selection
Bits) HS Oscillateur à Quartz haute fréquence( 10 Mhz à 20Mhz)
XT Oscillateur à Quartz moyenne fréquence( 4 Mhz à 10Mhz)
LP Oscillateur à Quartz faible fréquence < 4Mhz

Exemple : __CONFIG _ CP_OFF & _WDT_ON & _PWRTE_ON &_HS_OSC


On peut aussi configurer en utilisant la notation hexadecimal

35
CP CP CP CP CP CP CP CP CP CP PWRTE WDT Fosc1 Fosc0

Fosc1 Fosc0 WDT CP


0 0 LP oscillateur 0 : non activé (OFF) 0 : activé(ON)
0 1 XT oscillateur 1 : activé (ON) 1 : non activé(OFF)
1 0 HS oscillateur PWRTE
1 1 RC oscillateur 0 : activé( ON)
1 : non activé (OFF)

Exemple __CONFIG _ CP_OFF & _PWRTE_ON& _WDT_OFF &_HS_OSC

Ou
1 1 1 1 1 1 1 1 1 1 0 0 1 0

__CONFIG H’3FF2’

5-4 – La directive CBLOCK


Toute zone de variables définie par l’utilisateur commence avec la directive CBLOCK suivie de
l’adresse du début de la zone, pour placer les variables qui sont des emplacements mémoires
RAM auxquels on a donné un nom.
Dans la cartographie mémoire, on voit que la zone RAM librement utilisable commence à
l’adresse 0x0C.
La zone de variable peut commencer avec la directive CBLOCK 0x04, ensuite on peut utiliser
68 emplacements mémoires qui répondront à la syntaxe suivante :
Nom de la variable suivie du signe « : » suivie de la taille utilisée.
Cette directive doit se terminer avec la directive ENDC
Exemple :
CBLOCK 0x0C ; début de la zone de variable
W_TEMP : 1 ; zone de 1 octet affecté à W_TEMP
montableau : 8 ; zone de 8 octets attribués à montableau
ENDC ; fin de zone.
5-5 La directive END
Cette directive précise l’endroit où doit cesser l’assemblage de tout programme. Elle est
obligatoire dans tout programme, sous peine d’une erreur qui signalera que la fin du fichier (End
Of File : EOF) a été atteinte avant de rencontrer la directive END. Toutes les instructions situées
après la directive END seront tout simplement ignorées.

5-6 La directive DEFINE


Les DEFINE fonctionnent comme des assignations. La différence est que les assignations sont
réservées pour les valeurs, et les définitions (DEFINE) pour remplacer un texte plus complexe.
Par exemple on peut utiliser un port suivi d’un numéro de bit, ou bien une instruction avec ses
paramètres. Une définition est construite de la manière suivante :

#DEFINE suivie par le nom que l’on désire utiliser, puis la chaîne à substituer.

Exemple : #DEFINE monbit PORTA , 1 ; PORTA 1 est affecté à monbit

36
5-7 Les macros
Une macro remplace un morceau de code souvent utilisé. Elle fonctionne comme un simple
traitement de textes. Elle se compose d’un nom écrit en première colonne, suivie par la directive
« MACRO ». Commence alors à la ligne suivante, la portion de code qui constitue la macro. La
fin de la macro est définie par la directive « ENDM » (END of Macro).

Exemple :
LIREIN MACRO
COMF PORTB , 0
ANDLW 1
ENDM
Dans cet exemple, chaque fois que la macro LIREIN sera rencontrée, elle sera remplacée au
moment de l’assemblage par ces deux lignes :

COMF PORTB , 0
ANDLW 1

La macro simplifie donc l’écriture, mais ne raccourci pas la taille du fichier à l’extension .hex
obtenu, puisse que ces deux lignes seront écrites dans le PIC.
On peut également utiliser des macros plus complexes avec des passages de paramètres.

5-8 La directive #include

#include : signifie que le compilateur intégrera au programme le fichier qui suit.


EXEMPLE :#include <p16F84A.inc > ; le fichier à intégrer est p16F84A.inc
Qui est fournit par MPLAB. Celui-ci définit les emplacements
mémoire des registres internes ainsi les valeurs des fusibles de
configuration.C’est notamment grace à ce fichier que l’on pourra
utiliser dans notre programme des noms de registres( exemples :
PORTA,TRISB,STATUS),ces noms figurent dans ce fichier de configuration

5-9 LIST
il donne la liste des directives à l’attention du processeur.

Exemple : LIST p=16F84A ; Le PIC utilisé est un 16F84A

6 -MISE EN ŒUVRE
L’utilisation et la mise en œuvre très simple des PICs les a rendus extrêmement populaire au
point que la société qui les fabrique( MICROCHIP) est en passe de devenir le leader mondial
dans le domaine des microcontrôleurs devant MOTOROLA et INTEL.Il suffit :

- D’écrire le programme en langage Assembleur ou en C sur un ordinateur grâce au logiciel


MPLAB de MICROCHIP par exemple et le transféré dans le PIC grâce au programmateur(
Ex :PICSTARTplus) ou faire le programme sur MPLAB et avoir son fichier HEX .grâce à un
logiciel tel que le WinPIC800 , Ensuite transférer dans le PIC grâce à un programmateur tel que
le JDM ( c’est ce cas que nous utiliserons dans nos applications) etc.

Enfin mettre le pic dans montage ou il faut nécessairement :


37
- L’ Alimenter par ses deux broches VDD(+5v) et VSS( la masse)
- Fixer sa vitesse de fonctionnement à l’aide d’un quartz (voir figure 8 )ou un circuit RC( fig 9)
_____
- Mettre la broche 4 ( MCLR) à VDD mais dans ce cas pour réinitialiser , il faut couper
l’alimenter. ou élaborer un petit système pour permettre de réinitialiser le microcontrôleur sans
avoir à couper l’alimentation .( voir figure 10)

PIC16F84A 16 c1
QUARTZ avec C1=C2=22pF
15 C2
C3 = C4= 22pf

Figure8

C R
+VDD

PIC16F84A 16

Figure 9

38
OSCILLATEUR à circuit RC
Les valeurs recommandées par Microchip pour la résistance et le condensateur externes
sont :5kΩ ≤ Rext ≤ 100kΩ / Cext ≥ 20pF
Fréquence moyenne à 5 V et à 25°C
CEXT REXT
Fréquence Précision
5kΩ 4 ,61 MHz 25 %
20pF 10kΩ 2,66 MHz 24%
100kΩ 311 KHz 39%
5kΩ 1,34 MHz 21%
100pF 10kΩ 756 KHz 18%
100kΩ 82,8 KHz 28%
5kΩ 428 KHz 13%
300pF 10kΩ 243 KHz 13%
100kΩ 26,2 KHz 23%

+VDD

10kΩ PIC16F84A

Figure10

39

Vous aimerez peut-être aussi