Chapitre 5 Microcontroleurs

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

CHAPITRE 5

LES MICROCONTROLEURS

I introduction

C’est un ordinateur monté dans un circuit intégré. Les avancées technologiques en matière d’intégration,
ont permis d’implanter sur une puce de silicium de quelques millimètres carrés la totalité des composants
qui forment la structure de base d’un ordinateur. Leur prix varie de quelques centaines de dinars à
quelques milliers de dinars pour les plus complexes.

Les microcontrôleurs sont de taille tellement réduite qu’ils peuvent être sans difficulté implantés sur
l’application même qu’ils sont censés piloter. Leur prix et leurs performances simplifient énormément la
conception de système électronique et informatique. L’utilisation des microcontrôleurs ne connaît de
limite que l’ingéniosité des concepteurs, on les trouve dans les téléphones portables, dans les
calculatrices, dans les récepteurs satellites, dans les voitures…

Il existe plusieurs types de microcontrôleurs à savoir INTEL , SEIMENS, AMTEL , et les pics de
Microchip.

3.1 Qu’est-ce qu’une PIC ?


II-Les Microcontrôleurs PIC

Un pic est un système minimum d’un microprocesseur à lequel 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 à structure RISC (Reduce instruction Construction set), ou encore
composants à jeu d’instructions réduit, ce qui rend le décodage plus facile et plus rapide, donc le
composant fonctionne plus vite.

II-1 LES DIFFE’RENTES FAMILLES DES PICS :

La famille des pics est subdivisée en 3 grandes familles :

o La famille (Base Line) qui utilise des instructions de taille 12 bits.


o La famille (Mid-range) qui utilise des mots de 14 bits. (et dont fait partie la 16F877),
o La famille (High –END) qui utilise des mots de 16 bits

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

L’horloge fournie au PIC est pré-divisée par 4 au niveau de celle-ci. C’est cette base de temps qui
donne le temps d’un cycle.

Si on utilise par exemple un quartz de 4MHz , on obtient donc 1000000 de cycles/seconde, or,
comme la pic exécute pratiquement 1 instruction par cycle, hormis les sauts, cela nous donne une
puissance de l’ordre de 1MIPS (1 Million d’Instructions Par Seconde).

39
3.2 Les différentes familles
Pour identifier un PIC, on utilise simplement son numéro.

Les 2 premiers chiffres indiquent la catégorie du PIC, 16 indique une 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. Ensuite, on trouve :

- 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.
Puis on trouve les derniers chiffres identifient précisément le PIC. (877)

Enfin on trouve sur les boîtiers « -XX » dans laquelle XX représente la fréquence d’horloge
maximale que le PIC peut recevoir. Par exemple –04 pour une 4MHz.

Donc, PIC 16F877-04 est un PIC Mid-Range (16) donc la mémoire programme est de type
FLASH (F) donc réinscriptible de type 877 et capable d’accepter une fréquence d’horloge de 4MHz.

II-3 LE PIC 16F877


II-3-1 CARACTERISTIQUES DU PIC 16F877 :
 Une mémoire programme de type EEPROM flash de 8K mots de 14 bits,
 Une RAM donnée de 512 octets,
 Une mémoire EEPROM de 256 octets,
 Cinq ports d'entrée sortie, A (6 bits), B (8 bits), C (8 bits), D (8 bits), E (3 bits).
 Convertisseur Analogiques numériques 10 bits à 8 canaux,
 USART, Port série universel, mode asynchrone (RS232) et mode synchrone
 SSP, Port série synchrone supportant I2C
 Trois TIMERS avec leurs Prescalers, TMR0, TMR1, TMR2
 Deux modules de comparaison et Capture CCP1 et CCP2
 Un chien de garde,
 Générateur d'horloge, à quartz (jusqu’ à 20 MHz) ou à Oscillateur RC Protection de code,
 13 sources d'interruption,
 Fonctionnement en mode sleep pour réduction de la consommation,
 Jeux de 35 instructions

II-3-2 Structure externe


Le PIC16F877 est un circuit intégré de 40 broches ( figure ci-dessus) :

40
Structure externe du 16f877

L’alimentation du circuit est assurée par les pattes VDD et VSS. Elles permettent à l’ensemble des
composants électroniques du PIC de fonctionner. Pour cela on relie VSS à la masse ( 0 Volt ) et VDD à
la borne positive de l’alimentation qui doit délivrer une tension continue comprise entre 3 et 6 Volts.
Le microcontrôleur est un système qui exécute des instructions les unes après les autres à une vitesse
(fréquence ) qui est fixée par une horloge interne au circuit. Cette horloge doit être stabilisée de manière
externe au moyen d’un cristal de quartz connecté aux pattes OSC1/CLKIN (patte 13) et OSC2/CLKOUT
(patte 14 ) .
La patte 1 est appelée MCLR. Elle permet lorsque la tension appliquée est égale à 0V de réinitialiser le
microcontrôleur. C’est à dire que si un niveau bas ( 0 Volt ) est appliqué sur MCLR le microcontrôleur
s’arrête, place tout ses registres dans un état connu et se redirige vers le début de la mémoire de
programme pour recommencer le programme au début ( adresse dans la mémoire de programme :0000).

A la mise sous tension, la patte MCLR étant à zéro, le programme démarre donc à l’adresse
0000,(MCLR=Master Clear Reset ).
Le reste des pattes sont les lignes d’entrées/sorties . Elles sont au nombre de 33 et peuvent être
configurées en entrée ou en sortie. Ce sont elles qui permettent au microcontrôleur de dialoguer avec le

41
monde extérieur (périphériques). La majorité de ces broches sont multiplexées pour réaliser plusieurs
fonctions.

II-3.3 Architecture interne


