Microcontrolleurs

60
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)

description

Cours

Transcript of Microcontrolleurs

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.

Page22/60

STATUS STATUS

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

Page60/60

JEU D'INSTRUCTION