Upload
anas-kerty
View
67
Download
0
Embed Size (px)
DESCRIPTION
Cours
Citation preview
Page1/60
Université Abdelmalek Essaâdi Faculté des Sciences Département de Physique - TETOUAN –
Pr. Naima Amar Touhami Année Universitaire : 2011/2012
LES MICROCONTROLEURS DE LA FAMILLE PIC DE MICROCHIP
(PIC 16F84) (MASTER MECATRONIQUE)
Page2/60
Chapitre 0 :
Introduction Générale
I- Du microprocesseur au microcontrôleur
La découverte du microprocesseur et la fabrication du premier circuit commence en
1970, ou la société INTEL met au point le premier microprocesseur, le 4004. On n’imagine
pas à l’époque que cette révolution industrielle donnera naissance à l’ordinateur individuel.
Depuis leur puissance de calcul et l’intégration des transistors les constituants n’ont cessé
d’évoluer. On retrouve les microprocesseurs dans la plupart des applications, que ce soit pour
piloter une centrale, à l’intérieur d’un ordinateur ou bien encore pour remplacer le
programmateur d’une machine à laver.
Les microprocesseurs ne sont jamais employés seuls, des circuits périphériques leur
sont toujours associés pour pouvoir être intégrés au sein d’une application (figure ci-dessous)
un des avantages d’un montage à base de microprocesseur par rapport à un montage en
logique câblée, est sa souplesse d’emploi, en effet nous entrons dans le domaine de la logique
programmable ou le fonctionnement du montage, dépend d’un programme logé dans une
mémoire, celui-ci peut être modifié pour changer les équations régissant l’application, sans
toutefois entrainer de changement au niveau du câblage des entrées sorties
Page3/60
II. Les microcontroleurs
Les microprocesseurs que nous venons de voir possédent un avantage sur la logique
cabléé, en effet pour modifier le fonctionnement d’une application il suffit de modifier le
programme sans refaire de câblage.
Les microcontroleurs possédent quant à eux la puissance d’un microprocesseur mais
ils ont ont un aventage plus, en effet ils possèdent dans la même boitier, les périphériques
intégrés (figure ci-dessous).
Cela veut dire que le programme de l’application est en interne et non plus dans un
circuit mémoire externe et que les périphériques d’entrées- sorties sont également intégrés, ce
qui fait l’économie de nombreuses circuits périphériques.
Cette ceractéristique fait que les montages deviennent encore plus simple et la programmation
plus . Un microcontroleur seul peut donc gérer une application, sans faire appel forcement à
d’autres circuits associés
Sur la figure cidessus le microcontroleur posséde en interne la mémoire programme
contenant le programme de l’application ainsi que le port d’entrées- sorties qui va permettre
au microcontroleurs de s’interfacer avec l’application.
On le voit ici, par rapport au schéma à base de microprocesseur présenté dans la
premiere figure, on a encore franchi un degré d’intégration en rassemblant tous les circuits
necessaires au fonctionnement d’une application dans le même boitier.
Page4/60
Chapitre 1 :
Systèmes de numérotation
I. Systèmes : binaire, décimal et hexadécimal
On va commencer par un rappel sur les systèmes de numérotation, puisqu’il est
difficile de programmer sérieusement un microcontrôleur sans savoir ce qu’est un bit, ou
comment convertir les notations décimales en hexadécimales.
Nous sommes habitués, depuis notre enfance à utiliser le système numérique décimal,
à tel point que nous ne voyons même plus la manière dont ce système fonctionne, tant c’est
devenu un automatisme.
Décimal, pourquoi ? Parce qu’il utilise une numérotation à 10 chiffres. Nous dirons
que c’est un système en BASE 10. La position des chiffres a également une grande
importance, les chiffres les moins significatifs se situent à droite du nombre, et leur
importance augmente au fur et à mesure du déplacement vers la gauche. En effet, dans le
nombre 502, le 5 à une plus grande importance que le 2. En réalité, chaque chiffre, que l’on
peut appeler DIGIT, à une valeur qui dépend de son RANG. Quel est ce rapport ? Il s’agit
tout simplement de l’élévation de la BASE utilisée élevé à la puissance de son RANG.
Reprenons, par exemple notre nombre 502. Que signifie-t-il ? Et bien, tout simplement
que sa valeur est égale à 2 multiplié par la base (10) élevée à la puissance du rang du chiffre,
c’est à dire 0. Remarquez ici une chose très importante : le comptage du rang s’effectue
toujours de droite à gauche et en commençant par 0. Pour notre nombre 502, sa valeur est
donc en réalité : 502 = 2*10° + 0*101 + 5*10².
Cela ne pose aucun problème pour vous de compter sur vos 10 doigts, mais pour les
ordinateurs, cela n’est pas si simple. Ils ne savent faire la distinction qu’entre 2 niveaux
(présence ou absence de tension). Le système de numérotation décimal est donc inadapté. On
comprendra immédiatement que le seul système adapté est donc un système en base 2, appelé
système binaire. Ce système ne comporte donc que 2 chiffres, à savoir 0 et 1. Comme, de
plus, les premiers ordinateurs (et les pics) travaillent avec des nombres de 8 chiffres binaires,
on a donc appelé ces nombres des octets (ou bytes en anglais). Le chiffre 0 ou 1 est appelé un
BIT (unité binaire, ou BInary uniT) .
Page5/60
Pour nous, on adoptera les conventions suivantes : tout nombre décimal est écrit tel
quel, ou en utilisant la notation D’xxx’ ; tout nombre binaire est écrit suivant la forme
B’xxxxxxxx’ dans lesquels les ‘x’ valent… 0 ou 1.
Analysons maintenant un nombre binaire, soit l’octet : B’10010101’. Quelle est donc
sa valeur en décimal ?
Et bien, c’est très simple, on applique le même algorithme que pour le décimal.
Partons de la droite vers la gauche, on trouve donc :
B’10010101’ = 1*2° + 0*21 + 1*2² + 0*23 + 1* 24 + 0*25 + 0*26 + 1*27
B ‘10010101’ = 1+4+16+128 = 149
On procède simplement de la manière suivante (il y en a d’autres) :
Quel est le plus grand exposant de 2 contenu dans 149 ? Réponse 7 (27 = 128)
On sait donc que le bit 7 vaudra 1. Une fois fait, il reste 149-128 = 21
Le bit 6 représente 64, c’est plus grand que 21, donc b6 = 0
Le bit 5 représente 32, c’est plus grand que 21, donc b5 = 0
Le bit 4 représente 16, donc ça passe, b4 = 1, il reste 21-16 = 5
Le bit 3 représente 8, c’est plus grand que 5, donc b3 = 0
Le bit 2 représente 4, donc b2 = 1, reste 5-4 = 1
Le bit1 représente 2, c’est plus grand que 1, donc b1 = 0
Le bit 0 représente 1, c’est ce qu’il reste, donc b1=1, reste 0
Le nombre binaire obtenu est donc B’10010101’, qui est bien notre octet de départ.
Notez que si on avait trouvé un nombre de moins de 8 chiffres, on aurait complété avec des 0
placés à gauche du nombre. En effet, B’00011111’ = B ‘11111’, de même que 0502 = 502.
Pensez à toujours compléter les octets de façon à obtenir 8 bits, car c’est imposé par la
plupart des assembleurs. Notez que la plus grande valeur pouvant être représentée par un octet
est donc : B’11111111’. Si vous faites la conversion, vous obtiendrez 255. Tout nombre
supérieur à 255 nécessite donc plus d’un octet pour être représenté.
La représentation de nombres binaires n’est pas évidente à gérer, et écrire une
succession de 1 et de 0 représente une grande source d’erreurs. Il fallait donc trouver une
solution plus pratique pour représenter les nombres binaires. On a donc décidé de couper
chaque octet en 2 (QUARTET) et de représenter chaque partie par un chiffre.
Comme un quartet peut varier de b’0000’ à b’1111’, on constate que l’on obtient une
valeur comprise entre 0 et 15. Cela fait 16 combinaisons. Les 10 chiffres du système décimal
ne suffisaient donc pas pour coder ces valeurs.
Page6/60
Plutôt que d’inventer 6 nouveaux symboles, il a été décidé d’utiliser les 6 premières
lettres de l’alphabet comme CHIFFRES. Ce système de numérotation en base 16 a donc été
logiquement appelé système hexadécimal.
Notez que ce système est simplement une représentation plus efficace des nombres
binaires, et donc que la conversion de l’un à l’autre est instantanée. Dans la suite de ces
leçons, nous noterons un nombre hexadécimal en le faisant précéder de 0x.
Tableau de conversion des différents quartets (un demi-octet)
Binaire Hexadécimal Décimal
B’0000’ 0x0 0
B’0001’ 0x1 1
B’0010’ 0x2 2
B’0011’ 0x3 3
B’0100’ 0x4 4
B’0101’ 0x5 5
B’0110’ 0x6 6
B’0111’ 0x7 7
B’1000’ 0x8 8
B’1001’ 0x9 9
B’1010’ 0xA 10
B’1011’ 0xB 11
B’1100’ 0xC 12
B’1101’ 0xD 13
B’1110’ 0xE 14
B’1111’ 0xF 15
Pour représenter un octet il faut donc 2 digits hexadécimaux. Par exemple, notre
nombre B’10010101’ est représenté en hexadécimal par 0x95. Si vous faites la conversion de
l’hexadécimal vers le décimal, vous utilisez le même principe que précédemment, et vous
obtenez 0x95 = 9*161 + 5*16° = 149. Le plus grand nombre hexadécimal de 2 digits pouvant
être représenté : 0xFF, soit 15*16 + 15 = 255.
Après avoir converti les nombres dans différents formats, vous allez voir qu’il est
également très simple de réaliser des opérations sur ces nombres dans n’importe quel format.
Page7/60
Il suffit pour cela d’effectuer les mêmes procédures qu’en décimal.
Exemple : B’1011’ + B ‘0110’
On procède exactement de la même façon que pour une opération en décimal.
B’1011 ‘
+ B’ 1110 ‘
---------------
On additionne les chiffres de droite, et on obtient 1+0 = 1. On écrit 1
On additionne 1 + 1, et on obtient 10 (2 n’existe pas en binaire). On écrit 0 et on reporte 1
On additionne 0+1+le report et on obtient 10. On écrit 0 et on reporte 1
On additionne 1+1+le report et on obtient 11. On écrit 1 et on reporte 1
Reste le report que l’on écrit, soit 1.
La réponse est donc B’11001’, soit 25.
Les 2 nombres de départ étant B’1011’, soit 11, et B’1110’, soit 14. Vous procéderez
de la même manière pour les nombres hexadécimaux, en sachant que :
0xF + 0x1 = 0x10, soit 15+1 = 16.
II. Quelques opérations utiles dans la programmation des
PICs
Les opérations indispensables à connaître dans la programmation des pics et autres
microcontrôleurs sont :
II.1. Le complément
Que vous trouverez également sous les formes « inversion » ou « NOT » ou encore
complément à 1. C’est tout simple, cela consiste à inverser tous les bits de l’octet.
Exemple : NOT B’10001111’ donne ‘B01110000 ‘. Vous voyez ici que pour les opérations
booléennes, il est plus facile de travailler en binaire.
A quoi sert-elle ? Par exemple à lire une valeur dont les niveaux actifs ont été inversés, à
réaliser des nombres négatifs, ou autres.
Page8/60
II.2. La fonction ‘ET’ ou ‘AND’
Appelée également multiplication bit à bit, ou « AND » . Elle consiste à appliquer un
mot sur un autre mot et à multiplier chaque bit par le bit de même rang. Pour faire une
opération « ET », il faut donc toujours 2 octets.
Les différentes possibilités sont données ci-dessous, ce type de tableau s’appelle
« table de vérité »
Bit1 Bit2 AND
0 0 0
0 1 0
1 0 0
1 1 1
On voit donc que la seule possibilité pour obtenir un « 1 » est que le Bit1 ET le Bit2
soient à « 1 ». Ceci correspond à une multiplication. 1*1 = 1, 0*1 = 0, 1*0 = 0.
Exemple :
Soit B’11001100’ AND B ‘11110000’ donne B’11000000’
A quoi sert cette instruction ? Et bien, elle est utilisée pour MASQUER des bits qui ne
nous intéressent pas. Prenez l’exemple ci-dessus : Le 2ème octet contient 4 bits à 1 et 4 bits à
0. Regardez le résultat obtenu : Les 4 premiers bits de l’octet 1 sont conservés (1100), à
l’emplacement des 4 autres nous trouvons des 0. On peut donc à l’aide de cette instruction
positionner un ou plusieurs bits dans un mot à 0 sans connaître son contenu.
II.3. La fonction ‘OU’ ou ‘OR’
Encore appelée OR, elle permet, comme son nom l’indique, de positionner un bit à 1 si le
Bit1 OU le Bit2 est à 1. La table de vérité suivante explique le fonctionnement de cette
fonction.
Bit1 Bit2 OR
0 0 0
0 1 1
1 0 1
1 1 1
Page9/60
Exemple :
B’10001000’ OR B’11000000’ donne B’11001000’
A quoi sert cette instruction ? Et bien, tout simplement elle permet de forcer n’importe
quel bit d’un mot à 1 sans connaître son contenu. Vous voyez que dans l’exemple précédent,
les 2 premiers bits ont été forcés au niveau 1, indépendamment de leur niveau précédent.
II.4. La fonction ‘OU EXCLUSIF’ ou ‘EXCLUSIF OR’ ou
‘XOR’
Elle est souvent appelée XOR. Elle se comporte comme la fonction OR, à un détail près.
Pour obtenir 1, il faut que le Bit1 soit à 1 OU que le Bit2 soit à 1 à l’EXCLUSION des deux
bits ensemble. Si les 2 bits sont à 1, alors le résultat sera 0. Voici donc la table de vérité.
Bit1 Bit2 XOR
0 0 0
0 1 1
1 0 1
1 1 0
Exemple :
B’10001000 ‘ XOR B’11000000’ donne B’01001000 ‘
A quoi sert cette instruction ? et bien tout simplement à inverser un ou plusieurs bits
dans un mot sans toucher aux autres. Dans l’exemple précédent, vous voyez qu’à
l’emplacement des 2 bits à 1 du 2ème octet, les bits correspondants du 1er octet ont été inversés.
II.5. Bascule D
Avant d’étudier l’architecture interne d’un PIC, nous allons faire un bref rappel sur les
bascules, pour nous amener jusqu’au ‘circuit registre’ constituant essentiel dans l’architecture
d’un PIC.
Il existe en logique combinatoire différentes bascules ayant chacune des
caractéristiques et un mode de fonctionnement propre. Nous allons étudier ici le
fonctionnement de l’une d’elles : la bascule D
Page10/60
Une bascule D peut être construite à l’aide de 4 portes NAND et d’un inverseur tel que
représenté sur la figure suivante :
a. Mode de fonctionnement
Tant que l’entrée de validation H est au niveau logique bas (0V) la sortie des portes
NAND (3 et 4) est au niveau logique haut, en effet un 0V appliqué sur une des entrées d’une
porte NAND provoque la mise au niveau logique ‘1’ de la sortie de cette porte, on dit que le
‘0’ est l’élèment absorbant sur une NAND (voir la table de vérité). La sortie des portes 3 et 4
restera ‘bloquée’ au niveau ‘1’ tant que l’entrée H est à 0, ce qui sigifie que le signal présent
sur l’entrée D (data) ne modifiera pas les sorties des portes 3 et 4 (sortie R et sortie S). la
sortie Q de bascule D restira donc dans l’état précédent, on peut dire que la bascule D a
mémorisé l’état antérieur (voir table de vérité de bascule D).
Passons maintenant l’entrée H au niveau logique ‘1’, pour une porte NAND le niveau
logique ‘1’ sur l’une de ses entrées représente ‘l’élèment neutre’, c-a-d que la sortie de la
porte ne prendera alors que l’etat de la deuxiéme entrée logique. Si l’entrée D est au niveau
logique ‘1’ la sortie de la porte 4 ‘S’ passe au niveau logique ‘1’ de la sortie de la porte 1
appelée ‘Q’.
Un inverseur est inséré entre le signal d’entrée D et la porte 3 de ce fait sachant que
nous avons mis précédement D a 1 cela signifie que la sortie de la porte 3 est au niveau
logique ‘1’. La deuxiéme entrée de la porte 2 est connectée sur la sortie de la porte 1 qui est
au niveau logique ‘1’, de ce fait la sortie Q barre de la porte 2 est donc au niveau logique ‘0’.
On peut dire que la sortie Q d’une bascule D recopie l’état de l’entrée D tant que le
signal de validation H est au niveau logique ‘1’. Si le signal H est au niveau logique ‘0’, alors
Page11/60
la bascule peut être assimilée a une cellule mémoire de 1 bit, car elle memorise l’etat antérieur
de la sortie Q.
Table de vérité de bascule D
b. Comment utiliser le bascule D pour former un mémoire statique
Nous venons de voir le fonctionnement d’une bascule D unique, celle-ci peut être
assimilée à une cellule mémoire de 1 bit (en effet on ne mémorise qu’une seule information
binaire), pour réaliser par exemple une mémoire de 8 bits (1 octet), on pourra juxtaposer 8
bascules D comme représenté sur le schéma de la figure ci-dessous.
La donnée à mémoriser est représentée via les interrupteurs sur les entrées Data des
bascules D (D0 àD7) puis lorsque l’on veut mémoriser l’été de ces 8 entrées, il suffit
d’appliquer une impulsion sur la broche de validation H (remarquer que toutes les entrées de
validation H sont reliées ensembles). Les 8 leds connectées sur les sorties Q donnent l’etat du
contenu de chaque bascule.
Cette mémoire de 8 bits peut également s’appeler registre 8 bits. Dans l’architecture
interne d’un microcontroleur PIC nous retrouverons de nombreux registres semblables à
celui-ci. Le pic 16F84 posséde 15 registres ayant chacun une fonction bien définie.
Page12/60
Chapitre 2 :
Les microcontrôleurs
I. Qu’est ce qu’un microcontrôleur :
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 Euros à une dizaine d'Euros pour les plus complexes. Comme tout
ordinateur, on peut décomposer la structure interne d’un microprocesseur en trois parties :
- Les mémoires
- Le processeur
- Les périphériques
C’est ce qu’on peut voir sur la figure ci-dessous :
Les mémoires sont chargées de stocker le programme qui sera exécuté ainsi que
les données nécessaires et les résultats obtenus
Le processeur est le cœur du système puisqu’il est chargé d’interpréter les
instructions du programme en cours d’exécution et de réaliser les opérations qu’elles
contiennent. Au sein du processeur, l’unité arithmétique et logique interprète, traduit
et exécute les instructions de calcul (addition, soustraction, opérations logique (OU,
ET, NON, OU exclusif)
Les périphériques ont pour tâche de connecter le processeur avec le monde
extérieur dans les deux sens. Soit le processeur fournit des informations vers
Page13/60
l’extérieur (périphérique de sortie), soit il en reçoit (périphérique d’entrée). Ceci
peut être vérifié à travers des bus, qui sont les liaisons électriques qui véhiculent les
informations entre les différents composants du système électronique. On peut
distinguer trois types de bus :
Bus de données :
C’est sur ces lignes que circulent les données du programme. Sur un bus de données
de 8bits = 8 fils on fera circuler qu’un octet à la fois. Il est BI-DIRECTIONNEL
Bus d’adresse :
Il est parcouru par des informations qui permettent de localiser le ou les boîtiers
concernés par l’échange d’information. On parle alors de l’adresse de l’information. Il
est UNIDIRECTIONNEL (le microprocesseur impose sa valeur), il transporte une
adresse produite par le microprocesseur. Cette adresse spécifie l’origine ou la destination
des données qui transitent. Pour un bus de 16 bits, le microprocesseur peut accéder à
2^16 = 65 535 adresses différentes. Un seul composant (ROM, RAM …) est sélectionné
( par son adresse) à la fois. Le décodage du bus d’adresse permet de valider le composant
sélectionné. (Rôle du décodeur d’adresse)
Bus de contrôle:
C’est un ensemble de lignes « relativement indépendantes » qui permettent de :
- Synchroniser le système : Horloge
- Réaliser l’initialisation de l’unité centrale (Reset)
- Contrôler les échanges (lecture, écriture)
Page14/60
II. Les différentes familles des PICs (Microcontrôleurs)
Une PIC n’est rien d’autre qu’un microcontrôleur. Il existe trois familles de PIC :
- Base-Line : Les instructions sont codées sur 12 bits
- Mid-Line : Les instructions sont codées sur 14 bits
- High-End : Les instructions sont codées sur 16 bits
Un PIC est identifié par un numéro de la forme suivant : xx(L)XXyy –zz
- xx : Famille du composant (12, 14, 16, 18)
- L : Tolérance plus importante de la plage de tension
- XX : Type de mémoire de programme
C - EPROM ou EEPROM
CR - PROM
F - FLASH
- yy : Identification
- zz : Vitesse maximum du quartz
Exemple :
PIC 16F84 –4, soit :
- 16 : Mid-Line
- F : FLASH
- 84 : Type
- 4 : Quartz à 4MHz au maximum
Page15/60
Chapitre 3 :
Présentation général du PIC 16F84
I. Classification du PIC 16F84
Le PIC 16F84 est un microcontrôleur 8 bits. Il dispose donc d'un bus de données de
huit bits. Puisqu’il traite des données de huit bits, il dispose d’une mémoire de donnée dans
laquelle chaque emplacement (défini par une adresse) possède huit cases pouvant contenir
chacune un bit.
II. Architecture interne
La structure générale du PIC 16F84 comporte 4 blocs comme le montre la figure ci-
dessous :
Mémoire de programme
Mémoire de données
Processeur
Ressources auxiliaires ( périphériques )
La mémoire de programme 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
Page16/60
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 16F84 cette mémoire est d’une taille de 1024*14 bits,
c’est à dire qu’elle dispose de 1024 emplacements (de 000h à 3FFh) contenant
chacun 14 cases car dans le cas du PIC, les instructions sont codées sur 14 bits. On
peut donc stocker 1024 instructions.
La mémoire de donnée est séparée en deux parties :
Une mémoire RAM de 68 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 EEPROM de 64 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.
Le processeur est formé de deux parties:
Une unité arithmétique et logique (UAL) est considérée souvent comme
étant le cœur de l’unité centrale UC, en effet c’est elle qui va être chargée de
d’effectuer toutes les opérations de type arithmétique (addition,
soustraction, etc..) ou bien logique (rotation, décalage, complément, etc,…).
Selon l’opération à effectuer le décodeur d’instruction enverra les signaux
nécessaires à l’unité arithmétique et logique pour pouvoir accomplir
l’opération demandée.
Registre de travail (W) : l’unité arithmétique et logique est en étroite
relation avec le registre de travail, c’est un registre de travail qui correspond
aux anciens accumulateurs sur les microprocesseurs et par lequel vont être
transité un bon nombre d’informations que ce soit donnée a traitée (pour
réaliser par exemple une addition, une soustraction, ets..) ou bien pour
stocker le résultat d’une opération ou d’un traitement.
Exemple :
Nous voulons soustraire deux nombres, comment l’unité centrale va elle procéder ?
Page17/60
- Dans un premier temps la première valeur à soustraire va être stockée
dans le registre de travail W, remarquez que le registre de travail est
relié sur une des entrées de l’unité arithmétique et logique.
- Puis la deuxième valeur à soustraire est dirigée vers une autre entrée de
l’unité arithmétique et logique. Ensuite un code indiquant qu’une
soustraction doit être effectuée est envoyé vers l’unité arithmétique et
logique qui exécute cette instruction.
- Le résultat de la soustraction est stockée dans le registre de travail qui
lui-même est relié au bus de donnée interne, cela veut dire que le
résultat peut être transféré en interne vers n’importe quel registre.
Nous verrons par la suite lorsque nous réalisons des programmes que le
registre de travail est très intéressant, en effet l’accès à certain registres du PIC
ne peut se faire directement, nous sommes obligés de passer la valeur à lire ou
à écrire par ce fameux registre de travail. Le fait que le registre de travail soit
relié au bus de données interne permet à celui-ci d’être en relation avec le reste
de l’architecture du PIC (RAM, EEPROM, TIMER, PORTS A et B, etc…)
Page18/60
Les ressources auxiliaires qui sont dans le cas du PIC16F84
- Ports d’entrées et de sorties.
- Temporisation
- Interruptions
- Chien de garde
- Mode sommeil
Ces ressources seront traitées dans la suite du cours.
III. Structure interne du PIC 16F84
III.1. Brochage et caractéristiques principales
Le PIC16F84 est un circuit intégré de 18 broches :
L’alimentation du circuit est assurée par les pattes VDD et VSS. Elles permettent à
l’ensemble des composants électroniques du PIC de fonctionner. Pour cela on relie
VSS (patte 5) à la masse (0 Volt) et VDD (patte 14) à la borne positive de
l’alimentation qui doit délivrer une tension continue comprise entre 3 et 6 Volts.
Le microcontrôleur est un système qui exécute des instructions les unes après les
autres à une vitesse (fréquence) qui est fixée par une horloge interne au circuit. Cette
horloge doit être stabilisée de manière externe au moyen d’un cristal de quartz
connecté aux pattes OSC1/CLKIN (patte 16) et OSC2/CLKOUT (patte 15).
Page19/60
La patte 4 est appelée MCLR. Elle permet lorsque la tension appliquée est égale à
0V de réinitialiser le microcontrôleur. C’est à dire que si un niveau bas (0 Volt ) est
appliqué sur MCLR le microcontrôleur s’arrête, place tout ses registres dans un état
connu et se redirige vers le début de la mémoire de programme pour recommencer le
programme au début (adresse dans la mémoire de programme: 0000).
A la mise sous tension, la patte MCLR étant à zéro, le programme démarre donc à
l’adresse 0000, (MCLR=Master Clear Reset).
Les broches RB0 à RB7 et RA0 à RA4 sont les lignes d’entrées/sorties numériques.
Elles sont au nombre de 13 et peuvent être configurées en entrée ou en sortie. Ce sont
elles qui permettent au microcontrôleur de dialoguer avec le monde extérieur
(périphériques). L’ensemble des lignes RB0 à RB7 forme le port B et les lignes RA0 à
RA4 forment le port A. Certaines de ces broches ont aussi d’autres fonctions
(interruption, timer).
Exemple de PORT A configuré en sortie.
X1
CRYSTAL
C127p
C227p
R1
1KR16
470
D8LED-YELLOW
OSC1/CLKIN16
RB0/INT6
RB17
RB28
RB39
RB410
RB511
RB612
RB713
RA017
RA118
RA21
RA32
RA4/T0CKI3
OSC2/CLKOUT15
MCLR4
U1
PIC16F84A
Exemple de PORT B configuré en entrée.
X1
CRYSTAL
C127p
C227p
R1
1K
R4150
SW4
SW-SPSTOSC1/CLKIN16
RB0/INT 6
RB1 7
RB2 8
RB39
RB4 10
RB5 11
RB6 12
RB7 13
RA0 17
RA118
RA2 1
RA3 2
RA4/T0CKI 3
OSC2/CLKOUT15
MCLR4
U1
PIC16F84A
Page20/60
III.2. Structure interne
La structure interne du PIC16F84 est donnée dans 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 fabricants de
microcontrôleurs)
On retrouve sur ce schéma la mémoire de programme, la mémoire RAM de données,
la mémoire EEPROM, les ports A et B, ainsi que la partie processeur avec l’UAL et le
registre de travail W. Nous allons étudier à présent plus en détail le fonctionnement du PIC.
a. La mémoire de données RAM et EEPROM
Si l’on regarde la mémoire de donnée RAM, on s’aperçoit que celle-ci est un peu
particulière comme le montre la figure ci-dessous : On constate en effet que cette mémoire est
Page21/60
séparée en deux pages (page 0 et page 1). De plus, on remarque que tant pour la page 0 que
pour la page 1, les premiers octets sont réservés (SFR pour Special File Register). Ces
emplacements sont en effet utilisés par le microcontrôleur pour configurer l’ensemble de son
fonctionnement, on les appelle registres spécifiques.
Le bus d’adresse qui permet d’adresser la RAM est composé de 7 fils 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érale ) qui s’étend de l’adresse 0Ch ( 12 en décimale ) jusqu’à 4Fh ( 79 en décimale)
soit au total 68 registres en page 0 et autant en page 1, 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) dans lesquels il peut écrire et
lire à volonté en sachant qu’à la mise hors tension, ces données seront perdues.
Page23/60
Mémoire EEPROM (Electrically Erasable Programmable Read Only Memory)
La mémoire EEPROM est une particularité du PIC 16F84, c’est une zone comportant
64 octets mise à la disposition de l’utilisateur et dont la particularité est de pouvoir être
sauvegardée même en absence d’alimentation.
Cette mémoire peut être très utile pour par exemple : mémoriser le nombre de passage
vers un programme, mémoriser un code défaut, mémoriser une valeur invariable (ex :
π=3.14), mémoriser un code d’accès, mémoriser la version d’un programme, etc… Il est à
noter toutefois que les temps pour accéder à cette mémoire sont relativement longs par rapport
à un accès en RAM par exemple.
La première case de la mémoire EEPROM débute à l’adresse hexadécimale 2100h. Un
code spécifique permet lors du transfert du fichier compilé d’écrire dans la mémoire
EEPROM. Quatre registres spécifiques (EEDATA, EEADR, EECON1 et EECON2)
permettent les accès à l’EEPROM que ce soit en lecture ou en écriture.
b. Les ports d’entrées/sorties
Pour dialoguer avec l’extérieur, le PIC 16F84 vous permet à disposition 13 Entrées-
Sorties programmables individuellement soit en entrée ou en sortie. Ces 13 entrées-sorties
sont réparties en deux ports :
-le port A : RA0 à RA4
-le port B : RB0 à RB7
Chaque ligne peut être configurée soit en entrée, soit en sortie, et ceci
indépendamment l’une de l’autre. Pour cela on utilise les registres TRISA et TRISB. Le bit de
poids faible (b0) du registre TRISA correspond à la ligne RA0, le bit b1 de TRISA
correspond à RA1 et ainsi de suite. Il en est de même pour le port B et le registre TRISB (b0
de TRISB correspond à RB0 b7 correspond à RB7). Si l’on veut placer une ligne en sortie
il suffit de mettre le bit correspond dans TRISA ou TRISB à 0 (retenez 0 comme
Page24/60
Output=sortie). Si l’on veut placer une ligne en entrée, il suffit de placer le bit correspondant
dans TRISA ou TRISB à 1 (retenez 1 comme Input=entrée).
Les bits des deux registres PORTA et PORTB permettent soit de lire l’état d’une ligne
si celle-ci est en entrée, soit de définir le niveau logique d’une ligne si celle-ci est en sortie.
Lors d’un RESET, toutes les lignes sont configurées en entrées.
Port A
Les bits a7 à a5 des registres TRISA et PORTA ne correspondent à rien car il n’y a
que 5 lignes (a0 à a4).
La particularité pour le port A (voir tableau) concerne la ligne RA4 qui peut
être utilisée soit en entrée-sortie, soit en entrée d’horloge pour le timer, nous
revienderons ultérieurement lorsque nous aborderons le timer sur le rôle exact du
fonctionnemenrt de RA4.
Synoptique du port A pour RA0- RA3
Page25/60
Port B
Sur le port B toutes les lignes sont configurable bien sur soit en entrée ou en sortie.
La broche RB0/INT peut être utilisée comme entrée d’interruption (figure ci-dessous),
dans ce cas il est possible de configurer le déclenchement d’une interruption par
rapport à l’état de cette ligne soit sur un front montant ou descendant, tout cela est
configurable par des bits à positionner dans différents registres interne lors de la phase
de programmation.
Les lignes RB4 à RB7 peuvent également êtres utilisées comme entrées d’interruption
(figure cidessous) dans ce cas un changement d’état sur une de ces entrées provoque un
branchement du programme principal vers un sous programme d’interruption ? enfin il existe
un autre particularité des broches RB6 et RB7, en effet celles-ci sont utilisées lors de la phase
de transfert du programme que vous avez réalisé et compilé vers la mémoire programme du
PIC.
Page26/60
Tableau des lignes RB0 - RB7
c. Les registres
La mémoire de données RAM contenait des registres spécifiques qui permettent de
configurer le PIC, nous allons les détailler un à un et voir comment on peut accéder à la page
0 ou la page 1. Afin de faciliter la compréhension, les registres les plus utilisés sont encadrés.
Adresse 00 et 80, INDF. Cette adresse ne contient pas de registre physique, elle sert
pour l’adressage indirect.
Adresse 01, TMR0. Contenu du Timer (8 bits). Il peut être incrémenté par
l’horloge (fosc/4) c'est à dire tous les 4 coups d'horloge ou par la broche RA4.
Adresse 02 et 82, PCL .8 bits de poids faibles du compteur ordinal PC. Les 5 (13-
8) bits de poids forts sont dans PCLATH.
Adresse 03 et 83 , STATUS Registre d’état.
Les cinq bits de poids faible de ce registre sont en lecture seule, ce sont des
témoins caractérisant le résultat de l’opération réalisée par l’UAL à chaque fois que
l’on devra faire un test au cours d’un programme nous allons utiliser sans le savoir le
registre d’état qui est en relation avec le résultat de la dernière opération demandée au
microcontrôleur PIC. C’est un registre qui contient 8 bits ayant chacun un rôle bien
particulier
Les bits de registre d’état :
Page27/60
Bit C (carry) : ce bit de registre d’etat va passer à ‘1’ lorsque le résultat de la
dernière opération arithmétique a provoqué une retenue ;
Bit DC (digit carry) : ce bit de registre d’état va passer à ‘1’ lorsque le résultat
de la drenière opération arithmétique a provoqué une retenue sur les quatres premiers
bits, ce bit sera utilisé lorsque l’on travallera en BCD (binaire codé décimal)
Bit z (zéro) : ce bit de registre d’état va passer à ‘1’ lorsque le résultat de la
dérniere opération est égal à zéro.
Bit PD (power down) : ce bit de registre d’état va passer à ‘0’ lorsque le
microcontroleur rencontre l’instruction particuliere ‘sleep’ (mise en sommeil) qui
determine le mode de mise en veille de PIC en bloquant les impulsions d’horloge
nécessaires au cadencement de tous les échanges, le PIC attend alors un évenement
pour ‘repartir’.
Bit TO (time out) : ce bit du registre d’état va passer à ‘0’ lorsque le chien de
garde interne à attient la fin de comptage que le programmeur lui à définit. Le chien de
garde (ou watch dog) peut être désactivé, il ne servira que lorsque nous voudrons
savoir si le programme se déroule correctement.
RP0 et RP1 : sont deux bits qui permettent d’accéder à deux zones de mémoire
RAM différents (bank 0 et bank 1)
IRP : bit de réserve pour application future, en ce qui conserne le PIC que nous
étudions c’est-à-dire le PIC 16F84 ce bit ne sert pas
Adresse 04 et 84 , FSR . Registre de sélection de registre : contient l’adresse d’un
autre registre (adressage indirect, non utilisé dans le projet)
Adresse 05 , PORTA . Ce registre contient l’état des lignes du port.
Adresse 06 , PORTB . Ce registre contient l’état des lignes du port.
Adresse 08, EEDATA .Contient un octet lu ou à écrire dans l’EEPROM de
données.
Adresse 09, EEADR. Contient l’adresse de la donnée lue ou écrite dans
l’EEPROM de données.
Page28/60
Adresse 0A et 8A, PCLATH . Voir l’adresse 02 PCL.
Adresse 0B et 8B , INTCON .
Contrôle des 4 interruptions
Masques :
GIE : (Global Interrupt Enable) : masque global d’inter.
EEIE : (EEProm Interrupt Enable) autorise l'interruption venant de l'EEPROM.
T0IE : (Timer 0 Interrupt Enable) autorise l'interruption provoquée par le
débordement du TIMER0
INTE: ( Interrupt Enable) autorise l’interruption provoquée par un changement d'état
sur broche RB0/INT
RBIE: (RB Interrupt Enable) autorise les interruptions provoquées par un changement
d'états sur l'une des broches RB4 à RB7.
Si ces bits sont mis à 1, ils autorisent les interruptions pour lesquels ils sont dédiés.
Drapeaux :
T0IF : (Timer 0 Interrupt Flag) débordement du timer
INTF ( Interrupt Flag) interruption provoquée par la broche RB0/INT
RBIF ( RB Interrupt Flag) interruption provoquée par les broches RB4-RB7.
Adresse 81 , OPTION
8 bits (tous à 1 au RESET) affectant le comportement des E/S et des timers.
RBPU/ (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 ).
RTS (Real Timer Source) sélection du signal alimentant le timer 0 : 0 pour horloge
interne, 1 pour RA4/T0CLK
RTE (Real Timer Edge) sélection du front actif du signal timer ( 0 pour front
montant).
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
RBPU/ INTEDG RTS RTE PSA PS2 PS1 PS0
Page29/60
PSA (Prescaler assignment) 0 pour Timer 0 et 1 pour chien de garde WDT.
PS2-0 (Prescaler 210 ) sélection de la valeur du diviseur de fréquence pour les timers.
Adresse 85 , TRISA . Direction des données pour le port A : 0 pour sortir et 1 pour
entrer.
Adresse 86 , TRISB . Direction des données pour le port B : 0 pour sortir et 1 pour
entrer.
Adresse 88 , EECON1 Contrôle le comportement de l’EEPROM de données.
EEIF (EEProm Interrupt Flag) passe à 1 quand l’écriture est terminée.
WRERR (Write Error) 1 si erreur d’écriture.
WREN (Write Enable) : 0 pour interdire l’écriture en EEPROM de données.
WR (Write) 1 pour écrire une donnée. Bit remis automatiquement à 0
RD (Read) : 1 pour lire une donnée. Bit remis automatiquement à 0
Adresse 89 , EECON2 . Registre de sécurité d’écriture en EEPROM de données.
d. 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 tâche, on le décharge en utilisant un timer. Le pic
16F84 dispose de deux timers, un à usage général (le TMR0 ) et un autre utilisé pour le chien
de garde (watch dog WDG ).
Le TMR0 est un compteur ascendant (qui compte) de 8 bits qui peut être chargé avec
une valeur initiale quelconque. Il est ensuite incrémenté à chaque coup d'horloge jusqu'à ce
que le débordement ait lieu (passage de FF à 00); Le principe est représenté figure ci-
dessous :
EEIF WRERR WREN WR RD
Page30/60
Le TMR0 peut remplir deux fonctions:
-Temporisateur ou contrôle du temps. Son entrée d'incrémentation est alors
l'horloge qui correspond au cycle instruction (Fosc/4).
-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 RTS du
registre OPTION.
e. Interruptions
L'interruption est un mécanisme fondamental de tout processeur. Il permet de prendre en
compte des événements extérieurs au processeur et de leur associer un traitement spécifique. Il
faut noter que l'exécution d'une instruction n'est jamais interrompue; c'est à la fin de l'instruction
en cours lors de l'arrivée de l'événement que le sous-programme d'interruption est exécuté.
Dans le cas du PIC 16F84, il existe 4 sources d'interruption:
- INT : Interruption externe, broche RB0/INT
- TMR0 : Fin de comptage
- PORTB : Changement d'état du port B (RB7-RB4)
- EEPROM : Fin d'écriture en EEPROM
f. Pointeur de pile
Le pointeur de pile (stack pointer) est un registre pouvant mémoriser huit adresses
différentes, on dit que le pointeur de pile est à huit niveaux. Le rôle du pointeur de pile
consiste à mémoriser l’adresse courante lorsque le programme principal est dérouté vers un
sous-programme. En effet lors d’un saut vers un sous-programme le compteur de programme
se charge avec l’adresse de celui-ci, lorsque le sous-programme se termine le compteur de
programme doit repointer alors la case mémoire suivant l’instruction de saut (voir figure ci-
dessous) pour pouvoir reprendre le programme principal. Le pointeur de la pile va alors
Page31/60
rechercher automatiquement l’adresse qu’il a mémorisée et il recharge le compteur de
programme avec cette adresse. Le pointeur de pile sera sollicité dès que dans un programme il
y aura un sous-programme. Comme nous le verrons par la suite lors d’un programme
fonctionnant avec une interruption le pointeur de pile aura le même rôle de sauvegarde de
l’adresse courante.
Les huit niveaux du pointeur de pile veulent signifier que l’on peut imbriquer huit sous
programmes. Il est à noter que le pointeur de pile est autonome c-à-d qu’il gère tout seul la
mémorisation et la restitution d’une adresse
Un sous programme est une suite d’instructions correspondant à une fonction bien définie
à laquelle votre programme principal fera appel plusieurs fois. En simplifiant le faite d’écrire
un ou plusieurs sous-programme vous evitera d’écrire plusieurs fois le même chose, d’où une
économie de la place en mémoire programme et bien sur une économie de temps.
g. Chien de garde
Le chien de garde (Watch dog) est un dispositif matériel et logiciel qui permet de se
prémunir contre les plantages accidentels ou le microprocesseur s’arrête ou exécute n’importe
quoi. L’idée est de provoquer un RESET du CPU si le programme ne tourne pas
normalement.
Le PIC16F84 est muni d’un circuit interne qui assure cette fonction sans qu’il soit
besoin de composants extérieurs. Il utilise le timer interne qui par conséquent ne peut plus
dans ce cas être utilisé pour une autre tâche. Lorsque le registre TMR0 atteint 255 un RESET
est appliqué, il faut donc éviter qu’il n’atteigne jamais cette valeur en le mettant à zéro
périodiquement par le programme. Cette remise à zéro est effectuée par l’instruction
CLRWDT.
Page32/60
h. Mode sommeil
Lorsque le PIC n'a rien à faire (par exemple lors de l'attente d'une mesure extérieure), ce
mode est utilisé pour limiter sa consommation : le PIC est mis en sommeil (le programme s'arrête)
jusqu'à son réveil (le programme repart). Ce mode est principalement utilisé pour les systèmes
embarqués fonctionnant sur pile.
La mise en sommeil est réalisée grâce à l'instruction sleep. La séquence suivante est
exécutée :
- Le chien de garde est remis à 0 (équivalent à clrwdt)
- Le bit PD (STATUS.3) est mis à 0
- L'oscillateur est arrêté ; le PIC n'exécute plus d'instruction
i. Principe de fonctionnement du PIC
Un microcontrôleur exécute des instructions. On définit « le cycle instruction »
comme le temps nécessaire à l’exécution d’une instruction. Attention de ne pas confondre
cette notion avec le cycle d’horloge qui correspond au temps nécessaire à l’exécution d’une
opération élémentaire (soit un coup d'horloge).
Une instruction est exécutée en deux phases :
La phase de recherche du code binaire de l’instruction stocké dans la mémoire de
programme
La phase d’exécution ou le code de l’instruction est interprété par le processeur et
exécuté.
Chaque phase dure 4 cycles d’horloge comme le montre la figure ci dessous:
On pourrait donc croire qu’un cycle instruction dure 8 cycles d’horloge mais
l’architecture particulière du PIC lui permet de réduire ce temps par deux. En effet, comme les
instructions issues de la mémoire de programme circulent sur un bus différent de celui sur
lequel circulent les données, ainsi le processeur peut effectuer la phase de recherche d’une
instruction pendant qu’il exécute l’instruction précédente.
Page33/60
j. Déroulement d’un programme
Le déroulement d’un programme s’effectue de façon très simple. A la mise sous
tension, le processeur va chercher la première instruction qui se trouve à l’adresse 0000 de la
mémoire de programme, l’exécute puis va chercher la deuxième instruction à l’adresse 0001
et ainsi de suite (sauf cas de saut ou d’appel de sous programme). On parle de fonctionnement
séquentiel. La figure ci dessous va nous permettre de mieux comprendre le fonctionnement :
Page34/60
On constate sur cette figure 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 l’instruction) grâce à son bus d’instruction. Cet adressage s’effectue à l’aide d’un
compteur ordinal appelé PC qui lors de la mise sous tension démarre à zéro puis
s’incrémente de 1 tous les quatre coups d’horloge, on exécute bien ainsi les
instructions les unes à la suite des autres.
Mais il arrive que dans un programme on fasse appel à un sous programme dont
l’adresse de l’instruction ne se trouve pas juste après celle qui est en train d’être
exécutée. C’est le rôle de la pile qui sert à emmagasiner de manière temporaire
l’adresse d’une instruction. Elle est automatiquement utilisée chaque fois que l’on
appelle un sous programme et elle permet une fois que l’exécution du sous programme
est terminée de retourner dans le programme principal juste après l’endroit où l’on a
appelé le sous programme. On constate que cette pile possède huit niveaux, cela
signifie qu’il n’est pas possible d’imbriquer plus de huit sous programmes, car au-delà
de huit, le processeur ne sera plus capable de retourner à l’adresse de base du
programme principal.
L’adresse 0000 est réservée au vecteur RESET, cela signifie que c’est à cette
position que l’on accède chaque fois qu’il se produit une réinitialisation (0 volts sur la
patte MCLR). C’est pour cette raison que le programme de fonctionnement du
microcontrôleur doit toujours démarrer à cette adresse.
L’adresse 0004 est assignée au vecteur d’interruption et fonctionne de manière
similaire à celle du vecteur de Reset. Quand une interruption est produite et validée, le
compteur ordinal PC se charge avec 0004 et l’instruction stockée à cet emplacement
est exécutée.
k. Mise en œuvre
L’utilisation et la mise en œuvre très simple des PICs les a rendus extrêmement
populaire. Il suffit d’alimenter le circuit par ses deux broches VDD et VSS, de fixer sa vitesse
de fonctionnement à l’aide d’un quartz et d’élaborer un petit système pour permettre de
réinitialiser le microcontrôleur sans avoir à couper l’alimentation
Page35/60
Il suffit ensuite d’écrire le programme en langage assembleur ou en C sur un
ordinateur grâce au logiciel MPLAB de MICROCHIP ou sur MikroC puis de le compiler pour
le transformer en langage machine et le transférer dans le PIC grâce à un programmateur.
Il ne nous reste plus qu’à voir le jeu d’instruction de programmation en assembleur du
PIC et c’est là que réside tout l’intérêt puisqu’il ne dispose que de 35 instructions qui lui
permettent de réaliser toutes les tâches.
Page36/60
Chapitre 4 :
Jeux d’instructions
I. Classement des instructions du PIC Pour simplifier nous allons classer arbitrairement les trente cinq instructions selon
quatre critères qui sont :
+ Instructions de branchement et de contrôle
+ Instructions relatives au registre de travail w
+ Instructions relatives aux registres ‘file’ d’utilisation spéciale ou générale
+ Instructions relatives au traitement sur un bit spécifique d’un registre.
II. Instructions de branchement et de contrôle
Ces instructions concenent en particulier tous les types de branchement, ainsi que les
retours de sous programme et différents mode de fonctionnement, tel que le mode de
sommeil.
II.1 Instruction : CALL
Rôle : Cette instruction sert à exécuter un sous programme. Dès que le PIC rencontre cette
mnémonique le compteur de programme CP se charge avec l’adresse du sous programme à
exécuter, auparavant il y a une sauvegarde de l’adresse courante du CP, en fin de sous
Page37/60
programme une deuxième instruction (RETURN) que nous verrons plus loin sert à revenir à
la position ou était le programme avant d’être dérouté.
Quand doit ’on utiliser cette instruction : Cette instruction sera utilisée lorsque dans votre
programme vous avez réalisé un sous programme et que vous voulez y accéder.
Syntaxe : CALL étiquette
Une étiquette correspond à un mot situé en début de sous programme. Sur MPLAB l’étiquette
se place en début de ligne. L’étiquette correspond à une adresse dans le programme.
Nombre de cycle(s) d’horloge nécessaires : 2
Exemple d’utilisation :
II.2 Instruction : CLRWDT
Rôle : Cette instruction sert à mettre à zéro le watchdog, de sorte de ne pas effectuer un reset
de PIC.
Quand doit ’on utiliser cette instruction : Cette instruction sera utilisée lorsque vous utiliser
le watchdog, celui-ci permet entre autre de vérifier le bon déroulement d’un programme. Si
par exemple votre programme doit impérativement appeler une routine régulièrement et pour
être sur que cette routine est appelée, on place en général le reset du chien de garde dans ce
sous programme, ainsi si le programme est planté il ne passe pas par la routine, le watchdog
n’est pas réanimé et déclenche alors le reset du microcontrôleur.
Syntaxe : CLRWDT
Page38/60
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
II.3 Instruction : GOTO
Rôle : Cette instruction sert à brancher le programme vers une autre adresse, le compteur de
programme charge l’adresse du saut, attention la différence par rapport à l’instruction call est
que l’adresse de retour n’est pas mémorisée dans la pile ce qui fait que le programme continu
à l’endroit de saut (figure ce dessous). Cette instruction sera utilisée principalement avec un
branchement conditionnel qui forcera le saut (goto) si une condition est vraie ou fausse.
Quand doit ’on utiliser cette instruction : Cette instruction sera utilisée lorsque vous testez
une condition, si cette condition est vraie alors on exécute le goto vers un traitement sinon on
continue le traitement en cours.
Syntaxe : GOTO étiquette
Nombre de cycle(s) d’horloge nécessaires : 2
Exemple d’utilisation :
Page39/60
II.4 Instruction : RETFIE
Rôle : Cette instruction doit être utilisée impérativement lorsque votre programme fonctionne
sous interruption. Cette instruction se place en fin de sous programme juste avant le
déclanchement de l’évènement qui a provoqué l’interruption. Nous élaborerons ce genre de
programme dont l’intérêt réside dans le fait qu’à n’importe quel endroit de votre programme
un événement (une interruption) peut dérouter celui-ci pour exécuter une routine (un sous
programme) prioritaire.
Quand doit ’on utiliser cette instruction : uniquement si on utilise les interruptions, elle se
place en fin de sous programme.
Syntaxe : RETFIE
Nombre de cycle(s) d’horloge nécessaires : 2
Exemple d’utilisation :
II.5 Instruction : RETLW
Rôle : Cette instruction est identique à l’instruction RETURN, elle sert en fin de sous
programme à faire revenir le compteur de programme à l’instruction suivant le saut à la
routine (sous programme). L’instruction RETLW permet en plus de charger une valeur dans
le registre de travail W au moment où elle est active.
Page40/60
Quand doit ’on utiliser cette instruction : Dans un programme comportant un sous
programme et lorsque l’on souhaite sortir de la routine avec une valeur qui peut bien sur
dépendre du traitement dans le sous programme.
Syntaxe : RETLW + valeur
Nombre de cycle(s) d’horloge nécessaires : 2
Exemple d’utilisation :
II.6 Instruction : SLEEP
Rôle : Cette instruction met le microcontrôleur en mode sommeil ce qui signifie que
l’oscillateur interne est bloqué et que le programme est arrêté. Pour sortir de ce mode il faut
impérativement une interruption, un signal watchdog ou un reset de PIC.
Quand doit ’on utiliser cette instruction : Dans un programme qui ne travail par exemple
que sur interruption, on peut passer en mode basse consommation avec l’instruction sleep
pour économiser la source d’énergie.
Syntaxe : SLEEP
Nombre de cycle(s) d’horloge nécessaires : 2
Exemple d’utilisation :
Page41/60
III. Instructions concernant le registre de travail W
Ces instructions concernent tous les types de traitement appliqués sur le registre de
travail W
II.1 Instruction : ADDLW
Rôle : Cette instruction additionne le contenu de registre de travail W avec une valeur
immédiate, le résultat est stocké dans W.
Quand doit ’on utiliser cette instruction : Sur le PIC on doit souvent pour accéder à un
registre banalisé passer par un registre W. si on veut additionner une valeur avec un registre
de son choix on utilisera l’instruction ADDLW puis on transférera le contenu dans le registre
banalisé.
Syntaxe : ADDLW + valeur
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
III.2 Instruction : ANDLW
Rôle : Cette instruction fait un ‘et logique’ entre le contenu du registre de travail W et la
valeur immédiate (opérande), le résultat est stocké dans W.
Quand doit ’on utiliser cette instruction : On utilise souvent le ‘ET LOGIQUE’ lorsque
l’on veut sélectionner un ou plusieurs bits d’un registre, on parle de masque.
Syntaxe : ANDLW + valeur
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page42/60
III.3 Instruction : IORLW
Rôle : Cette instruction fait un ‘ou logique’ entre le contenu du registre de travail W et la
valeur immédiate (opérande), le résultat est stocké dans W.
Quand doit ’on utiliser cette instruction : On utilise cette instruction pour par exemple
avoir deux entrées de commandes pour une sortie.
Syntaxe : IORLW + valeur
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
III.4 Instruction : MOVLW
Rôle : Cette instruction charge le contenu du registre W avec une valeur immédiate, l’ancien
contenu est alors écrasé.
Quand doit ’on utiliser cette instruction : cette instruction est énormément utilisée, car le
registre W est comme une plaque tournante de PIC, c’est par lui que l’on accédera à tous nos
registres banalisés (variables) que l’on aura déclaré à l’aide de la syntaxe EQU.
Syntaxe : MOVLW + valeur
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page43/60
III.5 Instruction : SUBLW
Rôle : Cette instruction soustrait le contenu du registre de travail W avec une valeur
immédiate, le résultat est stocké dans W.
Quand doit ’on utiliser cette instruction : sur le PIC on doit souvent pour accéder à un
registre banalisé passer par le registre W. si on veut soustraire une valeur du registre de son
choix on utilisera l’instruction SUBLW puis on transférera le contenu dans le registre banalisé
Syntaxe : SUBLW + valeur
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
III.6 Instruction : XORLW
Rôle : Cette instruction fait un ‘ou exclusif’ entre le contenu du registre de travail W avec une
valeur immédiate, le résultat est stocké dans W.
Quand doit ’on utiliser cette instruction : on utilise cette pour par exemple comparer le
contenu d’un registre avec une valeur
Syntaxe : XORLW + valeur
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
III.7 Instruction : CLRW
Rôle : Cette instruction met le contenu du registre de travail W à zéro.
Quand doit ’on utiliser cette instruction : étant donné que l’on utilise le registre de travail
W, il est dans certain cas nécessaire de partir avec une valeur nulle dans ce registre.
Syntaxe : CLWR
Page44/60
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
IV. Instructions concernant les registres banalisés
Ces instructions concernent tous le type de traitement appliqués sur un registre
banalisé, un registre banalisé peut être par exemple une variable que vous avez déclaré, il peut
y en avoir 68 au maximum, ‘taille de la RAM du PIC’. Chaque registre banalisé posséde une
taille de 8 bits (1 octet)
IV .1 Instruction : ADDWF (ADD W and F)
Rôle : Cette instruction additionne le contenu du registre de travail W avec le contenu d’un
registre banalisé, le résultat est stocké dans W si l’opérande d=0 sinon le résultat sera stocké
dans le registre banalisé
Quand doit ’on utiliser cette instruction : lorsque l’on veut additionner une valeur avec un
registre banalisé.
Syntaxe : ADDWF + f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page45/60
IV.2 Instruction : ANDWF (AND W and F)
Rôle : Cette instruction fait un ‘et logique’ entre le contenu du registre de travail W et le
contenu du registre spécifié f, selon l’opérande, le résultat est soit stocké dans W (d=0), soit
stocké dans le registre (d=1).
Quand doit ’on utiliser cette instruction : on utilise souvent le ‘ET LOGIQUE’ lorsque l’on
veut sélectionner un ou plusieurs bits d’un registre, on parle alors de masque.
Syntaxe : ANDWF + f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
IV.3 Instruction : CLRF (Clear f)
Rôle : Cette instruction met le contenu du registre spécifié d’adresse f à zéro.
Quand doit ’on utiliser cette instruction : Etant donné que l’on utilise souvent les registres
banalisés il est dans certain cas nécessaire de partir avec une valeur nulle dans le registre.
Syntaxe : CLRF f
f : adresse du registre banalisé
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page46/60
IV.4 Instruction : COMF (Complement f)
Rôle : Cette instruction fait une opération de complément sur le contenu du registre spécifié
d’adresse f, en fait les 0 sont remplacés par des 1 et vice versa, selon l’opérande d, le résultat
est soit stocké dans W (d=0), soit stocké dans le registre f (d=1).
Quand doit ’on utiliser cette instruction : lorsqu’ l’on doit réaliser une opération de
complément sur un registre.
Syntaxe : COMF f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
IV.5 Instruction : DECF (Decrement f)
Rôle : Cette instruction fait une décrémentation (contenu -1) sur la valeur du registre spécifié
f, selon l’opérande d, le résultat est soit stocké dans W (d=0), soit stocké dans le registre f
(d=1).
Quand doit ’on utiliser cette instruction : lorsqu’ l’on doit réaliser une soustraction unitaire
sur un registre, pour réaliser une temporisation ou un décomptage par exemple.
Syntaxe : DECF f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Dans l’exemple qui suit nous allons réaliser une temporosation et pour ce faire nous
utilisons l’instruction BTFSS qui détaillé plus loin ainsi que le flag Z du registre STATUS, ce
Page47/60
flag ou bit indique s’il vaut 1 que le résultat de la première opération effectué vaut 0 et vice
versa.
IV.6 Instruction : DECFSZ (Decrement f, skip if zéro)
Rôle : Cette instruction est double, elle fait une décrémentation (contenu -1 comme
l’instruction DECF) sur la valeur du registre spécifié d’adresse f, selon l’opérande d, le
résultat est soit stocké dans W (d=0), soit stocké dans le registre f (d=1), puis teste ensuite si
le contenu du registre spécifié vaut zéro et dans ce cas saute la prochaine instruction.
Quand doit ’on utiliser cette instruction : cette instruction est souvent utilisée pour réaliser
une temporisation ou un décomptage par exemple.
Syntaxe : DECFSZ f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1 ou 2 selon résultat du test
Exemple d’utilisation :
Reprenons l’exemple de la temporisation réalisé avec l’instruction DECF, nous
voyons ici qu’il y a une ligne en moins pour réaliser le même programme.
Page48/60
IV.7 Instruction : INCF (INcrement f, skip if zéro)
Rôle : Cette instruction fait une incrémentation (contenu +1) sur la valeur du registre spécifié
d’adresse f, selon l’opérande d, le résultat est soit stocké dans W (d=0), soit stocké dans le
registre f (d=1).
Quand doit ’on utiliser cette instruction : lorsqu’on doit réaliser une addition unitaire sur
un registre, pour réaliser un compteur, on peut ainsi déterminer par exemple le nombre de
défauts constatés sur une machine.
Syntaxe : INCF f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1 ou 2 selon résultat du test
Exemple d’utilisation :
Page49/60
IV.8 Instruction : INCFSZ (INcrement f)
Rôle : Cette instruction est semblable à DECFSZ, elle fait une incrémentation (contenu +1,
comme l’instruction INCF) sur la valeur du registre spécifié d’adresse f, selon l’opérande d, le
résultat est soit stocké dans W (d=0), soit stocké dans le registre f (d=1), puis teste ensuite si
le contenu du registre spécifié vaut zéro et dans ce cas saute la prochaine instruction
Quand doit ’on utiliser cette instruction : cette instruction est souvent utilisée pour réaliser
une temporisation ou un comptage par exemple.
Syntaxe : INCFSZ f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1 ou 2 selon résultat du test
Exemple d’utilisation :
Dans cette exemple nous allons faire une boucle (ou une temporisation) de 256 tops
d’horloge, puis quand le contenu du registre (8bits) est à 255 et qu’on lui ajoute +1 il revient à
zéro.
Page50/60
IV.9 Instruction : IORWF (Inclusive OR W with F)
Rôle : Cette instruction fait un ‘ou logique’ entre le contenu du registre de travail W et le
contenu du registre spécifié d’adresse f, selon l’opérande d, le résultat est soit stocké dans W
(d=0), soit stocké dans le registre f (d=1).
Quand doit ’on utiliser cette instruction : on utilise cette instruction pour réaliser par
exemple un ou logique entre le registre W et une valeur qui n’est pas figée et qui dépend du
contenu d’un registre
Syntaxe : IORLW f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page51/60
IV.10 Instruction : EXORWF (EXclusive OR W with F)
Rôle : Cette instruction fait un ‘ou exclusif’ entre le contenu du registre de travail W et le
contenu du registre spécifié d’adresse f, selon l’opérande d, le résultat est soit stocké dans W
(d=0), soit stocké dans le registre f (d=1).
Quand doit ’on utiliser cette instruction : souvent pour comparer le contenu de deux
registres on utilise un ou exclusif, si le résultat vaut 0 alors les contenus des registres sont
identiques.
Syntaxe : IORLW f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
IV.11 Instruction : MOVF (Move f)
Rôle : Cette instruction copie le contenu du registre spécifié d’adresse f sur lui-même ou bien
dans le registre W, selon l’opérande d, le résultat est soit stocké dans W (d=0), soit stocké
dans le registre f (d=1). Le fait de copier un registre sur lui-même peut apparaitre absurde
mais cela permet entre autre de tester le flag z (zéro) du registre d’état et ainsi permettre de
savoir si le contenu du registre vaut zéro.
Quand doit ’on utiliser cette instruction : une utilisation peut être envisagée lorsqu’on veut
copier un registre banalisé vers un deuxième registre de même type, dans un premier temps on
copie le registre dans le registre de travail W (MOVF registre W) puis ensuite on transfert le
contenu du registre de travail W vers le registre de destination avec l’instruction MOVWF.
Syntaxe : IORLW f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Page52/60
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
IV.12 Instruction : MOVWF (Move w to f)
Rôle : Cette instruction copie le contenu du registre de travail W vers le registre spécifié
d’adresse f.
Quand doit ’on utiliser cette instruction : cette instruction sera souvent utilisée c’est elle
qui permettra de charger une valeur dans un registre. Encore une fois nous voyons que le
registre de travail W a une place importante dans le PIC.
Syntaxe : MOVWF f
f : adresse du registre banalisé
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation : voir exemple précédent (instruction MOVF)
IV.13 Instruction : NOP (No oPération)
Rôle : Cette instruction ne réalise aucune opération.
Quand doit ’on utiliser cette instruction : cette instruction est particulièrement utilisée
lorsque l’on veut introduire un retard dans un programme, tout en sachant que l’instruction
NOP prend un cycle machine.
Syntaxe : NOP
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Notre applicarion est cadensée avec un quartz de 4MHz, il faut savoir qu’en interne le PIC
divice la fréquence du quartz par 4 ce qui fait une horloge à 1MHz, donc un cycle machine
Page53/60
dure 1 micro seconde (1us) . nous souhaitons avoir une temporisation (ou un retard) dans une
boucle de programme de 5us, pour ce faire nous allons insérer 5 instructions de type NOP.
Toutefois pour des temporisations très longues il est bien certain que l’on n’utilisera pas ce
genre d’artifice, il faudra réaliser une temporisation avec le décomptage d’un registre par
exemple.
IV.14 Instruction : RLF (Rotate Left f throught carry)
Rôle : Cette instruction exécute une rotation à gauche du contenu du registre spécifié
d’adresse f, le bit situé le plus à gauche est transféré dans la carry et la valeur précédente de la
carry est transféré dans le bit 0 du registre. Selon l’opérande d, le résultat est soit stocké dans
W (d=0), soit stocké dans le registre f (d=1).
Quand doit ’on utiliser cette instruction : il y a des nombreuses applications pour cette
instruction, allant d’un simple chenillard a une multiplication par 2 par exemple.
Syntaxe : RLF f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page54/60
IV.15 Instruction : RRF (Rotate Right f throught carry)
Rôle : Cette instruction exécute une rotation à droite du contenu du registre spécifié d’adresse
f, le bit situé le plus à doite est transféré dans la carry et la valeur précédente de la carry est
transféré dans le bit 0 du registre. Selon l’opérande d, le résultat est soit stocké dans W (d=0),
soit stocké dans le registre f (d=1).
Quand doit ’on utiliser cette instruction : il y a des nombreuses applications pour cette
instruction, allant d’un simple chenillard a une multiplication par 2 par exemple.
Syntaxe : RRF f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page55/60
IV.16 Instruction : SUBWF (SUBstract W from F)
Rôle : Cette instruction exécute une soustraction entre le contenu du registre spécifié
d’adresse f et le contenu du registre W, selon l’opérande d, le résultat est soit stocké dans W
(d=0), soit stocké dans le registre f (d=1).
Quand doit ’on utiliser cette instruction : on utilise cette instruction pour réaliser par
exemple une soustraction conditionnelle, la valeur à soustraire est dynamique car est peut
évoluer, c’est en fait le contenu d’un registre.
Syntaxe : SUBWF f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page56/60
IV.17 Instruction : SWAPF (SWAP nibbles in F)
Rôle : Cette instruction permet d’échanger les quatre bits de poids faible par les quatre bits de
poids fort du contenu du registre spécifié d’adresse f, selon l’opérande d, le résultat est soit
stocké dans W (d=0), soit stocké dans le registre f (d=1).
Quand doit ’on utiliser cette instruction : on utilise souvent cette instruction lorsqu’on
travaille sous interruption afin de sauvegarder le registre STATUS (registre d’état) car
l’instruction SWAPF à la particularité de n’affecter aucun flag du registre d’état.
Syntaxe : SWAPF f,d
f : adresse du registre banalisé
d : direction pour le stockage du résultat (0= résultat dans W, 1= résultat dans le registre
banalisé dont l’adresse est f)
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
V. Instructions sur un bit d’un registre
V.1 Instruction : BCF (bit Clear F)
Rôle : Cette instruction permet de faire une RAZ du bit indiquer (0 à7) du spécifié d’adresse
f.
Quand doit ’on utiliser cette instruction : cette instruction est très utilisée elle permet de
travailler rapidement sur un bit d’un registre sans modifier le reste de registre.
Syntaxe : BCF f,b
f : adresse du registre banalisé
Page57/60
b : numéro du bit à remettre à zéro, ce nombre est compris entre 0 et 7.
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
V.2 Instruction : BSF (bit Set F)
Rôle : Cette instruction permet de faire une mise à ‘1’ du bit indiquer (0 à7) du spécifié
registre d’adresse f.
Quand doit ’on utiliser cette instruction : cette instruction est très utilisée elle permet de
forcer rapidement à ‘1’ la valeur d’un bit d’un registre sans modifier le reste de registre.
Syntaxe : BSF f,b
f : adresse du registre banalisé
b : numéro du bit à remettre à ‘1’, ce nombre est compris entre 0 et 7.
Nombre de cycle(s) d’horloge nécessaires : 1
Exemple d’utilisation :
Page58/60
V.3 Instruction : BTFSC (bit Test F Skip if Clear)
Rôle : Cette instruction permet de faire un test du bit indiqué (0 à7) du spécifié registre
d’adresse f et de sauter la prochaine instruction si la valeur de bit vaut zéro.
Quand doit ’on utiliser cette instruction : cette instruction est très puissante est utilisée
pour faire des branchements conditionnels, on oriente le programme selon la valeur du bit
testé. Par exemple on peut tester l’état d’un bit d’un port configuré en entrée, sur lequel est
connecté un interrupteur, tant que cet interrupteur est actionné le programme ne démarre pas
(interrupteur type ‘coup de poing’ par exemple) elle permet de forcer rapidement à ‘1’ la
valeur d’un bit d’un registre sans modifier le reste de registre.
Syntaxe : BTFSC f,b
f : adresse du registre banalisé
b : numéro du bit à remettre à zéro, ce nombre est compris entre 0 et 7.
Nombre de cycle(s) d’horloge nécessaires : 1 ou 2 ( selon le résultat de test)
Exemple d’utilisation :
Un interrupteur est connecté sur le port A sur la broche RA0 (bit 0 du port A) on démarre le
programme uniquement si l’inter est ouvert
Page59/60
V.4 Instruction : BTFSS (bit Test F Skip if Set)
Rôle : Cette instruction permet de faire un test du bit indiqué (0 à7) du spécifié registre
d’adresse f et de sauter la prochaine instruction si la valeur de bit vaut ‘1’.
Quand doit ’on utiliser cette instruction : cette instruction est très puissante est utilisée
pour faire des branchements conditionnels, on oriente le programme selon la valeur du bit
testé. Par exemple on peut tester l’état d’un bit d’un port configuré en entrée, sur lequel est
connecté un interrupteur, tant que cet interrupteur est actionné le programme ne démarre pas.
Syntaxe : BTFSS f,b
f : adresse du registre banalisé
b : numéro du bit à remettre à zéro, ce nombre est compris entre 0 et 7.
Nombre de cycle(s) d’horloge nécessaires : 1 ou 2 ( selon le résultat de test)
Exemple d’utilisation :
Un interrupteur est connecté sur le port A sur la broche RA0 (bit 0 du port A) on démarre le
programme uniquement si l’inter est actionné.