La structure générale du PIC 16F877est montrée par la figure ci-dessous ( structure HARVARD : la
mémoire de programme et la mémoire de données sont séparées contrairement à l'architecture Von
Neuman qui caractérise d'autres microcontrôleurs )

Structure interne du 16f877

elle est composée de trois parties essentielles :


 Le microprocesseur
 La mémoire
 Les périphériques

 Le microprocesseur est formé de trois parties :


-une unité arithmétique et logique ( UAL ) chargée de réaliser les opérations arithmétiques
et logiques de base.
-une unité de commande
-des registres (W : work register, registre d’état,….)
42
La mémoire est formée de :
-Une mémoire de programme : qui contient les instructions pilotant l’application à laquelle le
microcontrôleur est dédié. Il s’agit d’une mémoire non volatile ( elle garde son contenu, même en
l’absence de tension ), elle est de type FLASH c’est à dire qu’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 de programmation. Pour le PIC 16F877 cette mémoire est d’une taille de 8k mots
de14 bits, c’est à dire qu’elle dispose de 8192 emplacements (de 000h à 1FFFh ) contenant chacun 14
cases.

-Une mémoire de donnéesRAM :c’est une mémoire de 512 octets puisque le bus de donnée est
de huit bits. Cette RAM est volatile (les données sont perdues à chaque coupure de courant). On peut y
lire et écrire des données.

-Une mémoire de données EEPROM : c’est une mémoire de 256 octets dans laquelle on peut lire et
écrire des données ( de huit bits soit un octet ) et qui possède l’avantage d’être non volatile ( les
données sont conservées même en l’absence de tension ). La lecture et l’écriture dans cette mémoire
de données sont beaucoup plus lentes que dans la mémoire de données RAM.

- les périphériques contenu dans le PIC16F877 :


-Ports d’entrées et de sorties.
-Timers.
-Chien de garde
-CAN
-CCP1 et CCP2
-USART,SSP

II-4- Les éléments de base du PIC 16F877


II-4-1 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'à 20MHz. Le filtre passe bas
(Rs,C1,C2) limite les harmoniques dus à l’écrêtage et réduit l’amplitude de l’oscillation, il n'est pas
obligatoire.

Avec un oscillateur RC, la fréquence de l'oscillation est fixée par Vdd, Rext et Cext. Elle peut
varier légèrement d'un circuit à l'autre.

43
Dans certains cas, une horloge externe au microcontrôleur peut être utilisée pour synchroniser le
PIC sur un processus particulier.

Quelque soit l'oscillateur utilisé, l'horloge système dite aussi horloge instruction est obtenue en
divisant la fréquence par 4. Dans la suite de ce cours on utilisera le terme Fosc/4 pour désigner l'horloge
système.

Avec un quartz de 4MHz, on obtient une horloge instruction de 1MHz, soit le temps pour
exécuter une instruction de 1µs.

II-4-2 la mémoire de programme :


C'est elle qui contient le programme à exécuter. Ce dernier est téléchargé par liaison série ou par câble
USB. La Figure ci-dessous montre l'organisation de cette mémoire. Elle contient 8k "mots" de 14 bits
dans le cas du PIC 16F877.

Il faut noter que l'adresse 0000h contient le vecteur du reset, l'adresse 0004h l'unique vecteur
d'interruption du PIC. La pile contient 8 valeurs. Comme le compteur de programme, elle n'a pas
d'adresse dans la plage de mémoire. Ce sont des zones réservées pour le système.

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 que 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.

44
Mémoire de programme

II.4-3 la mémoire de données RAM


L’espace mémoire RAM adressable est de 512 positions de 1 octet chacune:
 96 positions sont réservées aux SFR (Special Function Registers) qui sont les registres de
configuration du PIC.
 Les 416 positions restantes constituent les registres GPR (General Propose Registers) ou RAM
utilisateur. Sur le 16F877, 3 blocs de 16 octets chacune ne sont pas implantés physiquement d’où
une capacité de RAM utilisateur de 368 GPR.

45
Organisation de la RAM du16F877

Pour accéder à la RAM, on dispose de deux modes d’adressage:

II.4.3.1 Accès à la RAM par adressage DIRECT


Avec ce mode d’adressage, on précise dans l’instruction la valeur de l’adresse à laquelle on veut
accéder. Par exemple, pour ajouter le contenu de l'accumulateur W à la case mémoire d'adresse 50,
on utilise l'instruction ADDWF 50,0 ou ADDWF 50,1. Cette instruction sera codée sur 14bits, la
partie adresse est codée sur 7 bits. En effet, 7 bits permettent d’adresser seulement 128 positions.
Pour pouvoir adresser les 512 positions accessibles, il faut 9 bits d’adresse. Pour avoir ces 9 bits,
le PIC complète les 7 bits venant de l’instruction par deux bits situés dans le registre de configuration
STATUS. Ces bits sont appelés RP0 et RP1 et doivent être positionnés correctement avant toute
instruction qui accède à la RAM par l’adressage direct.
RP1 RP0 b6 b0

9bits

46
C’est pour ça que la RAM apparaît organisée en 4 banks de 128 octets chacun. L'adresse instruction
permet d'adresser à l'intérieur d'un bank alors que les bits RP0 et RP1 du registre STATUS permettent
de choisir un bank. La figure ci-dessus montre l’organisation de la RAM avec les zones allouées aux
SFR et aux GPR. Les zones en gris ne sont pas implantées physiquement.

Adressage direct de la RAM

II.4.3.2Accès à la RAM par l’adressage INDIRECT


Pour accéder à une position de la RAM en utilisant l’adressage indirect, on passe toujours par une
position fictive appelée INDF (Indirect File).
Exemple: l’instruction CLRF INDF signifie: mettre à zéro la case mémoire d’adresse INDF
INDF est la case mémoire pointée par le pointeur IRP/FSR.

IRP est un bit qui se trouve dans STATUS et FSR est un registre accessible dans tous les banks. En
effet, le registre de pointage FSR est un registre 8 bits, il peut donc adresser au maximum 256 positions
mémoires (de 00h à FFh), c’est seulement la moitié de la RAM dont on dispose. Il nous manque un bit
pour avoir les 9 bits nécessaires. On utilise le bit IRP qui se trouve dans le registre STATUS.

Exemle: Si on place 74h dans le registre FSR et on positionne le bit IRP à 1, alors l’instruction
CLRF INDF signifie: remettre à zéro la case mémoire d’adresse 174h.
Movlw 0x74
Bsf STATUS,IRP
Movwf FSR
Clrf INDF

Donc en résumé, chaque fois que le PIC rencontre le mot INDF dans un programme, il sait qu’il
s’agit de la case mémoire dont l’adresse (9bits) se trouve dans le registre FSR complété par le bit IRP
du registre STATUS

47
II.4.4 Quelques registres de configuration et leurs bits
STATUS IRP RP1 RP0 TO PD Z DC C 00011xxx
OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 11111111
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000000x
PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 00000000
PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 00000000
PIE2 N.I. Réservé N.I. EEIE BCLIE N.I. N.I. CCP2IE -r-00--0
PIR2 N.I. Réservé N.I. EEIF BCLIF N.I. N.I. CCP2IF -r-00--0
EECON1 EEPGD — — — WRERR WREN WR RD x---x000
TXSTA CSRC TX9 TXEN SYNC — BRGH TRMT TX9D 0000-010
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000000x
CCPxCON — — DCxB1 DCxB0 CCPxM3 CCPxM2 CCPxM1 CCPxM0 --000000
T1CON — — T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON --000000
T2CON — TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -0000000
SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 00000000
SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 00000000
SSPSTAT SMP CKE D/A P S R/W UA BF 00000000
CCP1CON — — CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --000000
TXSTA CSRC TX9 TXEN SYNC — BRGH TRMT TX9D 0000-010
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000000x
CCP2CON — — CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --000000
ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE — ADON 000000-0
ADCON1 ADFM — — — PCFG3 PCFG2 PCFG1 PCFG0 0---0000
TRISx 11111111

48
II.4.3.4 Le registre STATUS : ( h'03' ou h'83' ou h'103 ou h'183' ).
.
On accède indifféremment à ce registre par une quelconque de ces 4 adresses.
Au reset: STATUS = 00011XXX

Bit 7 : IRP = permet la sélection des pages en adressage indirect.


Pour la PAGE 0 (de 00 à 7F) et la PAGE 1 (de 80 à FF) ce bit doit être laissé à "0". Mis à "1" il
permettra d'atteindre la PAGE 3 (de 100 à17F) et la PAGE 4 (de 180 à 1FF).

Bits 6 et 5: RP1 et RP0 = permettent la sélection des pages en adressage direct.

Bit 4 :TO = Time Out bit. Bit en lecture seulement.


1 = Après une mise sous tension, après une RAZ du watchdog (CLRWDT) ou bien après l'instruction
SLEEP.
0 = Signifie qu'un Time Out du timer de watchdog est survenu.

Bit 3 :PD = Power Down bit.


1 = Après une mise sous tension ou bien après une RAZ du Watchdog.
0 = Après l'instruction SLEEP.

Bit 2 : Z = Zero bit.


1 = Le résultat d'une opération arithmétique ou logique est zéro.
0 = Le résultat d'une opération arithmétique ou logique est différent de zéro.
Bit 1 :DC = Digit Carry bit.
1 = Une retenue sur le 4eme bit du poids faible est survenue après les instructions : ADDWF ,
ADDLW,SUBWF et SUBLW
0 = Pas de retenue sur le 4eme bit du poids faible.
Bit 0 : C = Carry bit.
1 = Une retenue sur le bit MSB est survenue après les instructions ADDWF , ADDLW,SUBWF et
SUBLW
0 = Pas de retenue sur le bit MSB.

Les bits Z, DC et C sont des indicateurs qui permettent de savoir comment une instruction s’est
terminée. Toutes les instructions n’agissent pas sur ces indicateurs. Ces bits peuvent être utilisés très
astucieusement par les instructions btfsc et btfss qui permettent de tester un bit et de réaliser un saut
conditionnel.

49
II.4.3.5 Le registre OPTION_REG : ( h'81' ou h'181').

Ce registre en lecture écriture permet de configurer les prédiviseurs du Timer et du Watchdog, la source
du Timer, le front des interruptions et le choix du Pull up sur le Port B..
Au reset : OPTION = 11111111

Bit 7 :RBPU = Pull up Enable bit on Port B.


1 = Pull up désactivé sur le Port B.
0 = Pull up activé.

Bit 6 :INTEDG = Interrupt Edge select bit.


1 = Interruption si front montant sur la broche PB0/IRQ (pin 6).
0 = Interruption si front descendant sur PB0/IRQ.

Bit 5 :TOCS = Timer TMR0 Clock Source select bit.


1 = L'horloge du Timer est l'entrée PA4/Clk (pin 3).
0 = Le Timer utilise l'horloge interne du PIC.

Bit 4 :TOSE = Timer TMR0 Source Edge select bit.


1 = Le Timer s'incrémente à chaque front montant de la broche PA4/Clk.
0 = Le Timer s'incrémente à chaque front descendant de la broche PA4/Clk.

Bit 3 : PSA = Prescaler Assignement bit.


1 = Le prédiviseur est affecté au watchdog..
0 = Le prédiviseur est affecté au Timer TMR0.

Bits 2 à 0 :PS2 PS1 PS0 = Prescaler Rate Select bits.

II.4.3.6 Le registre INTCON (interruptions control) :


C’est un registre 8 bits qui permet de contrôler les interruptions
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF

Masques :

50
GIE: (Global Interrupt Enable) : masque global d’interruptions
PEIE : (Periferal Interrupt Enable) autorise les interruptions de différentes périphéries.
T0IE : (Timer 0 Interrupt Enable) autorise l'interruption provoquée par le débordement du TIMR0
INTE: ( Interrupt Enable) autorise l’interruption provoquée par un changement d'état sur broche
RB0/INT
RBIE: (RB InterruptEnable) autorise les interruptions provoquées par un changement d'états
sur l'une des broches RB4 à RB7.
Si ces bits sont mis à 1 , ils autorisent les interruptions pour lesquels ils sont dédiés .
Drapeaux :
T0IF : (Timer 0 Interrupt Flag) indique un débordement du TMR0
INTF( Interrupt Flag) indique une interruption provoquée par la broche RB0/INT
RBIF( RB Interrupt Flag) indique une interruption provoquée par les broches RB4-RB7.

II.5 Les instructions du PIC16F877


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, 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 un quartz de
20MHz, on obtient une vitesse de traitement de 5MIPS.

II.5.1 Les instructions « orientées Registre»


Ce sont des instructions qui manipulent un octet se trouvant dans la RAM. Ça peut être un registre de
configuration SFR ou une case mémoire quelconque (Registre GPR). Elles sont codées de la manière
suivante :

- 6 bits pour l’instruction : logique, car comme il y a 35 instructions, il faut 6 bits pour pouvoir les coder
toutes

- 1 bit (d) pour indiquer si le résultat obtenu doit être conservé dans le registre de travail W de l’unité de
calcul ou sauvé dans un registre F (F pour File).
- Reste 7 bits pour encoder l'adresse de l’opérande (128 positions au total)
Remarque :
Comme 7 bits ne donnent pas accès à la mémoire RAM totale, donc voici l’explication de la
division de la RAM en quatre banks. Pour remplacer les bit manquants, on utilise le bit RP0 et RP1
du registre STATUS

Instructions opérant sur registres indicateurs Cycles


MOVWF F W F 1
MOVF F,d F {W, F ? d} Z 1
CLRF F Clear F Z 1
COMF F,d Complémente F {W, F ?d} Z 1

ADDWF F,d W+F {W, F ?d} C,DC,Z 1


SUBWF F,d F–W {W, F ?d} C,DC,Z 1
INCF F,d Incrémente F {W ,F ?d} Z 1
INCFSZ F,d Incrémente F {W, F ?d}skipif0 1(2)
DECF F,d Décrémente F {W, F ?d} Z 1
DECFSZ F,d Décrémente F {W, F ?d}skipif0 1(2)

51
ANDWF F,d W and F {W ,F ?d} Z 1
IORWF F,d W or F {W,F ?d} Z 1
XORWF F,d W xor F {W, F ?d} Z 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

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

II.5.2 Les instructions «orientées bits»

Ce sont des instructions destinées à manipuler directement les bits d’un registre que ce soit un
registre SFR ou une case mémoire quelconque. Tous les bits de la RAM peuvent être manipulés
individuellement. Elles sont codées de la manière suivante :
- 4 bits pour l’instruction
- 3 bits pour indiquer le numéro du bit à manipuler (de 0 à 7)
- 7 bits pour indiquer l’opérande.

Instructions opérant sur bits indicateurs Cycles


BCF F ,b Mise à zéro du bit b du registre F 1
BSF F ,b Mise à un 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)

Pour les instructions agissant sur un bit, le paramètre F indique le registre qui contient le bit à
modifier et le paramètre b indique le numéro du bit à modifier ;on compte à partir de zéro en
commençant à droite
7 6 5 4 3 2 1 0

BSF STATUS,2 ;signifie: placer à 1 l bit 2 (3ème bit à partir de la droite) du registre STATUS
BCF 45h,6 ;signifie: placer à 0 le bit 6 (7ème bit à partir de la droite) du registre de la case
mémoire d’adresse 45h

II.5.3 Les instructions opérant sur une constante


Ce sont les instructions entre l’accumulateur W est une constante K. Elles sont codées de la manière
suivante :
- L’instruction est codée sur 6 bits
- Elle est suivie d’une valeur IMMEDIATE codée sur 8 bits (donc de 0 à 255).

Instructions opérant sur constante indicateurs Cycles


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

52
II.5.4Les instructions de saut et appel de procédures
Ce sont les instructions qui provoquent une rupture dans la séquence de déroulement du programme.
Elles sont codées de la manière suivante :
- Les instructions sont codées sur 3 bits
- La destination est codée sur 11 bits

Instructions de saut et appel de procédures indicateurs Cycles


CALL L Branchement à un sous programme de label L 2
RETURN Retour d'un sous programme 2
RETLW K Retour d'un sous programme avec K dans W 2
RETFIE Retour d'interruption 2
GOTO L Branchement à la ligne de label L 2

CLRW Clear W Z 1
CLRWDT Clear Watch dog timer TO,PD 1
NOP No operation 1
SLEEP Se met en mode standby TO,PD 1

On remarque que:

Les instructions qui agissent sur un registre ou un bit d’un registre contiennent toutes la lettre F dans
le nom de l’instruction. Ceci vient du fait que chez Microchip, la RAM est appelée register File
(Fichier des registres).

Les instructions qui agissent sur une constante contiennent toutes la lettre L, parce que chez
Microchip, on appelle« Literal» ce genre d’adressage, chez d’autres constructeurs, on parle
d’adressage immédiat

III . Etude des 35 instructions du PIC16F877


III.1 Instructions opérant sur les registres
 MOVWF ( Move W to F )
syntaxe : MOVWF f
opération : Wf
Bit d’état du registre STATUS affecté :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge )
On charge le contenu de W dans f

 MOVF ( Move F )
syntaxe : MOVF f,d
opération : ff si d=1 ou fW si d=0
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On déplace le contenu de f dans f si d=1 ou de f dans W si d=0. Attention, le déplacement de f dans f
semble à priori inutile, mais il permet en fait de tester le contenu de f par rapport à 0 et de positionner le
bit Z
 CLRF ( Clear F )
syntaxe : CLRF f
Opération : 0F

53
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On met le contenu du registre f à 0 et on positionne Z

 COMF ( Complement F )
syntaxe : COMF f,d
opération : /ff si d=1 ou /fW si d=0
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On complémente le contenu du registre f bit à bit , le résultat est placé dans f si d=1 , dans W si d=0 .

 ADDWF (Add W to F )
syntaxe : ADDWF f,d
Opération : W+ff si d=1 ou W+fW si d=0
Bits d’état du registre STATUS affectés : C,DC,Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
on additionne le contenu de W et le contenu de f et on place le résultat dans f si d=1 ou dans W si
d=0
ex : ADDWF PORTB,0
ADDWF 0x0C ,1

 SUBWF ( Substract W from F )


syntaxe : SUBWF f,d
opération : f-WW si d=0 ou f-Wf si d=1
Bits d’état du registre STATUS affectés :C,DC,Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On soustrait le contenu du registre W du contenu du registre f et on place le résultat dans W si d=0,
ou dans f si d=1 ( soustraction par la méthode du complément à 2 ).

 CLRW ( Clear W )
syntaxe : CLRW
Opération : 0W
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On met le contenu du registre W à 0 et on positionne Z

 INCF (Increment F)
syntaxe : INCF f,d
opération : f+1f si d=1 ou f+1W si d=0
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )

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

 INCFSZ ( Increment F , Skip if Zero )


54
syntaxe : INCFSZ f,d
opération : f+1f si d=1 ou f+1W si d=0 et saut si f-1=0
Bit d’état du registre STATUS affecté :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
On augmente le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans W si d=0
(dans ce cas f reste inchangé).Si le résultat est nul, l’instruction suivante est ignorée et dans ce cas, cette
instruction dure deux cycles.

 DECF ( Decrement F )
syntaxe : DECF f,d
opération : f-1f si d=1 ou f-1W si d=0
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On diminue le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans W si d=0
(dans ce cas f reste inchangé ).

 DECFSZ ( Decrement F ,Skip if Zero )


syntaxe : DECFSZ f,d
opération : f-1f si d=1 ou f-1W si d=0 et saut si f-1=0
Bit d’état du registre STATUS affecté :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
On diminue le contenu du registre f d’une unité, le résultat est placé dans f si d=1, dans W si d=0
(dans ce cas f reste inchangé).Si le résultat est nul, l’instruction suivante est ignorée et dans ce cas, cette
instruction dure deux cycles.

 ANDWF ( And W with F )


syntaxe : ANDWF f,d
Opération : W ET ff si d=1 ou W ET fW si d=0
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
on effectue un ET logique entre le contenu de W et le contenu de f , on place le résultat dans W si d=0
ou dans f si d=1

 IORWF ( Inclusive Or W with F )


syntaxe : IORWF f,d
opération : W OU ff si d=1 ou W OU fW si d=0
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On effectue un OU entre le contenu de W et le contenu de f , on place le résultat dans f si d=1, dans
W si d=0

 XORWF ( Exclusive Or W with F)


syntaxe : XORWF f,d
opération : W OU EXCLUSIF fW si d=0 ou W OU EXCLUSIF ff si d=1
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )

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

 RLF ( Rotate Left F through carry )


syntaxe : RLF f,d
7 6 5 4 3 2 1 0
opération : C

Registre f

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


durée : 1 cycle instruction ( 4 cycles d’horloge )
On effectue une rotation à gauche de un bit du contenu du registre f en passant par le bit de retenu C .
Si d=1 le résultat est placé dans f , si d=0 , le résultat est placé dans W

 RRF ( Rotate Right F through carry )


syntaxe : RRF f,d
opération : 7 6 5 4 3 2 1 0
C

Registre f

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


durée : 1 cycle instruction ( 4 cycles d’horloge )
On effectue une rotation à droite de un bit du contenu du registre f en passant par le bit de retenu C. Si
d=1 le résultat est placé dans f , si d=0, le résultat est placé dans W

 SWAPF ( Swap F )
syntaxe : SWAPF f,d
opération : f(0-3)f(4-7) et f(4-7)f(0-3) résultat dans W ou f selon d
Bit d’état du registre STATUS affecté :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge )
On échange les quatre bits de poids forts avec les quatre bits de poids faibles et on place le résultat
dans W si d=0 , ou dans f si d=1

III.2 INSTRUCTIONS OPERANT SUR BITS


 BCF ( Bit Clear File )
syntaxe : BCF f,b
Opération : 0b(f)
Bits d’état du registre STATUS affectés :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge )
on met à 0 le bit b du registre f

 BSF ( Bit Set File )


56
syntaxe : BSF f,b
Opération : 1b(f)
Bits d’état du registre STATUS affectés :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge )
on met à 1 le bit b du registre f

 BTFSC ( Bit Test , Skip if Clear )


syntaxe : BTFSC f,b
Opération : saut de l’instruction qui suit si b(f)=0
Bits d’état du registre STATUS affectés :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
Si le bit b de f est nul, l’instruction qui suit celle-ci est ignorée et traitée comme un NOP. Dans ce cas
et dans ce cas seulement, l’instruction BTFSC demande deux cycles pour s’exécuter.

 BTFSS ( Bit Test , Skip if Set )


syntaxe : BTFSSf,b
Opération : saut de l’instruction qui suit si b(f)=1
Bits d’état du registre STATUS affectés :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge ) ou 2 cycles
Si le bit b de f est à 1, l’instruction qui suit celle-ci est ignorée et traitée comme un NOP. Dans ce
cas et dans ce cas seulement, l’instruction BTFSS demande deux cycles pour s’exécuter.

III.3 INSTRUCTIONS OPERANT SUR DONNEES (IMMEDIAT)


 ADDLW ( Add Literal to W )
syntaxe : ADDLW k
Opération : W+kW
Bits d’état du registre STATUS affectés : C,DC,Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On ajoute au registre de travail la valeur k et on place le résultat dans le registre de travail W
REMARQUE : k et une valeur 8 bits (0………..255)

 ANDLW ( And Literal and W )


syntaxe : ANDLW k
Opération : W ET kW
Bit d’état du registre STATUS affecté : Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On effectue un ET logique entre le contenu de W et le littéral k , on place le résultat dans W

 IORLW ( Inclusive Or Literal with W )


syntaxe: IORLW k
opération: W OU k  W
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On effectue un OU logique entre le contenu de W et le littéral k , le résultat est placé dans W .

 MOVLW ( Move Literal to W )


syntaxe : MOVLW k
57
opération : kW
Bit d’état du registre STATUS affecté :aucun
durée : 1 cycle instruction ( 4 cycles d’horloge)
On charge le contenu de W avec le littéral k

 SUBLW ( Substract W from Literal )


syntaxe : SUBLW k
opération : k-WW
Bits d’état du registre STATUS affectés :C,DC,Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On soustrait le contenu du registre W du littéral k et on place le résultat dans W ( soustraction par la
méthode du complément à 2 ).

 XORLW ( Exclusive Or Literal with W )


syntaxe : XORLW k
opération : W OU EXCLUSIF kW
Bit d’état du registre STATUS affecté :Z
durée : 1 cycle instruction ( 4 cycles d’horloge )
On effectue un OU Exclusif entre W et le littéral k, le résultat est placé dans W

III.4 INSTRUCTIONS DE SAUT ET DE COMMANDE


 CALL (subroutine Call)
syntaxe : CALL label
Bits d’état du registre STATUS affectés :aucun
durée : 2 cycles instruction ( 8 cycles d’horloge )
On sauvegarde l’adresse de retour dans la pile puis on appelle le sous programme définit avec
l’étiquette label

 GOTO ( branchement inconditionnel )


syntaxe : GOTO label
Bit d’état du registre STATUS affecté :aucun
Durée :2 cycles ( 8 cycles d’horloge )
On effectue un saut dans le programme pour aller à l’adresse pointé par le label précisé dans GOTO

 RETFIE ( Return From Interrupt )


syntaxe : RETFIE
opération : Pile PC
Bit d’état du registre STATUS affecté :aucun
durée : 2 cycles instruction ( 8 cycles d’horloge )
On charge le compteur ordinal avec la valeur qui se trouve au sommet de la pile pour revenir au
programme principal lorsque l’exécution du sous programme est terminée.

 RETLW ( Return Literal to W )


syntaxe : RETLW k
opération : kW , PilePC
Bit d’état du registre STATUS affecté :aucun
durée : 2 cycles instruction ( 8 cycles d’horloge )
58
On charge le contenu de W avec le littéral k puis on charge le compteur ordinal PC avec la valeur qui
se trouve au sommet de la pile effectuant ainsi un retour de sous-programme.

 RETURN ( Return from subroutine )


syntaxe : RETURN
opération : PilePC
Bit d’état du registre STATUS affecté :aucun
durée : 2 cycles instruction ( 8 cycles d’horloge )
On charge le compteur ordinal PC avec la valeur qui se trouve au sommet de la pile effectuant ainsi
un retour de sous-programme. C’est un RETLW simplifié

 CLRWDT ( Clear WatchDog Timer )


syntaxe : CLRWDT
Opération : 0WDT et 0pré diviseur du Timer
durée : 1 cycle instruction ( 4 cycles d’horloge )
On met le contenu du registre du timer chien de garde à 0 ainsi que le pré diviseur

 NOP ( NoOperation )
syntaxe: NOP
opération: néant
Bit d’état du registre STATUS affecté : aucun
durée : 1 cycle instruction ( 4 cycles d’horloge )
On ne fait que consommer du temps machine (un cycle dans ce cas )

 SLEEP ( Sleep )
Syntaxe : SLEEP
opération : 0PD, 1T0, 0WDT, 0 pré diviseur
On place le circuit en mode sommeil avec arrêt de l’oscillateur. Cette commande est à utiliser avec
précaution.

III.5 Les directives de l'assembleur


Les directives de l'assembleur sont des instructions qu'on ajoute dans le programme et qui seront
interprétées par l'assembleur. Ce ne sont pas des instructions destinées au PIC donc ils ne sont pas
transformés en code machine.

LIST: permet de définir un certain nombre de paramètres comme le processeur utilisé (p), la
base par défaut pour les nombres (r) ainsi que d'autres paramètres. Exemple:
LIST p=16F877, r=dec
avec r=dec, les nombres sans spécification particulière seront considérés par l'assembleur comme des
nombre décimaux.
Pour préciser la base il faut utiliser les préfixes précisés dans le tableau ci-dessous :
59
Base Préfixe Exemple (36)
Décimale D’nnn’ D’36
.nnn .36
Hexadécimale H’nn’ H’24’
nnh 24h
0xnn 0x24
Binaire B’………’ B’00100100’

#INCLUDE : permet d'insérer un fichier source. Par exemple le fichier p16f876.inc contient la
définition d'un certain nombre de constante comme les noms des registres ainsi que les noms de certains
bits;
#INCLUDE "p16f877.inc"

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


XX EQU 0x20
Chaque fois que le compilateur rencontrera XX, il la remplacera par 0x20. Ça peut être une constante s'il
s'agit d'une instruction avec adressage Literal, ou d'une adresse s'il s'agit d'une instruction avec adressage
direct.

MOVLW XX ; charger dans W la constante 0x20


MOVF XX,0 ; charger dans W le contenu de la case d’adresse 0x20

CBLOCK/ENDC : permet de définir un ensemble de constantes :


L'ensemble des déclarations suivantes :
X1 EQU 0x20
X2 EQU 0x21
X3 EQU 0x22
X4 EQU 0x23

Peut être remplacé par


CBLOCK 0x20
X1,X2,X3,X4
ENDC

ORG: La directive ORG, suivie de l’adresse, précise à quelle adresse l’instruction suivante sera placée
dans la mémoire programme du PIC. À défaut de cette précision, chaque instruction est placée à l’adresse
suivant directement l’instruction précédente.

#DEFINE: fonctionne un peu comme la directive EQU tout en étant un peu plus générale, car elle
permet d’affecter toute une chaîne à une abréviation

#DEFINE X 0x20 ; dans ce cas c’est équivalent à X EQU 0x20


#DEFINE LED PORTB,3 ; ici chaque fois que le compilateur rencontrera le mot LED, il le
remplacera par PORTB,3
BCF LED ; éteindre la LED branchée sur la broche 3 de PORTB

60
On peut ainsi affecter une abréviation à toute une instruction

#DEFINE éteindre bcf PORTC,5 ; affecte l’abréviation éteindre à l’instruction bcf PORTC,5

#DEFINE allumer bsf PORTC,5 ; affecte l’abréviation allumer à l’instruction bsf PORTC,5

allumer ; allume la LED branchée sur la broche 5 du PORTC


éteindre ; éteindre la LED branchée sur la broche 5 du PORTC

DE: pour déclarer des donnés qui seront stockée dans l'EEPROM de donnée au moment de
l'implantation du programme sur le PIC
ORG 0x2100
DE "Programmer un PIC16f877, c’est facile"

DT : pour déclarer un tableau RETLW


DT 10,35h,’Automatique’ ; sera remplacée par la suite d’instructions:

RETLW 10
RETLW 35h
RETLW 'A'
RETLW 'u'
RETLW ‘t’
RETLW ‘o’
RETLW ‘m’
RETLW ‘a’
RETLW ‘t’
RETLW ‘i’
RETLW ‘q’
RETLW ‘u’
RETLW ‘e’

END: indique la fin du programme

CONFIG : permet de définir les 14 bits de configuration qui seront copiés dans l'EEPROM de
configuration (adresse 2007h) lors de l'implantation du programme dans le PIC.

CP1 CP0 DEBUG — WRT CPD LVP BODEN - - PWRTE WDTE F0SC1 F0SC0

CP1/CP0 : bits 13/12 ; Déterminent quelle zone de la mémoire programme sera protégée contre la
lecture externe (via ICSP) ou l'écriture par programme conformément à l'état du bit 9 (WRT). On peut
choisir de protéger la totalité de la mémoire ou seulement une partie. Les différentes zones pouvant
être protégées sont les suivantes :
1 1 : Aucune protection (_CP_OFF)
1 0 : Protection de la zone 0x1F00 à 0x1FFF (_CP_UPPER_256)
0 1 : Protection de la zone 0x1000 à 0x1FFF (_CP_HALF)
0 0 : Protection de l’intégralité de la mémoire (_CP_ALL)

DEBUG : bit 11 : Debuggage sur circuit. Permet de dédicacer RB7 et RB6 à la communication avec
un debugger.
61
1 : RB6 et RB7 sont des I/O ordinaires (_DEBUG_OFF)
0 : RB6 et RB7 sont utilisés pour le debuggage sur circuit (_DEBUG_ON)

WRT : bit 9 : Autorisation d’écriture en flash


1 : Le programme peut écrire dans les zones non protégées par les bits CP1/CP0
(_WRT_ENABLE_ON)
0 : Le programme ne peut pas écrire en mémoire flash (_WRT_ENABLE_OFF)

CPD : bit 8 : Protection en lecture de la mémoire EEPROM de données.


1 : mémoire EEPROM non protégée (_CPD_OFF)
0 : mémoire EEPROM protégée contre la lecture externe via ICSP (_CPD_ON)

LVP : bit 7 : Utilisation de la pin RB3/PGM comme broche de programmation 5V


1 : La pin RB3 permet la programmation du circuit sous tension de 5V (_LVP_ON)
0 : La pin RB3 est utilisée comme I/O standard (_LVP_OFF)

BODEN : bit 6 : provoque le reset du PIC en cas de chute de tension (surveillance de la tension
d’alimentation)
1 : En service (_BODEN_ON)
0 : hors service (_BODEN_OFF)

PWRTE : bit 3 : Délai de démarrage à la mise en service. Attention, est automatiquement mis en service
si le bit BODEN est positionné.
1 : délai hors service (sauf si BODEN = 1) (_PWRTE_OFF)
0 : délai en service (_PWRTE_ON)

WDTE : bit 2 : Validation du Watchdog timer


1 : WDT en service (_WDT_ON)
0 : WDT hors service (_WDT_OFF)

FOSC1/FOSC0 : bits 1/0 : sélection du type d’oscillateur


11 : Oscillateur de type RC (_RC_OSC) (3K < R < 100k, C > 20 pF)
10 : Oscillateur haute vitesse (_HS_OSC) (4 Mhz à 20 Mhz)
01 : Oscillateur basse vitesse (_XT_OSC) (200 kHz à 4 Mhz)
00 : Oscillateur faible consommation (_LP_OSC) (32 k à 200 kHz)

Voici 3 exemples d’utilisation:

__CONFIG B'11111100111010'
__CONFIG H'3F3A'
__CONFIG _CP_OFF &_DEBUG_OFF &_WRT_ENABLE_ON &_CPD_OFF &_LVP_OFF
&BODEN_OFF&_PWRTE_OFF&_WDT_OFF&_HS_OSC

III.6 Structure générale d’un programme


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

 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.
62
 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 (labels)
 la colonne du milieu contient les instructions
 la colonne de droite contient des commentaires

Exemple
;*******************************************************
; Réalisation d’une Temporisation. *
;*******************************************************
list p=16f877, r=dec
#include "p16f877.inc"
__Config B'11111100111001'

N1 equ 0x20 ; N1 = compteur temporisateur


N2 equ 0x21 ; N2 = compteur temporisateur
N3 equ 0x22 ; N3 = compteur temporisateur
goto start
org 0x04
call interrupt
Start banksel TRISB
clrf TRISB
banksel PORTB
Boucle clrf PORT B
call Tempo
goto Boucle

Tempo movlw 0x06


movwf N1
tmp1 decfsz N3,1 ; boucle intérieure
goto tmp1
decfsz N2,1 ; boucle médiane
goto tmp1
decfsz N1,1 ; boucle extérieure
goto tmp1
return

III.7 Les outils de développement


Il existe plusieurs outils de développement (MPLAB, PROTEUS…) qui regroupent l'éditeur de
texte, le compilateur, l’outil de simulation et le logiciel de programmation.

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

63
1- Ecrire un programme en langage assembleur dans l’éditeur de texte et le sauvegarder avec
l'extension.asm
2- Compiler ce programme avec l'assembleur MPASM pour avoir un fichier exécutable avec
l'extension.hex contenant une suite d'instruction compréhensible par le pic.
3- Simuler le programme afin de corriger d’éventuelles erreurs.
4- Transplanter 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.
5- Mettre le PIC dans son montage final,
6- mettre sous tension.

IV- Boucles de temporisation


Il arrive souvent qu'on désire introduire des temporisations pendant l'exécution
d'un programme. Le PIC dispose de 3 timers permettant de gérer le temps avec précision.
Nous étudierons ces modules plus tard, pour l'instant regardons comment on peut réaliser des
temporisations à l'aide de simples boucles. L'idée est d'initialiser une variable à une valeur donnée
et ensuite la décrémenter en boucle jusqu'à ce qu'elle atteigne 0. Connaissant le temps
d'exécution de chaque instruction, on peut calculer le temps que mettra le processeur pour terminer
la boucle de décrémentation
IV.1 Temporisation avec une boucle
Examinons l'exemple ci-dessous, on met une valeur n dans la case mémoire 20h et on la
décrémente jusqu'à 0

movlw 0X n
movwf 0x20
loop decfsz 0x20,1
goto loop
- Les instructions movlw et movwf prennent 1 cycle chacune
- L'instruction decfsz prend un cycle si elle ne saute pas et 2 cycles quand elle saute
- L'instruction goto prend 2 cycles
- chaque passage dans la boucle prend (1+2) cycles sauf le dernier qui prend 2 cycles

T = 2 + (n-1)*3 + 2 = 3*n + 1 cycles

La valeur max que l'on peut donner à n est = 0 = 256, ce qui donne une temporisation max
de 769 cycles.
Avec un quartz = fosc = 4 Mhz, 1 cycle = fosc/4 = 1 µs, ce qui donne une temporisation
max de 769 µs

Pour faciliter l'utilisation de cette temporisation on va l'utiliser comme une fonction que l'on
appellera tempo. On note N1 la case mémoire qui sert de compteur, il faut la déclarer au début avec
la directive EQU

Cette fonction doit être placée après le programme principal, et on l'appelle avec l'instruction
call tempo. Pour le calcul il faut rajouter 2 cycles pour l'instruction call et 2 cycles pour
l'instruction return, ce qui donne

T1 = 3 n + 5 cycles

Le maximum est obtenu pour n =256, soit T1max = 773 µs = 0.77 ms

64
IV.2 Temporisation avec 2 boucles imbriquées
La boucle intérieure (n1) se fait toujours 256 fois. La boucle extérieure se fait n2 fois. C’est
n2 qui constituera le paramètre de la fonction, Il faut le placer dans W avant de l’appeler.

tempo : movlw 0x..


movwf N2
A2 : decfsz n1,1
goto A2
decfsz n2,1
goto A2
return

T2 = 2 + 2 + [W(t1+3)-1] + 2 avec t1=256*3-1=767 on obtient :

T2 = 770 W +5 cycles

Le maximum est obtenu pour N2 =256, soit T2max = 197125 µs = 0.197 s

IV. 3 Temporisation avec 3 boucles imbriquées


Les boucles intérieures (n1 et n2) se font toujours 256 fois. La boucle extérieure se fait n3
fois. C’est n3 qui constituera le paramètre de la fonction, Il faut le placer dans W avant
de l’appeler.

tempo3 : ;Il faut définir W dans le programme principal


movwf n3
A1 : decfsz n1,1
goto A1
decfsz n2,1
goto A1
decfsz n3,1
goto A1
return

T3 = 2 + 2 + n3(T2+3)-1 + 2 avec t2=256*(767+3)-1 on obtient :

T3 = 197122 W +5 cycles

Le maximum est obtenu pour n3 =256, soit T3max = 50463237 µs = 50.46 s

Remarque : La précision de ces fonctions peut être améliorée en y insérant des instructions nop,
dans ce cas il faut revoir les formules. On verra plus tard comment on peut faire des
temporisations à l’aide des timers.
.

65
66

Vous aimerez peut-être aussi