Vous êtes sur la page 1sur 142

1

Pierre LOGLISCI

Le microcontrleur PIC 16F84

Edition de lAuteur

Cet ouvrage est la proprit de lAuteur. Il est protg par les Lois sur le Copyright. Aucune partie de ce livre ne peut tre reproduite, sous aucune forme ou par un quelconque procd (lectronique, photocopie, CD ou autre), sans lautorisation crite de lAuteur. La bible pour dsassembler la main est une nouveat mondiale, ide originale de lAuteur.

- Le nom et le logo MICROCHIP sont des Marques dposes de MICROCHIP Technology Inc. - Arizona - USA - PIC, PICmicro, PICMASTER, PICSTART Plus, PROMATE 2, MPASM, MPLAB, MPLAB-ICE, MPLAB-IDE, MPLIB et MPLINK sont des Marques de MICROCHIP - WINDOWS, MICROSOFT et MICROSOFT INTERNET EXPLORER sont des Marques dposes de MICROSOFT - PicBASIC est une Marque dpose de Micro Engineering Labs

Ddicace
Lorsque ce travail ntait quun manuscrit, mon plus grand problme fut de savoir comment faire pour lui donner une forme dactylographique acceptable pour tre lu par tous. Je navais que trs peu de connaissances en ce qui concerne lutilisation du clavier, des logiciels de traitement de texte et dimages, et du scanner... Je ne savais pas comment crer les indispensables tableaux, ni comment accder aux caractres spciaux.... Je navais aucune exprience de composition et de mise en page... Bref : je ne savais pas comment my prendre pour faire en sorte quun tas de feuilles gribouilles la main deviennent un livre... Si jy suis parvenu, cest grce laide spontane et constante que ma apporte ma fille Elodie qui - comme un guide de haute montagne - ma prcd dans la difficile ascension en mouvrant des chemins faciles et srs, toujours en se mettant ma place, dosant les difficults la mesure de leffort quelle savait que jtais capable de fournir . Sans jamais faire de concessions, elle sest de nombreuses fois oblige chercher - chez elle, sur son propre PC - les solutions pratiques aux problmes que je lui soumettais, au fur et mesure quils se prsentaient.

Cest elle que je ddicace ce livre.

Pour son aide, bien sr ; mais aussi pour les constants encouragements rpts quelle ma donns, lenthousiasme quelle a partag avec moi pendant tout le temps que jai consacr au projet, et son doux sourire, dont elle mentoure encore.

Avant-propos
Bien quil existe une dj abondante littrature sur les microcontrleurs PIC en gnral, lamateur qui veut sattaquer une ralisation personnelle utilisant le modle 16F84 ny arrive quau prix de gros efforts. Ceci cause du fait quil y a plusieurs modles de PIC qui, tout en possdant la mme philosophie, diffrent sensiblement lun de lautre (par le nombre dinstructions, le nombre de pages mmoire, le nom des registres, la prsence ou labsence de ressources internes...) et droutent celui qui en entreprend ltude pour la premire fois. Or, si les ouvrages traitant les microcontrleurs PIC en gnral sont nombreux, aucun naborde le 16F84 en particulier. Dans ces conditions, le lecteur qui ne sintresse qu ce modle exclusivement, doit se livrer tout un travail pour sparer ce qui est important et ncessaire (parce que a concerne le 16F84) de ce qui est superflu (parce que a ne concerne pas le 16F84 mais se rfre dautres modles). Aussi jai condens dans cet ouvrage les seules notions pratiques ncessaires pour aborder un montage personnel base de 16F84. Il y a plusieurs raisons cela. En premier lieu, ce modle possdant une mmoire EEPROM effaable lectriquement, simpose comme la solution idale pour ceux qui veulent apprendre utiliser un microcontrleur PIC, du fait quil est reprogrammable jusqu plus de 1.000 fois (selon les spcifications du fabricant). Associ de simples organes priphriques, il reprsente loutil dapprentissage par excellence, car le lecteur peut tester tous les programmes avec le mme microcontrleur et revenir sur les erreurs, les corriger et rapidement re-tester lapplication.

6 Ce microcontrleur possde un fusible interne, accessible par programmation, quil faudra se garder de laisser intact. Car lorsque ce fusible a t brl, le microcontrleur, sil peut encore tre effac et reprogramm, ne peut plus tre lu correctement , car sa mmoire est restitue compltement dsorganise. Bien utile pour ceux qui mettent au point une application commerciale quils veulent protger et mettre labri de copies sauvages, ce fusible doit tre ignor pendant la dure de ltude. Cette accessibilit permanente de la mmoire reprsente laspect le plus original de tous les microcontrleurs mmoire flash, parmi lesquels trne le 16F84. De plus, la capacit mmoire de ce modle (ni trop petite ni trop grande) le prdestine comme le compromis idal non seulement pour lauto-apprentissage, mais aussi pour les premires applications personnelles que chacun aura envie dinventer. Car, sil est incontestable quon peut parvenir la ralisation dun grand nombre de dispositifs en tlchargeant programmes et circuits imprims partir des nombreux sites consacrs aux microcontrleurs, dans ce domaine particulier de la microlectronique seules les capacits personnelles comptent. Cest pourquoi ce livre sadresse tout particulirement qui veut vraiment prendre ... dans une main le PIC 16F84 ... et dans lautre les indispensables outils de dveloppement et... le fer souder ! Les seules connaissances exiges pour en aborder la lecture sont les bases fondamentales de llectronique gnrale et de llectronique logique. Un avertissement tout de mme - sil tait ncessaire - consiste rappeler que pour matriser la ralisation dun montage incorporant un microcontrleur 16F84 il faut disposer dun ordinateur et dun outil de dveloppement (pouvant tre soit une copie de lassembleur MPLAB que Microchip distribue gratuitement sur son site Internet, soit un compilateur BASIC). Nous verrons ceci plus loin, dans la section traitant de la programmation.

Du contrleur au microcontrleur
Pour le dire avec des mots simples, un contrleur est un dispositif qui - plac au cur dun processus - surveille lvolution dun vnement et compare son tat (ou sa valeur) une donne prdtermine, pour intervenir ds que les limites prfixes sont atteintes. De ce point de vue, un contrleur nest pas forcment lectronique. Il peut tre mcanique, pneumatique, thermique, etc.. Son travail consiste surveiller (lire) la valeur dune situation, et la comparer en permanence une valeur fixe davance. Lorsquil y a une diffrence entre la valeur lue et celle fixe, le contrleur gnre une commande qui - envoye un endroit appropri du processus rduit cette diffrence ou ramne les choses la normale. Aussi, un thermostat dambiance ou la valve de scurit installe sur le couvercle dune cocotte-minute, sont des exemples de contrleurs simples. Un contrleur peut accomplir une ou plusieurs tches la suite. Les plus souples de tous les contrleurs sont videmment les contrleurs faisant appel llectronique, et plus particulirement les microcontrleurs. La surveillance de la valeur dune situation se fait alors au moyen dune ou plusieurs lignes dacquisition de donnes configures en entres, tandis que lenvoi de commandes se fait au moyen dune ou plusieurs lignes configures en sorties. Lensemble des tches confies un microcontrleur sappelle programme.

Le microcontrleur 16F84
Prsentation gnrale
Ce modle de PIC (Programmable Interface Controler) est un circuit de petite taille, fabriqu par la Socit amricaine Arizona MICROCHIP Technology. En le regardant pour la premire fois, il fait davantage penser un banal circuit intgr logique TTL ou MOS, plutt qu un microcontrleur. Son botier est un DIL (Dual In Line) de 2x9 pattes. En dpit de sa petite taille, il est caractris par une architecture interne qui lui confre souplesse et vitesse incomparables. Ses principales caractristiques sont : - 13 lignes dentres/sorties, rparties en un port de 5 lignes (Port A) et un port de 8 lignes (Port B) - alimentation sous 5 Volts - architecture interne rvolutionnaire lui confrant une extraordinaire rapidit - une mmoire de programme pouvant contenir 1.019 instructions de 14 bits chacune (allant de ladresse 005 ladresse 3FF) - une mmoire RAM utilisateur de 68 emplacements 8 bits (de ladresse 0C ladresse 4F) - une mmoire RAM de 2x12 emplacements rserve aux registres spciaux - une mmoire EEPROM de 64 emplacements - une horloge interne, avec pr diviseur et chien de garde - possibilit dtre programm in-circuit, cest dire sans quil soit ncessaire de le retirer du support de lapplication - vecteur de Reset situ ladresse 000 - un vecteur dinterruption, situ ladresse 004 - bus dadresses de 13 lignes - prsence dun code de protection permettant den empcher la duplication - facilit de programmation - simplicit - faible prix .

Brochage du PIC 16F84 (C vu de dessus)

10

Le cortge des invariants

Indpendamment de ce quon veut faire de ses 13 lignes (que lon dfinit par lignes dentre/sortie) et quelle que soit lapplication laquelle on le destine, un microcontrleur PIC 16F84, pour pouvoir fonctionner, a ncessairement besoin de : - une alimentation de 5 Volts ; - un quartz et deux condensateurs (si un pilotage prcis par base de temps quartz est ncessaire), ou une rsistance et un condensateur (pour une base de temps de type RC, conomique, utilisable dans les cas ne demandant pas une extrme prcision de cadencement) ; - un condensateur de dcouplage (pour rduire les transitoires se formant invitablement dans tout systme impulsionnel) ; - un bouton poussoir et une rsistance, pour la mise en place dune commande de Reset. Ces lments - quil convient de considrer comme des invariants devant ncessairement figurer dans tout montage - reprsentent le cortge obligatoire de tout microcontrleur PIC 16F84, de la mme faon pourrais-je dire - quun transistor demande, pour fonctionner, une rsistance de Base et une rsistance de Collecteur. Les applications type sont celles des deux pages suivantes :

11

1) Pilotage par quartz

12

2) Pilotage par oscillateur RC

13

Les Entres/Sorties
A part les cinq pins rserves au cortge des invariants devant ncessairement figurer dans tout montage, les treize autres pins du 16F84 servent dentres/sorties. Elles sont regroupes en deux ports : Port A et Port B. Le Port A possde 5 lignes, nommes: RA0..........pin 17 RA1..........pin 18 RA2..........pin 1 RA3..........pin 2 RA4..........pin 3 (RA4/T0CKI) (NB : RA = Register A) Le Port B possde 8 lignes, nommes: RB0..........pin 6 (RB0/INT) RB1..........pin 7 RB2..........pin 8 RB3..........pin 9 RB4..........pin 10 RB5..........pin 11 RB6..........pin 12 RB7..........pin 13 (NB : RB = Register B) A remarquer que RB0 (pin 6) et RA4 (pin 3), outre qu pouvoir servir dentres/sorties, selon la faon dont on les programme peuvent respectivement servir lune comme entre dinterruption et lautre comme entre dhorloge externe pour le pilotage du timer (TMR0).

14

Organisation de la mmoire du PIC 16F84


La mmoire du PIC 16F84 est rpartie en trois espaces, logs sur la mme pastille de silicium : 1) Une mmoire EEPROM de type flash, de 1 K mots de 14 bits, allant de ladresse 000 ladresse 3FF. Cet espace est dnomm mmoire de programme, dont le plan est le suivant : 5 adresses rserves au C (adresses que je conseille de sauter)
000 Vecteur de Reset 001 002

003
004 Vecteur dInterruption 005

Dbut du programme utilisateur

. . 1019 adresses restantes, disponibles pour y loger les instructions de votre programme

. . . . Fin de lespace mmoire disponible

3FF

15 Cette mmoire est celle dans laquelle le programmateur crit les instructions du programme. Dans cet espace mmoire, les cinq premires adresses (000, 001, 002, 003, et 004) sont rserves au microcontrleur. Certaines dentre elles sont particulirement remarquables : a) ladresse 000 correspond au vecteur de Reset. A la mise sous tension, ou chaque fois que des instructions spcifiques lobligent, le Program Counter (PC) se rend cette adresse et cest l que le systme trouve la premire instruction excuter. Cest une case devant obligatoirement tre remplie et contenir lorigine du programme (ORG). Si cette adresse tait vide, le microcontrleur ne ferait rien, car aucun programme ne serait excut. b) ladresse 004 correspond au vecteur dinterruption. Cest ladresse point de rencontre dfinie par le fabricant, laquelle systme et utilisateur se rendent lorsquun problme surgit, pour se dire ce quil se passe et quel sont les remdes durgence apporter.

2) une mmoire de donnes (Data Memory) EEPROM flash, de 64 emplacements 8 bits, allant de ladresse 00 ladresse 3F, auxquels on accde uniquement par lintermdiaire de quatre registres spciaux: -EEADR (EEprom ADRess) pour ce qui concerne les adresses - EEDATA (EEprom DATA) pour ce qui concerne les donnes - EECON1 (EEprom CONtrol) permettant de dfinir le - EECON2 mode de fonctionnement de cette mmoire. Pour lire dans cette mmoire, les tapes suivre sont les suivantes : 1) on crit ladresse dans le registre EEADR ; 2) on met 1 le bit 0 (RD : Read Data) du registre EECON1 (ce qui provoque le transfert de la donne dans le registre EEDATA) ; 3) on lit la donne dans le registre EEDATA o elle est devenue disponible.

16 Exemple : on veut lire le contenu de lemplacement mmoire 03 : BCF MOVLW MOVWF BSF BSF BCF STATUS,RP0 03 EEADR STATUS,RP0 EECON1,0 STATUS,RP0

A partir de ce moment, ayant autoris le mode lecture , la donne contenue ladresse 03 est disponible dans le registre EEDATA, et on peut lutiliser comme on veut. Ainsi, par exemple, on veut lire une donne en EEPROM et la porter dans le registre W : BCF MOVLW MOVWF BSF BSF BCF MOVF STATUS,RP0 adresse dont on veut lire le contenu EEADR STATUS,RP0 EECON1,0 STATUS,RP0 EEDATA,W

Voyons maintenant comment crire une donne en EEPROM : BCF BCF MOVLW MOVWF MOVLW MOVWF BSF BCF BSF MOVLW MOVWF MOVLW MOVWF STATUS,RP0 INTCON,7 donne que lon veut crire EEDATA adresse EEADR STATUS,RP0 EECON1,4 EECON1,2 55 EECON2 AA EECON2

17 BSF BCF BSF BCF EECON1,1 EECON1,2 INTCON,7 STATUS,RP0

Cette squence montre que pour crire dans cette mmoire, les tapes suivre sont un peu plus complexes, car on est oblig de passer dabord par EECON2 avant de confirmer la donne par EECON1 : 1) on interdit les interruptions ; 2) on crit la donne dans le registre EEDATA ; 3) on crit ladresse dans le registre EEADR ; 4) on configure le registre EECON1 5) on envoie la squence dfinie par Microchip (55 et AA) 6) on reconfigure les registres EECON1, INTCON et STATUS. Voyons les choses plus en dtail au moyen dun autre exemple montrant lcriture dune donne (par exemple : 13) une certaine adresse (par exemple : 1F) : EEDATA EEADR EECON1 EECON2 INTCON EQU EQU EQU EQU EQU BCF MOVLW MOVWF MOVLW MOVWF BSF BCF BSF MOVLW MOVWF MOVLW MOVWF BSF BCF BSF BCF 08 09 88 89 0B INTCON,7 13 EEDATA 1F EEADR STATUS,RP0 EECON1,4 EECON1,2 55 EECON2 AA EECON2 EECON1,1 EECON1,2 INTCON,7 STATUS,RP0

18 3) Une mmoire RAM 8 bits, que Microchip appelle Register File, rserve aux donnes. A plus proprement parler, il sagit dune RAM statique (SRAM). Cet espace est son tour rparti en deux zones : a) une zone RAM de 24 emplacements 8 bits rserve aux registres spciaux, dont 12 situs en Page 0 (adresses 00 0B) et 12 situs en Page 1 (adresses 80 8B) selon la mappe suivante : Page 0 Adressage indirect TMR0 PCL STATUS FSR PORT A PORT B EEDATA EEADR PCLATH INTCON Page 1 Adressage indirect OPTION PCL STATUS FSR TRIS A TRIS B EECON1 EECON2 PCLATH INTCON

00 01 02 03 04 05 06 07 08 09 0A 0B

80 81 82 83 84 85 86 87
88

89 8A 8B

Ces registres - auxquels on accde en programmant le bit 5 (RP0) du registre STATUS - servent contrler le fonctionnement de nombreux organes internes au PIC. Nous y reviendrons plus en dtail; b) une zone RAM de donnes, constitue de 68 emplacements 8 bits (adresses de 0C 4F) situs juste au dessous des registres spciaux, formant la RAM utilisateur proprement dite, selon la mappe dtaille ciaprs : 0C 0D 0E 0F 10

19 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 32 33 34 35 36 37 38 39 3A

20 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F Lors de la programmation il faut toujours indiquer ladresse de la zone RAM partir de laquelle le C doit commencer crire, ainsi que le nombre demplacements rserver pour chaque variable. Comme ceci, par exemple : Compteur ORG RES OC 3

Ce qui revient dire : rserve trois emplacements la variable Compteur, dans lordre suivant : Compteur ladresse 0C Compteur+1 ladresse 0D Compteur+2 ladresse 0E . Ainsi, par exemple : pour effacer les donnes de ladresse OE, on crira : CLRF Compteur+2.

21 4) et enfin une toute petite mmoire EEPROM, contenant seulement 8 cases, de ladresse 2000 ladresse 2007, rserves au microcontrleur. Les adresses 2000, 2001, 2002 et 2003 correspondent aux emplacements dans lesquels lutilisateur peut stocker un code didentification (en nutilisant que les quatre bits de poids faible de chacun de ces mots 14 bits). Ladresse 2007 correspond au registre de configuration du microcontrleur. Lui aussi mot de 14 bits, dont les cinq premiers seulement sont utilisables :
4 3 2 1 0

CP

PWRTE

WDTE

FOSC1

FOSC0

- Bit 0 - FOSC0 (OSCillateur zro) et - Bit 1 - FOSC1 (OSCillateur un) sont programmer en fonction du type doscillateur utilis, conformment aux spcifications du tableau suivant: FOSC1 0 0 1 1 FOSC0 0 1 0 1 Type doscillateur Caractristiques LP (Low Power) Quartz jusqu 200 KHz XT Quartz (XT ou 4) MHz HS (High Speed) jusqu 20 MHz RC RC jusqu 4 MHz

- Bit 2 - WDTE (Watch-Dog Timer Enable) 1 = autorise le chien de garde 0 = nautorise pas le chien de garde - Bit 3 - PWRTE (PoWeR Timer Enable) Le C possde un timer permettant de retarder de 72 ms le lancement du programme aprs la mise sous tension du circuit. 1 = le C attend 72 ms 0 = le C dmarre tout de suite

22 - Bit 4 - CP (Code Protection) 1 = pas de protection (le C pourra tre lu correctement) 0 = avec protection (le C ne pourra plus tre lu correctement. Le contenu de la mmoire sera dsorganis).

23

Les registres spciaux


Nous avons dit que dans lespace mmoire RAM que Microchip appelle Register File, une zone est rserve aux registres spciaux. Le mot registre est utilis ici pour dsigner un emplacement mmoire, tandis que le mot file signifie groupement. Certains de ces registres sont situs en Page 0 entre les adresses 00 et 0B, et dautres sont situs en Page 1 entre les adresses 80 et 8B. Quelques-uns dentre eux figurent mme dans les deux pages (Page 0 et Page 1) pour en faciliter laccs. Ils ont des noms et des usages spcifiques, et servent commander le microcontrleur. Il y en a 16 en tout, et sont si importants quils conditionnent vritablement la programmation. Ils sont utiliss constamment, et constamment tenus prsents dans la tte du programmeur. Celui qui veut crire ne ft-ce quun petit programme de quelques lignes, ne peut pas les ignorer. Cest pourquoi ils doivent tre tudis et connus fond. Examinons-les en dtail, un par un, par ordre alphabtique.

24

EEADR (EEprom ADRess)


Registre dans lequel on crit ladresse de la mmoire de donnes EEPROM (mmoire flash de 64 octets, allant de ladresse 00 ladresse 3F) laquelle on veut accder pour y lire ou pour y crire. Contrairement lEEPROM de programme qui - en plus de la tension dalimentation du microcontrleur - ncessite une tension externe pour la programmation, cette EEPROM fonctionne avec la seule tension dalimentation, dans toute sa plage.

25

EECON1 (EEprom CONtrol 1)


Registre de contrle permettant de dfinir le mode de fonctionnement de la mmoire de donnes EEPROM (mmoire flash de 64 octets, allant de ladresse 00 ladresse 3F). Registre 8 bits, mais dont 5 seulement sont utiliss:
7 6 5 4 3 2 1 0

EEIF

WRERR WREN

WR

RD

Bit 0 : RD (ReaD) Normalement 0. Il se met dans cet tat de lui-mme. Le programmeur ne peut y crire que un 1. Naccepte pas dtre programm zro. Bit 1 : WR (WRite) Normalement 0. Il se met dans cet tat de lui-mme. Le programmeur ne peut crire que un 1. Naccepte pas dtre programm zro. Bit 2 : WREN (WRite ENable) Mis zro, interdit toute criture en mmoire. Mis 1, autorise une criture en mmoire. Bit 3 : WRERR (WRite ERRor) Flag derreur. Normalement zro. Passe 1 pour signaler quune erreur sest produite juste au moment o une criture tait en cours (Celle-ci na pu aboutir parce quun vnement inopin sest produit ; par exemple un Reset). Bit 4 : EEIF (EEprom Interrupt Flag) Flag dinterruption. Il est automatiquement mis 1 lorsque la programmation de lEEPROM de donnes est termine. Doit tre mis zro par programmation.

26

EECON2 (EEprom CONtrol 2)


Registre nayant aucune consistance physique, et dont le seul rle consiste obliger le programmeur vrifier les donnes quil envoie dans lEEPROM.

27

EEDATA (EEprom DATA)


- Pendant une opration de lecture : registre dans lequel est disponible la donne quon est all chercher une certaine adresse de la mmoire EEPROM. - Pendant une opration dcriture : registre dans lequel on place la donne quon veut y crire.

28

FSR (File Select Register)


Sert slectionner la mmoire de donnes, pour pouvoir y accder.

29

INTCON (INTerrupt CONtrol)


Est le registre qui prside au fonctionnement des interruptions. Dans le 16F84 il y a quatre sources possibles dinterruptions. Chaque fois que lune delles surgit, le microcontrleur (aprs avoir not dans la pile ladresse de retour) abandonne momentanment (interrompt) le programme quil avait en cours dexcution et saute ladresse 004 (adresse prdfinie par le fabricant, de la mme faon que ladresse 000 a t prdfinie pour la fonction Reset). En lisant le contenu de ce registre, on peut dterminer la provenance de la demande dinterruption et aiguiller le programme de manire y rpondre de faon adquate. Linterruption peut tre commande soit par un flanc montant, soit par un flanc descendant : cela dpend de la faon dont on a pralablement programm le bit 6 (INTEDG) du registre OPTION : 1 = linterruption est gnre lapparition dun front montant ; 0 = linterruption est gnre lapparition dun front descendant. Les quatre sources dinterruption possibles sont : 1) la fin dune programmation de lEEPROM de donnes ; 2) le dbordement du timer interne ; 3) une commande externe applique sur la pin 6 (RB0/INT) ; 4) un changement dtat sur lune des pins 10, 11, 12 ou 13 (respectivement RB4, RB5, RB6, RB7). Dans ce cas, seule une configuration des lignes en entre peut donner lieu une ventuelle demande dinterruption.

30 Examinons un par un chacun des bits de ce registre :


7 6 5 4 3 2 1 0

GIE

EEIE

TOIE

INTE

RBIE

TOIF

INTF

RBIF

Bit 7 : GIE (Global Interrupt Enable) Le chef suprme du registre INTCON. Le roi de toutes les interruptions ! Mis 1, il autorise la prise en compte de tous les autres bits de loctet ; tandis que mis zro, il les masque (mme sils sont positionns). Sous laction dun Reset il est automatiquement mis zro. Pour interdire la prise en compte de toute ventuelle demande dinterruption pouvant surgir pendant que le microcontrleur est dj occup en traiter une, ce bit (GIE) passe automatiquement zro jusqu ce que dans le programme apparat linstruction RETFIE, qui le repositionne 1. Au cas o lutilisation de ce bit soit ncessaire, il ne faut pas oublier que: aprs lavoir activ (pour ouvrir laccs au(x) bit(s) concern(s), et aprs linstruction RETFIE, cest dire la fin dun sous-programme dinterruption, lorsque son utilisation nest plus ncessaire, il faut le mettre zro, au risque de placer les demandes dinterruption dans un cycle qui les ferait revenir continuellement. Bit 6 : EEIE (EEprom Interrupt Enable) Mis 1, autorise linterruption que lEEPROM gnre la fin de la programmation.
7 6 5 4 3 2 1 0

EEIE

31 Bit 5 : T0IE (Timer zero Interrupt Enable)


7 6 5 4 3 2 1 0

TOIE Mis 1, il autorise les interruptions provoques par le dbordement du timer interne (passage de FF 00).

Bit 4 : INTE (INTerrupt Enable)


7 6 5 4 3 2 1 0

INTE Mis 1, il autorise les demandes dinterruption provenant de lextrieur, appliques sur la pin 6 (RB0 /INT). NB : ces demandes peuvent se dclencher soit lapparition dun Front montant, soit lapparition dun front descendant, selon la faon Dont on a programm le bit 6 du registre OPTION (INTEDG) 1 = sur front montant 0 = sur front descendant

Bit 3 : RBIE (Register B Interrupt Enable)


7 6 5 4 3 2 1 0

RBIE Mis 1, il autorise les interruptions provoques par un changement dtat sur les lignes du port B (RB4, BR5, RB6, RB7).

32 Bit 2 : T0IF (Timer zero Interrupt Flag)


7 6 5 4 3 2 1 0

TOIF Le fonctionnement de ce flag est conditionn par ltat du bit 5. Il ne fonctionne que si le bit 5 a pralablement t mis 1. Dans la mesure o le bit 5 est 1, ce flag passe 1 chaque fois que le timer TMR0 dborde (passage de FF 00).

Bit 1 : INTF (INTerrupt Flag)


7 6 5 4 3 2 1 0

INTF Le fonctionnement de ce flag est conditionn par ltat du bit 4. Il ne fonctionne que si le bit 4 a pralablement t mis 1. Dans la mesure o le bit 4 est 1, ce flag passe 1 chaque fois quune demande dinterruption surgit, provenant de lextrieur, applique sur la pin 6 du botier (RB0/INT).

Bit 0 : RBIF (Register B Interrupt Flag)


7 6 5 4 3 2 1 0

RBIF Le fonctionnement de ce flag est conditionn par ltat du bit 3. Il ne fonctionne que si le bit 3 a pralablement t mis 1. Dans la mesure o le bit 3 est 1, ce bit passe 1 chaque fois quil y a un changement dtat sur lune des lignes du port B (RB4, RB5, RB6 ou RB7) par rapport la dernire opration de lecture du port B (dans la mesure, videmment, o les lignes de ce port sont configures en entre).

33

OPTION
Est le registre qui prside au fonctionnement de lhorloge interne du microcontrleur (TMR0) :
7 6 5 4 3 2 1 0

RBPU

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

Bit 7 : RBPU (Register B Pull Up) Mis zro (actif ltat bas) valide les rsistances de pull-up prsentes, lintrieur du botier, sur les lignes du port B. Bit 6 : INTEDG (INTerrupt EDGe) Dtermine le front du signal dhorloge sur lequel on veut que soit prise en compte une demande dinterruption provenant de lextrieur (commande applique sur la pin 6 : RB0/INT). Car on peut faire agir une telle demande soit lapparition dun front montant (passage de zro 1), soit lapparition dun front descendant (passage de 1 zro). 1 = interruption programme pour se dclencher

) sur un front montant ( 0 = interruption programme pour se dclencher


sur un front descendant

).

Bit 5 : T0CS (Timer zero Clock Source) Sert choisir la provenance du signal quon souhaite utiliser comme clock pour piloter lhorloge interne. Il existe deux choix possibles : soit utiliser lhorloge interne utilisant le quartz pilote du microcontrleur et fournissant un signal dont la frquence est celle du quartz divise par 4, soit utiliser un signal externe prlev sur la pin RA4 (bit 4 du port A). 0 = le timer est pilot par lhorloge interne 1 = le timer est pilot par un signal externe.

34 Bit 4 : T0SE (Timer zero Signal Edge) Sert dterminer si lhorloge doit avancer sur front montant ou sur front descendant. 0 = lhorloge avance sur front montant

) ).

1 = lhorloge avance sur front descendant ( Bit 3 : PSA (Pre-Scaler Assignment) Sert affecter le prdiviseur soit au timer TMR0 soit au Watch-Dog. 0 = le pr diviseur est affect au timer TMR0 1 = le pr diviseur est affect au Watch-Dog. Bits 2 1 0 : PS2 PS1 PS0 (Pre-Scaler rate) Ces trois bits servent programmer le facteur de division quon veut assigner au prdiviseur dans le but davoir des signaux plus lents. A remarquer que le facteur de division nest pas le mme selon que le pr diviseur soit affect au TMR0 (timer) ou au Watch-Dog (chien de garde) : Facteur de division PS2 0 0 0 0 1 1 1 1 PS1 0 0 1 1 0 0 1 1 PS0 0 1 0 1 0 1 0 1 Pour le TMR0 2 4 8 16 32 64 128 256

Pour le Watch-Dog 1 2 4 8 16 32 64 128

Pour crire dans ce registre on utilise soit linstruction BSF,bit Soit linstruction BCF,bit.

35

Reprsentation image du fonctionnement du timer TMR0 et du Watch-Dog (chien de garde) :

36

PCL (Program Counter Low)


Il sagit du compteur qui fournit au programme la partie basse de ladresse. Dans les microcontrleurs de Microchip les lignes dadresses sont rparties en deux bytes : le PCL (fourni par ce registre Program Counter Low), et le PCH (fourni par le registre PCLATH Program Counter LATch High). Il sagit dun compteur dont la tche est dadresser la mmoire dans laquelle sont loges les instructions du programme. Lorganisation de ce type de compteur, dans les microcontrleurs PIC, veut que ladresse soit compose de deux parties : la partie basse (fournie par PCL, sur dix lignes dadresse) et la partie haute (fournie par PCLATH).

37

PCLATH (Program Counter LATch High)

Ladresse du compteur de programme est obtenue en mettant ensemble la partie basse fournie par PCL (Program Counter Low) et la partie haute fournie par PCLATH. Contrairement ce quon pourrait penser, ce registre ne fournit pas un nombre complmentaire fixe de bits, mais un nombre de bits variable, en fonction des instructions qui sont traites.

38

PORT A

PORT B

Alors que TRIS A et TRIS B se limitent dfinir le sens de chaque ligne des ports (entre ou sortie), PORT A et PORT B permettent concrtement au microcontrleur de communiquer avec lextrieur. Voici des exemples : 1) Comment crire un 0 sur une ligne de port (par exemple, sur RA0) : MOVLW (en binaire, pour que ce soit plus parlant). Octet de configuration de port : 0 = sortie 1 = entre Dans ce cas : on veut programmer le bit 0 en sortie, et tous les autres en entre. TRISA Charge loctet de configuration dans le registre TRIS A, mais toutes les lignes sont encore maintenues en haute impdance. PORTA,0 Met zro (clear) le bit 0 du port A. Toutes les autres lignes du port restent haute impdance. 11111110

MOVWF

BCF

2) Comment crire un 1 sur une ligne de port (par exemple, sur RA2) : MOVLW 11111110 (en binaire, pour que ce soit plus parlant). Octet de configuration de port : 0 = sortie 1 = entre Dans ce cas : on veut programmer le bit 2 en sortie et tous les autres en entre. Charge loctet de configuration dans le registre TRIS A.

MOVWF

TRISA

39 BSF PORTA,2 Met 1 (set) le bit 2 du port A. Toutes les autres lignes du port restent haute impdance.

3) Comment lire ltat logique dune ligne de port. Cest dire : comment savoir si une ligne est 0 ou 1 : MOVLW 11111111 (en binaire). Octet de configution de port (on veut que toutes les lignes du port soient des entres). TRISA Charge loctet de configuration dans le registre TRIS A. PORTA,3 Teste le bit 3 des lignes du port A. Sil est 1, linstruction suivante est excute. Si par contre il est 0, linstruction suivante est ignore et le programme excute linstruction se trouvant encore aprs. NB : Au lieu de BTFSC, on aurait pu utiliser linstruction BTFSS pour, dans ce cas, exter linstruction suivante si le bit test est 0.

MOVWF BTFSC

4) Comment lire loctet entier dun port configur en entre : MOVF PORTA,W Charge le contenu du port A dans le registre W.

40

STATUS (Registre dtat)


Les cinq premiers bits de ce registre (bits 0 4) correspondent des flags que le programmeur peut interroger pour obtenir des informations lui permettant dcrire correctement la suite des instructions de son programme ; tandis que les bits 5, 6 et 7 (RP0, RP1, RP2), daprs la faon dont on les programme, pourraient slectionner 8 pages de registres internes (chacune de 128 octets). Comme dans le 16F84 il ny a que deux pages de registres (Page 0 et Page 1), seul le bit 5 (RP0) sert (les bits 6 et 7 sont ignorer purement et simplement).
7 6 5 4 3 2 1 0

RP0

TO

PD

DC

Bit 0 : C (Carry) Flag indiquant si une retenue a eu lieu dans un octet lors dune addition ou dune soustraction. Si une retenue a t gnre, ce bit passe 1. Bit 1 : DC (Digit Carry) Flag fonctionnant comme le bit de Carry, sauf quici la surveillance de la retenue sexerce non pas sur loctet entier, mais sur le premier demi-octet. Ce flag se positionne 1 si une retenue est gnre du bit 3 (bit de poids fort du quartet infrieur) vers le bit 0 du quartet suprieur. Il est utile pour corriger le rsultat doprations effectues en code BCD. Bit 2 : Z (Zero) Ce flag passe 1 si le rsultat dune opration (arithmtique ou logique) est 0. Bit 3 : PD (Power Down) Mise en veilleuse de lalimentation, effectue par linstruction SLEEP. Passe 1 lorsquon utilise linstruction CLWDT, ou la mise sous tension.

41 Bit 4 : TO (Time Out) Dpassement de dlai. Passe 0 si le timer du Watch-Dog (chien de garde) dborde. Est mis 1 par les instructions CLWDT et SLEEP, ainsi qu la mise sous tension. Bit 5 : RP0 (Register Page zero) Sert slectionner lune des deux pages de registres (Page 0 ou Page 1). 0 = slectionne la page mmoire 0 (adresses de 00 7F) 1 = slectionne la page mmoire 1 (adresses de 80 FF). Exemples de programmation : 1) BCF STATUS, RP0 (Bit Clear File STATUS Register Page 0). Met zro le bit RP0 du registre dtat. Autrement dit : slectionne le banc mmoire 0 (adresses 00 7F). STATUS,RP0
(Bit Set File STATUS Register Page 0). Met 1 le bit RP0 du registre

2)

BSF

dtat. Autrement dit : slectionne le banc mmoire 1 (adresses de 80 FF).

42

TMR0 (TiMeR zero)


Est le registre de contrle de lhorloge interne (timer) du microcontrleur. Ce timer peut soit fonctionner seul, soit tre prcd par un pr diviseur programmable 8 bits dont la programmation se fait par lintermdiaire du registre OPTION. Ce registre peut tre lu et modifi tout moment, soit pour connatre sa position courante, soit pour le dclencher partir dune valeur dtermine. Une quelconque opration dcriture dans ce registre met automatiquement zro le comptage en cours dans le pr diviseur. Se rappeler que le timer compte sur 8 bits, et quune fois que le comptage est arriv FF, celui-ci revient 00 (ce qui provoque le passage 1 du bit 2 du registre INTCON appel T0IF). En programmation on peut crire : 1) pour le lire : MOVF TMR0 ,W (porte la valeur de TMR0 dans W) 2) pour lui donner une valeur de dpart : MOVLW valeur MOVWF TMR0 3) pour le mettre zro : CLRF TMR0

43

TRIS A

TRIS B

Ce sont les registres qui dfinissent le sens de chacune des lignes des ports A et B. Toute ligne mise 1 est programme comme entre, tandis que toute ligne mise zro est programme comme sortie. Il ny a aucune instruction permettant dcrire directement dans ces registres : on y accde en transitant par le registre de travail W. En programmation, on commence donc par charger loctet de configuration dans le registre W, puis on copie celui-ci dans TRIS A ou TRIS B. Exemple : MOVLW MOVWF 00000001 (en binaire, sinon 01 en hexa) TRISA

Le bit 0 du port A est dfini comme entre, tandis que les sept autres lignes sont dfinies comme sorties.

44

La PROGRAMMATION
Diffrentes faons de programmer

Il existe plus dun chemin possible pour programmer les PIC. Nous en examinerons deux : 1) la programmation en langage ASSEMBLEUR 2) la programmation en langage BASIC.

45

Avantages et inconvnients de la programmation en langage ASSEMBLEUR


Avantages : La programmation en langage ASSEMBLEUR se fait laide dun outil de programmation entirement gratuit et que lon peut diffuser librement. Cet outil (qui est un magnifique environnement de programmation complet) sappelle MPLAB. Il est disponible en tlchargement gratuit sur le site de Microchip. Inconvnients : Pour programmer en langage ASSEMBLEUR, il faut non seulement connatre le fonctionnement de chaque instruction, mais aussi larchitecture interne du microcontrleur, la structure de sa mmoire, les adresses des registres spciaux, le fonctionnement de chacune de ses ressources internes, etc.. La programmation en langage ASSEMBLEUR sappuie sur des organigrammes plus travaills, et requiert plus de rigueur et de minutie. Le programmeur doit plus faire attention aux impratifs machine qu la finalit de son programme. Distrait par le impratifs machine, le programmeur commet souvent des erreurs. Ces erreurs sont souvent difficiles dceler et corriger.

46

Avantages et inconvnients de la programmation en langage BASIC


Avantages : La programmation en BASIC se fait laide dun langage facile et direct qui (bien qutant de langlais) comprend des mots puissants, si bien quun programme crit en BASIC comporte peu de mots. Les erreurs de programmation sont plus rares, et se dclent facilement. Lcriture des programmes prend peu de temps. Inconvnients : La programmation en BASIC ncessite un COMPILATEUR expressment conu pour la programmation des PIC. Il sagit dun produit commercial, fruit dun travail dquipe, et donc payant. Les programmes en langage BASIC, bien que trs courts pour le programmeur qui les crit, demandent plus de place EEPROM car, vus ct PIC, ils demandent plus dinstructions lmentaires. A tel point que parfois un microcontrleur pouvant contenir laise un programme crit en langage assembleur, savre possder une mmoire insuffisante sil tait programm en langage BASIC, pour faire la mme chose.

47

Les outils ncessaires pour programmer en langage ASSEMBLEUR


Pour programmer en langage ASSEMBLEUR il faut : 1) un PC et une imprimante, pour crire les instructions permettant de confectionner le fichier extension . asm 2) un ASSEMBLEUR fourni gratuitement par Microchip ( tlcharger sur INTERNET) permettant de confectionner le fichier extension .hex Cet ASSEMBLEUR sappelle MPLAB. Il faut linstaller sur votre PC et apprendre vous en servir. 3) un PROGRAMMATEUR de PIC. Relativement simple raliser. Il existe des modles pour port srie et des modles pour port parallle. Je vous conseille un modle pour port parallle. Cherchez un schma sur un magazine dElectronique, ou achetez un kit. 4) un LOGICIEL adapt votre programmateur de PIC. Si vous achetez un kit, il vous sera fourni avec le kit. Si vous copiez le schma dans un magazine, vous devez pouvoir tlcharger le logiciel ladresse cite dans larticle. 5) Des cbles de liaison et une petite alimentation (un bloc secteur).

48

Les outils ncessaires pour programmer en langage BASIC


Pour programmer en langage BASIC il faut : 1) un PC et une imprimante, pour crire les instructions permettant de confectionner le fichier extension .bas 2) un COMPILATEUR PicBASIC propos par Micro Engineering Labs (dont limportateur exclusif pour la France est SELECTRONIC Lille) permettant de confectionner le fichier extension .hex 3) un PROGRAMMATEUR de PIC (mmes remarques qu propos des outils pour programmer en langage ASSEMBLEUR) 4) un LOGICIEL adapt votre programmateur de PIC (idem) 5) Des cbles de liaison et une petite alimentation (un bloc secteur).

49

STRUCTURE dun PROGRAMME


Lcriture dun programme implique llaboration dune vritable structure. Cest pourquoi je ne saurais trop vous conseiller dagir avec mthode et prcision. Tout programme doit comporter un titre : une sorte de dfinition succincte de ce que fait le programme. Ltape suivante consiste mettre ce programme sur papier (listing). Nous y ajouterons des commentaires, ligne par ligne, pour chaque opration effectue. Ceux-ci seront clairs et abondants. Ils vous aideront plus tard comprendre les dtails du programme. Ils doivent tre tels que si vous repreniez votre feuille plusieurs mois aprs, vous devriez facilement savoir vous relire et comprendre. Mieux encore : si vous travaillez en quipe, nimporte qui de votre quipe devrait tre en mesure de comprendre de quoi il sagit. Prenez lhabitude de signer et dater vos programmes. Dans la mesure du possible, accompagnez-les dun organigramme.

50

CANEVAS dun programme


Tout programme se construit selon un modle, une sorte de squelette (template, en anglais). Voici le squelette dun programme pour PIC 16F84 : Processor 16F84 Dclarations obligatoires Radix ..... Include <<P16F84>> ..... EQU .....

Equivalences Initialisation de la RAM et rservation dun certain nombre dadresses mmoire Dbut du programme aprs Reset Configuration des lignes de port Instructions Sous programmes

ORG 0C RES ...

ORG 00

Fin du programme

END

51

PROGRAMMATION en langage ASSEMBLEUR


La programmation en langage ASSEMBLEUR se fait en utilisant les 37 instructions formant son dictionnaire. En langage ASSEMBLEUR le PIC 16F84 ne comprend que ces 37 mots (en fait : 35 instructions communes tous les modles de PIC, plus deux instructions spcifiques au 16F84 : OPTION et TRIS). Ces 37 mots forment ce que lon appelle le set dinstructions du 16F84. Il convient de toutes les connatre. Ecrire un programme en langage ASSEMBLEUR revient donc dtailler au PIC ce quil doit faire, en le disant exclusivement au moyen de ces 37 mots de son vocabulaire : les seuls mots quil est capable de comprendre. Examinons-les une par une.

52

Les INSTRUCTIONS du 16F84


Le microcontrleur 16F84 possde un set de seulement 37 instructions codes (en reprsentation binaire) sur 14 bits, selon le modle : XX XXXX XXXX XXXX bit de poids fort Codes en hexadcimal, elles prennent la forme : XXXX A remarquer qutant donn que les deux bits de poids fort (bits 12 et 13) ne peuvent prendre que seulement quatre valeurs binaires (00 - 01 10 et 11), il en rsulte que la premire valeur de toute instruction code en hexadcimal ne peut dpasser 3. Autrement dit : eu gard la premire valeur de chaque instruction code en hexadcimal, les seuls formats possibles sont : 0XXX... 1XXX... 2XXX... 3XXX... avec une tendue comprise entre 0000 et 3FFF. La plupart des instructions oprent en utilisant le registre de travail W (Working register) comparable laccumulateur des anciens microprocesseurs, et soit un registre soit une valeur immdiate code sur 8 bits appele literal. Le rsultat des oprations peut tre envoy soit dans le registre W (accumulateur) soit dans le registre sollicit (soit dans les deux, avec certaines instructions). Un petit nombre dinstructions oprent en utilisant uniquement un registre (cest le cas des instructions BCF, BSF, BTFSC, BTFSS, CLRW, CLRWT et SLEEP). Les 37 instructions du 16F84 peuvent tre classes comme on veut. bit de poids faible

53 Je vous propose quatre types de classement: a) classement par ordre alphabtique b) classement par genre c) classement par type d) classement par ordre croissant dencodage. Toutes les instructions sont codes en un seul mot de 14 bits (0 13). Elles sont toutes excutes en un seul cycle dhorloge , sauf CALL, GOTO, RETFIE, RETLW et RETURN qui demandent 2 cycles, et BTFSC, BTFSS, DECFSZ, INCFSZ qui selon le cas peuvent demander soit un cycle, soit deux cycles. NB : Parmi les 37 instructions constituant le set du 16F84, deux lui sont spcifiques (je lai dj dit) et ont un caractre spcial : OPTION et TRIS. Ces deux instructions ne figurent pas dans les autres modles de PIC. Aussi Microchip recommande de ne pas les utiliser, dans le but de laisser compatibles les programmes (crits pour ce C) avec ceux crits pour dautres modles de PIC. Il suffit de le savoir. Mais ceci nest pas un obstacle pour nous, du fait que notre intrt est exclusivement tourn vers le 16F84.

54

a) Classement par lettre alphabtique


ADDLW ADDWF ANDLW ANDWF BCF BSF BTFSC BTFSS CALL CLRF CLRW CLRWDT COMF DECF DECFSZ GOTO INCF INCFSZ IORLW IORWF MOVF MOVLW MOVWF NOP OPTION RETFIE RETLW RETURN RLF INCrement File INCrement File, Skip if Zero Inclusive OR Literal with W Inclusive OR W with File MOVe File MOVe Literal to W MOVe W to File No OPeration load OPTION register RETurn From IntErrupt RETurn from subroutine with Literal in W RETURN from subroutine Rotate Left File ADD Literal to W ADD W to File AND Literal and W AND W and File Bit Clear File Bit Set File Bit Test File, Skip if Clear Bit Test File, Skip if Set CALL subroutine CLeaR File CLeaR W CLeaR Wach Dog Timer COMplement File DECrement File DECrement File, Skip if Zero

55 RRF SLEEP SUBLW SUBWF SWAPF TRIS XORLW XORWF Rotate Right File SUBtract Literal with W SUBtract W from File SWAP File TRIState port eXclusive OR Literal and W eXclusive OR W and File

56

b) Classement par genre


- instructions arithmtiques : ADDLW ADDWF SUBLW SUBWF - instructions dincrmentation : DECF DECFSZ INCF INCFSZ - instructions deffacement : CLRF CLRW CLRWDT - instructions de mouvement : MOVF MOVLW MOVWF - instructions de rotation : RLF RRF - instructions logiques : ANDLW ANDWF COMF IORLW IORWF XORLW XORWF

57 - instructions de saut et branchement : CALL GOTO RETFIE RETLW RETURN - instructions agissant sur les bits : BCF BSF BTFSC BTFSS - instructions diverses : NOP OPTION TRIS SLEEP SWAPF

58

c) Classement par type


- instructions travaillant seules : CLRW CLRWDT NOP OPTION RETFIE RETURN SLEEP - instructions travaillant avec une constante ou une tiquette (k) : ADDLW k ANDLW k CALL k GOTO k IORLW k MOVLW k RETLW k SUBLW k XORLW k - instructions travaillant avec un registre (f) : CLRF f MOVWF f TRIS f - instructions travaillant sur un bit (b) doctet (f) : BCF f,b BSF f,b BTFSC f,b BTFSS f,b Il est vident que b ne peut prendre quune valeur comprise entre 0 et 7, dsignant la position du bit dans loctet :
7 6 5 4 3 2 1 0

59 - instructions travaillant avec un registre (f) mais proposant un choix (d) dans la destination du rsultat : - d = 0 : le rsultat est plac dans W - d = 1 : le rsultat est plac dans le registre f ADDWF f,d ANDWF f,d COMF f,d DECF f,d DECFSZ f,d INCF f,d INCFSZ f,d IORWF f,d MOVF f,d RLF f,d RRF f,d SUBWF f,d SWAPF f,d XORWF f,d

60

d) Classement par ordre croissant dencodage

0 0000 NOP 0008 RETURN 0009 RETFIE 0062 OPTION 0063 SLEEP 0064 CLWDT 006x TRIS 00xx MOVWF 0100 CLRW 01xx CLRF 02xx SUBWF 03xx DECF 04xx IORWF 05xx ANDWF 06xx XORWF 07xx ADDWF 08xx MOVF 09xx COMF 0Axx INCF 0Bxx DECFSZ 0Cxx RRF 0Dxx RLF 0Exx SWAPF 0Fxx INCFSZ

1 1xxx BCF 1xxx BSF 1xxx BTFSC 1xxx BTFSS

2 2xxx CALL 2xxx GOTO

3 30xx MOVLW 34xx RETLW 38xx IORLW 39xx ANDLW 3Axx XORLW 3Cxx SUBLW 3Exx ADDLW

61

ADDLW
ADD Literal to W - Additionne de manire immdiate le literal au contenu du registre W, et place le rsultat dans W. - Le literal est un mot de 8 bits (de 00 FF). - Cette instruction affecte 3 bits du registre dtat : le flag C : Carry le flag DC : Digit Carry le flag Z : Zero - 1 cycle dhorloge - Encodage de linstruction :
13 0

11 111x kkkk kkkk 3 E Valeur de loctet que lon veut ajouter W (valeur pouvant aller de 00 FF). - Exemple de programmation : ADDLW 06

En supposant que W contienne 04 avant linstruction, aprs linstruction il contient 0A (en hexa : 06 + 04 = 0A).

62

ADDWF
ADD W to File - Additionne le contenu du registre W loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet utilis pour faire laddition (la nouvelle valeur prend la place de lancienne). - Cette instruction affecte 3 bits du registre dtat : le flag C : Carry le flag DC : Digit Carry le flag Z : Zero - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0111 0

dfff

ffff

7 (W) 0 ou (registre) 1

De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) dont le contenu est additionner W. - Exemples de programmation : 1) MOVF ADDWF,0 VentesDuMois,W

63 2) MOVF ADDWF,1 VentesDuMois,W

Lexemple 1 met dans W ce qui se trouve ladresse VentesDu Mois, puis additionne VentesDuMois au contenu de W, et range le rsultat dans W. Lexemple 2 met dans W ce qui se trouve ladresse VentesDu Mois, puis additionne VentesDuMois au contenu de W, et range le rsultat ladresse VentesDuMois, en renplaant lancienne valeur par le total quon vient de trouver.

64

ANDLW
AND Literal and W - Effectue une opration logique ET (AND) entre la valeur immdiate du literal et loctet se trouvant dans le registre W. - Le literal est un mot de 8 bits (de 00 FF) - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction :
13 0

11 1001 kkkk kkkk 3 9 Valeur de loctet avec laquelle on veut effectuer le ET logique (valeur pouvant aller de 00 FF). - Table de vrit dune porte ET :

A B Q 0 0 0 0 1 0 1 0 0 1 1 1

65

- Exemple de programmation : ANDLW A7

En supposant que W contienne 5C (01011100) avant linstruction, aprs linstruction W contient 04. A7 = 10100111 5C = 01011100 AND = 00000100 (04 en hexa) Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ? Elle sert lorsque dans un octet on a besoin de rcuprer un bit en particulier (ou certains bits en particulier). Pour cela il suffit de prparer un masque, cest dire on octet compos de 0 (aux emplacements o se trouvent les bits liminer) et de 1 (aux emplacements o se trouvent les bits rcuprer). Exemple : on souhaite rcuprer uniquement le bit 5 de loctet 01111010. On prpare alors le masque 00100000 et on fait un ET logique entre loctet et le masque. Comme ceci : 01111010 (octet) 00100000 (masque) Ce qui donne : 00100000 (rsultat) Le rsultat de lopration permet donc bien de rcuprer uniquement le bit 5 de loctet : ici cest un 1 (00100000). Une fois rcupr, on peut utiliser ce bit comme on veut.

66

ANDWF
AND W and File - Effectue une opration logique ET (AND) entre loctet se trouvant dans le registre W et loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet utilis pour effectuer le ET logique (la nouvelle valeur prend la place de lancienne). - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0101 0 5

dfff

ffff

(W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet avec lequel on veut faire le ET logique. - Exemples de programmation : 1) 2) ANDWF,0 ANDWF,1 Adresse Adresse

67 Lexemple 1 effectue un ET logique entre loctet se trouvant dans W et loctet se trouvant Adresse, et range le rsultat dans W. Lexemple 2 effectue un ET logique entre loctet se trouvant dans W et loctet se trouvant Adresse, et range le rsultat dans Adresse. - Table de vrit dune porte ET :

A B Q 0 0 0 0 1 0 1 0 0 1 1 1 Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ? Elle sert lorsque dans un octet on a besoin de rcuprer un bit en particulier (ou certains bits en particulier). Pour cela il suffit de prparer un masque, cest dire on octet compos de 0 (aux emplacements o se trouvent les bits liminer) et de 1 (aux emplacements o se trouvent les bits rcuprer). Exemple : on souhaite rcuprer uniquement le bit 5 de loctet 01111010. On prpare alors le masque 00100000 et on fait un ET logique entre loctet et le masque. Comme ceci : 01111010 (octet) 00100000 (masque) Ce qui donne : 00100000 (rsultat) Le rsultat de lopration permet donc bien de rcuprer uniquement le bit 5 de loctet : ici cest un 1 (00100000). Une fois rcupr, on peut utiliser ce bit comme on veut.

68

BCF
Bit Clear File - Met zro le bit dsign de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F). - 1 cycle dhorloge - Encodage de linstruction:
13 0

01 00bb 1

bfff

ffff


Position du bit dans loctet.

De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet sur lequel on veut oprer. - Position du bit dans loctet : 111 110 101 100 11 10

0
0

- Exemples de programmation : En supposant quon veuille mettre zro (Clear) un certain bit de loctet situ ladresse 27 de la mmoire RAM, la programmation serait :

69

BCF ou BCF ou etc...

27,0 27,1 BCF

(pour mettre zro le bit 0) (pour mettre zro le bit 1) 27,2 (pour mettre zro le bit 2)

70

BSF
Bit Set File - Met 1 (Set) le bit dsign de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F). - 1 cycle dhorloge - Encodage de linstruction:
13 0

01 01bb 1

bfff

ffff


Position du bit dans loctet.

De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet sur lequel on veut oprer. - Position du bit dans loctet : 111 110 101 100 11 10

0
0

- Exemples de programmation : En supposant quon veuille mettre 1 (Set) un certain bit de loctet situ ladresse 1C de la mmoire RAM, la programmation serait :

71

BSF ou ou BSF BSF etc...

1C,0 1C,1 1C,2

(pour mettre 1 le bit 0) (pour mettre 1 le bit 1) (pour mettre 1 le bit 2)

72

BTFSC
Bit Test File, Skip if Clear - Vrifie ltat logique du bit dsign de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F). Est-il zro ? Sil est zro, ignore linstruction suivante. - Selon que la rponse soit OUI ou NON, linstruction prend 1 ou 2 cycles dhorloge. - Encodage de linstruction:
13 0

01 10bb 1

bfff

ffff


Position du bit dans loctet.

De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet sur lequel on veut oprer. - Position du bit dans loctet : 111 110 101 100 11 10

0
0

73 - Organigramme du traitement :

- Exemple de programmation : En supposant que loctet dont on veut tester un bit soit situ ladresse 1A, la programmation serait la suivante : BTFSC 1A,0 ou ou BTFSC 1A,1 BTFSC 1A,2 etc... (pour tester le bit 0) (pour tester le bit 1) (pour tester le bit 2)

74

BTFSS
Bit Test File, Skip if Set - Vrifie ltat logique du bit dsign de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F). Est-il 1 ? Sil est 1, ignore linstruction suivante. - Selon que la rponse soit OUI ou NON, linstruction prend 1 ou 2 cycles dhorloge. - Encodage de linstruction:
13 0

01 11bb 1

bfff

ffff


Position du bit dans loctet.

De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet sur lequel on veut oprer.

- Position du bit dans loctet : 111 110 101 100 11 10

0
0

75 - Organigramme du traitement :

- Exemple de programmation : En supposant que loctet dont on veut tester un bit soit situ ladresse 1C, la programmation serait la suivante : BTFSS 1C,0 ou ou BTFSS 1C,1 BTFSS 1C,2 etc... (pour tester le bit 0) (pour tester le bit 1) (pour tester le bit 2)

76

CALL
CALL subroutine - Appel sous-programme. - Le C sauvegarde ladresse de retour dans la pile (stack), puis charge dans le PC (Program Counter) ladresse laquelle il est invit se rendre. Il peut sagir aussi bien dune adresse que dune label ; et cest l que dmarre le sous-programme. - Tout sous-programme appel par linstruction CALL doit obligatoirement se terminer soit par linstruction RETURN, soit par linstruction RETLW qui renvoient au programme principal. Ne pas confondre linstruction CALL avec linstruction GOTO. Linstruction CALL fait toujours revenir le programme principal lendroit o il avait t abandonn ; tandis que linstruction GOTO provoque labandon total de la squence et peut conduire soit une toute autre action, soit larrt total du programme. - La pile (stack) est une zone de mmoire ne pouvant contenir que 8 mots de 13 bits. Ceci limite 8 niveaux les possibilits dimbrication. Sil y en avait un neuvime, la premire adresse de retour serait perdue... - Cette instruction prend 2 cycles dhorloge. - Encodage de linstruction :
13 0

10 0kkk kkkk kkkk 2 Adresse de lEEPROM de programme laquelle est log le sous-programme (adresse comprise entre 000 et 3FF).

77 - Organigramme du traitement :

Programme principal .................................. .................................. .................................. CALL sous-programme---------------->.................................. .................................. .................................. sous-programme <----- .................................. .................................. <-- RETURN

- Exemple de programmation : CALL Tempo (saute ladresse correspondant Tempo).

78

CLRF
CLeaR File - Efface (Clear) ce qui se trouve (en mmoire RAM) ladresse indique de suite (adresse comprise entre 00 et 4F). - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction :
13 0

00 0001 0 1

1fff ffff Adresse de la RAM (entre 00 et 4F) o se trouve loctet quon veut effacer.

- Exemples de programmation : 1) CLRF INTCON 2) CLRF PORTB 3) CLRF 1E (pour dsactiver les interruptions) (pour mettre zro tous les bits du port B) (pour effacer ce qui se trouve ladresse 1E)

79

CLRW
CLeaR W - Efface (Clear) le registre W. - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction :
13 0

00 0001 xxxx xxxx 0 1 0 0 - Exemple de programmation : CLRW (efface le registre W).

En supposant que W contienne F8 avant linstruction, aprs linstruction il contient 00.

80

CLRWDT
CLeaR Wach Dog Timer - Met zro le compteur du chien de garde (ainsi que celui du pr diviseur, si celui-ci est activ). - Cette instruction affecte deux bits du registre dtat : - le flag TO (Time Out) passe 1 - le flag PD (Power Down) passe 1 - 1 cycle dhorloge - Encodage de linstruction :
13 0

00 0000 0110 0100 0 0 6 4 - Exemple de programmation : CLWDT (efface le compteur du chien de garde).

Peu importe o en tait le compteur du chien de garde, cette instruction le fait revenir zro.

81

COMF
COMplement File - Effectue un complment bit bit sur loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet utilis pour faire le complment (la nouvelle valeur prend la place de lancienne). Faire le complment bit bit dun octet quivaut changer ses zros en 1, et inversement. Exemple : le complment de 00111100 est 11000011. - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 1001 0 9

dfff

ffff

(W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet sur lequel on veut oprer. - Exemples de programmation : 1) COMF 2B,0 (effectue le complment bit bit de loctet situ ladresse 2B et range le rsultat dans W) En supposant que 2B contienne 11100000 avant linstruction, aprs linstruction cette valeur est transforme en 00011111.

82

2) COMF

2B,1 (mme chose, mais le rsultat est rang la place de loctet utilis pour faire le complment).

83

DECF
DECrement File - Dcrmente la valeur de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet quon a dcrment (la nouvelle valeur prend la place de lancienne). - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0011 0 3

dfff

ffff

(W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet quon veut dcrmenter. - Exemples de programmation : 1) DECF COMPTEUR,0 (dcrmente loctet se trouvant ladresse COMPTEUR, et range le rsultat dans W) (mme chose, mais cette fois le rsultat est rang ladresse COMPTEUR).

2) DECF

COMPTEUR,1

84

DECFSZ
DECrement File, Skip if Zero - Dcrmente la valeur de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F), et effectue un test : loctet a-t-il atteint zro ? Si OUI, ignore linstruction suivante. Avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet dcrment (la nouvelle valeur prend la place de lancienne). - Selon qu la suite de la dcrmentation loctet ait atteint ou pas la valeur zro, linstruction prend 1 ou 2 cycles dhorloge. - Encodage de linstruction:
13 0

00 1011 0

dfff

ffff

B (W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet quon veut dcrmenter.

- Cette instruction est gnralement suivie par linstruction CALL. - Exemples de programmation : 1) DECFSZ 2F,0 (dcrmente loctet se trouvant ladresse 2F, et range le rsultat dans W. Si le rsultat est zro, ignore linstruction suivante).

85 2) DECFSZ 2F,1 (mme chose, mais cette fois le rsultat est rang ladresse 2F. La nouvelle valeur prend la place de lancienne).

86

GOTO
- Branchement inconditionnel. Va de faon inconditionnelle ladresse indique de suite (adresse de dmarrage du sous-programme). Il peut sagir aussi bien dune adresse que dune label. Cette instruction interrompt lexcution squentielle des instructions et oblige poursuivre le programme dune adresse compltement ailleurs. A la diffrence de linstruction CALL (qui fait toujours revenir le programme principal lendroit o il avait t abandonn) , linstruction GOTO provoque labandon complet de la squence et peut conduire soit une toute autre action, soit larrt total du programme. - Cette instruction prend 2 cycles dhorloge. - Encodage de linstruction :
13 0

10 1kkk kkkk kkkk 2 Adresse de lEEPROM de programme, laquelle le programme doit se rendre pour poursuivre (adresse comprise entre 005 et 3FF). - Exemple de programmation GOTO ALLUMAGE Aprs cette instruction, le PC (Program Counter) est charg avec la valeur de ladresse laquelle commence le programme ALLUMAGE.

87

INCF
INCrement File - Incrmente la valeur de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet quon a incrment (la nouvelle valeur prend la place de lancienne). - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 1010 0

dfff

ffff

A (W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet quon veut incrmenter.

- Exemples de programmation : 1) INCF NOMBRE,0 (incrmente loctet se trouvant ladresse NOMBRE, et range le rsultat dans W) NOMBRE,1 (mme chose, mais cette fois le rsultat est rang ladresse NOMBRE. La nouvelle valeur prend la place de lancienne).

2) INCF

88

INCFSZ
INCcrement File, Skip if Zero - Incrmente la valeur de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F), et effectue un test : loctet a-t-il atteint zro ? Si OUI, ignore linstruction suivante. Avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet incrment (la nouvelle valeur prend la place de lancienne). - Selon qu la suite de lincrmentation loctet ait atteint ou pas la valeur zro, linstruction prend 1 cycle ou deux dhorloge. - Encodage de linstruction:
13 0

00 1111 0

dfff

ffff

F (W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet quon veut incrmenter.

- Cette instruction est gnralement suivie par CALL. - Exemples de programmation : 1) INCFSZ DATE,0 (incrmente loctet se trouvant ladresse DATE, et range le rsultat dans W. Si le rsultat est zro, ignore linstruction suivante).

89 2) INCFSZ DATE,1 (mme chose, mais cette fois le rsultat est rang ladresse DATE. La nouvelle valeur prend la place de lancienne).

90

IORLW
Inclusive OR Literal with W - Effectue une opration logique OU inclusif (Inclusive OR) entre la valeur immdiate du literal et loctet se trouvant dans le registre W. Le rsultat de lopration reste dans le registre W. - Le literal est un mot de 8 bits (de 00 FF) - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction :
13 0

11 1000 kkkk kkkk 3 8 Valeur de loctet avec lequel on veut effectuer le OU inclusif (valeur pouvant aller de 00 FF). - Table de vrit dune porte OU inclusif :

A B Q 0 0 0 0 1 1 1 0 1 1 1 1

91 - Exemple de programmation : IORLW B5 (10110101)

En supposant que W contienne 49 (01001001) avant linstruction, aprs linstruction il contient FD. B5 = 10110101 49 = 01001001 OR = 11111101 (FD en hexa) Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ? Elle sert lorsque dans un octet on a besoin de forcer 1 un bit en particulier (ou certains bits en particulier). Pour cela il suffit de prparer un masque, cest dire on octet compos de 0 (aux emplacements o se trouvent les bits ignorer) et de 1 (aux emplacements o se trouvent les bits quon veut forcer 1). Exemple : on souhaite forcer 1 les bits 7 et 6 de loctet 01111010. On prpare alors le masque 11000000 et on fait un OU logique entre loctet et le masque. Comme ceci : 01111010 (octet) 11000000 (masque) Ce qui donne : 11111010 (rsultat) Le rsultat de lopration permet donc bien de forcer 1 les bits 7 et 6 de loctet. Il se trouve quici le bit 6 tait dj 1. Mais le programme ne le savait pas. Linstruction IORLW permet de prciser les choses. Une fois forcs 1, on peut utiliser ces bits (ou loctet) comme on veut.

92

IORWF
Inclusive OR With File - Effectue une opration logique OU inclusif (Inclusive OR) entre loctet se trouvant dans le registre W et loctet situ (en mmoire RAM) ladresse situe de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat peut tre plac soit dans le registre W, soit dans la mmoire RAM la place de loctet utilis pour faire le OU inclusif (la nouvelle valeur prend la place de lancienne). - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0100 0 4

dfff

ffff

(W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet avec lequel on veut faire le OU inclusif. - Table de vrit dune porte OU inclusif :

A B Q 0 0 0 0 1 1 1 0 1 1 1 1

93 - Exemples de programmation : 1) 29,0 (effectue le OU inclusif entre loctet se trouvant dans W et celui situ ladresse 29, et range le rsultat dans W). En supposant que le contenu de ladresse 29 soit C7 (11000111) et que W contienne 69 (01101001), aprs linstruction on obtient EF (11101111). 2) IORWF 29,1 (mme chose, mais le rsultat est rang ladresse 29, la place de loctet utilis pour faire le OU inclusif). IORWF

Pourquoi cette instruction dans le set du 16F84 ? A quoi sert-elle ? Elle sert lorsque dans un octet on a besoin de forcer 1 un bit en particulier (ou certains bits en particulier). Pour cela il suffit de prparer un masque, cest dire on octet compos de 0 (aux emplacements o se trouvent les bits ignorer) et de 1 (aux emplacements o se trouvent les bits quon veut forcer 1). Exemple : on souhaite forcer 1 les bits 7 et 6 de loctet 01111010. On prpare alors le masque 11000000 et on fait un OU logique entre loctet et le masque. Comme ceci : 01111010 (octet) 11000000 (masque) Ce qui donne : 11111010 (rsultat) Le rsultat de lopration permet donc bien de forcer 1 les bits 7 et 6 de loctet. Il se trouve quici le bit 6 tait dj 1. Mais le programme ne le savait pas. Linstruction IORLW permet de prciser les choses. Une fois forcs 1, on peut utiliser ces bits (ou loctet) comme on veut.

94

MOVF
MOVe File - Cette instruction peut faire deux choses : 1) soit porter dans W le contenu situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F), avec loption de programmation ,0 2) soit copier loctet sur lui-mme au mme emplacement de la RAM, avec loption de programmation ,1 Bien que a paraisse comique de copier le contenu dun registre sur luimme, en fait - tant donn que cette opration modifie le bit Z du registre dtat - elle est utile quand on a besoin de faire un test zro sur loctet, en toute scurit. - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 1000 0 8

dfff

ffff

(W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet quon veut traiter.

95 - Exemples de programmation : 1) 1) MOVF MOVF PORTB,0 18,1 (porte dans W ltat es lignes du port B). (copie le contenu de ladresse 18 sur lui-mme).

96

MOVLW
MOVe Literal to W - Charge de manire immdiate le literal dans le registre W - Le literal est un mot de 8 bits (de 00 FF) - 1 cycle dhorloge - Encodage de linstruction :
13 0

11 00xx kkkk kkkk 3 0 Valeur du literal

- Exemple de programmation : MOVLW F5 (met F5 , cest -dire 11110101, dans W).

97

MOVWF
MOVe W to File - Prend le contenu du registre W et le met (dans la mmoire RAM) ladresse indique de suite (adresse de 0C 4F) - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0000 1fff ffff 0 0 Adresse de la RAM (entre 0C et 4F) laquelle on veut mettre la valeur du registre W. - Exemple de programmation : MOVWF 0D (crit le contenu de W ladresse RAM 0D).

98

NOP
No OPeration - Linstruction la plus paresseuse ! Ne fait rien. Elle sert juste occuper le processeur pour laisser passer un peu de temps (1 cycle dhorloge). Sutilise essentiellement pour crer des temporisations. - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0000 0 0

0xx0 0

0000 0

- Exemple de programme: NOP

99

OPTION
load OPTION register - NB : cette instruction est spcifique au 16F84. Microchip recommande de ne pas lutiliser, dans le but de laisser les programmes (crits pour ce type de microcontrleur) compatibles avec ceux crits pour dautres modles de PIC. Il suffit de le savoir. Mais ceci nest pas un obstacle pour nous, du fait que notre intrt est exclusivement tourn vers le 16F84. - Charge le registre OPTION, cest -dire le registre qui sert configurer le TMR0 ( lhorloge interne du microcontrleur) ainsi que le prdiviseur. - Sagissant dun registre lecture/criture simultane, on ne peut pas y crire directement, mais il faut obligatoirement transiter par le registre W. En programmation, on commence par crire loctet de configuration dans W. Puis linstruction OPTION - en mme temps quelle adresse ce registrey copie automatiquement loctet de configuration.

100

RETFIE
RETurn From IntErrupt - Retour au programme principal aprs excution dun sous-programme dinterruption. Charge le PC (Program Counter : compteur dinstructions) avec la valeur qui se trouve au sommet de la pile (stack) ; ce qui provoque le retour au programme principal. - Lorsquune interruption est demande, le microcontrleur, avant de sauter ladresse 004 de lEEPROM mmoire de programme, sauve la valeur du Program Counter dans la pile. Cette valeur - comme dans une pile dassiettes - se place tout en haut de la pile (dans laquelle il y a seulement 8 places). A la fin du sous-programme de rponse linterruption, le C rencontre linstruction RETFIE par laquelle il rcupre la valeur se trouvant au sommet de la pile (correspondant la dernire valeur entre) et la positionne dans le Program Counter, faisant ainsi revenir le programme son flux normal (pile de type LIFO : Last In, First Out). - Aprs cette instruction, le pointeur de pile (stack pointer) se positionne tout en haut de la pile, et le bit du GIE (General Interrupt Enable) du registre INTCON (bit7) bascule 1. - Cette instruction prend 2 cycles dhorloge - Encodage de linstruction:
13 0

00 0000 0 0

0000 0

1001 9

- Exemple de programme : RETFIE

101

RETLW
RETurn from subroutine with Literal in W - Instruction jusqu un certain point similaire RETURN, en ce sens quelle ferme un sous-programme et provoque le retour au programme principal lendroit o il avait t abandonn ; mais avec une particularit en plus : charge dans le registre W la valeur du literal. - Le literal est un mot de 8 bits (de 00 FF) - Cette instruction prend 2 cycles dhorloge - Encodage de linstruction:
13 0

11 01xx kkkk kkkk 3 4 Valeur de loctet avec laquelle on veut charger W en rentrant du sous-programme (valeur pouvant aller de 00 FF).

102

RETURN
RETURN from subroutine - Retour dun sous-programme. Le PC (Program Counter) est charg avec ladresse se trouvant au sommet de la pile. - Cest linstruction qui ferme un sous-programme et provoque le retour au programme principal lendroit auquel il avait t abandonn. - Cette instruction prend 2 cycles dhorloge - Encodage de linstruction:
13 0

00 0000 0 0

0000 0

1000 8

103

RLF
Rotate Left File - Rotation gauche.

C 7

- Effectue le dplacement dune position vers la gauche des bits de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) en utilisant le bit de CARRY du registre dtat : le contenu du bit de CARRY devient le nouveau bit 0 de loctet ayant effectu la rotation gauche, tandis que lancien bit 7 entre dans CARRY ; avec deux variantes : le rsultat de la rotation peut tre rang soit dans le registre W, soit dans la mmoire RAM la place de loctet utilis pour effectuer la rotation (la nouvelle valeur prend la place de lancienne). - NB : Avant dutiliser cette instruction il convient de pralablement effacer le bit de CARRY. Car, supposer que dans CARRY il ait un 1, aprs une rotation gauche de 00000001 on aurait 00000011 alors quon sattendait 00000010. Linstruction qui efface le bit de CARRY est : BCF STATUS,0 (efface le bit zro du registre STATUS, cest -dire le bit de CARRY). - Cette instruction affecte le bit C du registre dtat - 1 cycle dhorloge

104 - Encodage de linstruction:


13 0

00 1101 0

dfff

ffff

D (W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet dont on veut effectuer la rotation gauche.

105

RRF
Rotate Right File - Rotation droite.

C 7

- Effectue le dplacement dune position vers la droite des bits de loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) en utilisant le bit de CARRY du registre dtat : le contenu du bit de CARRY devient le nouveau bit 7 de loctet ayant effectu la rotation droite, tandis que lancien bit 0 entre dans CARRY ; avec deux variantes : le rsultat de la rotation peut tre rang soit dans le registre W, soit dans la mmoire RAM la place de loctet utilis pour effectuer la rotation (la nouvelle valeur prend la place de lancienne). - NB : Avant dutiliser cette instruction il convient de pralablement effacer le bit de CARRY . Linstruction qui efface le bit de CARRY est : BCF STATUS,0 (efface le bit zro du registre STATUS, cest -dire le bit de CARRY). - Cette instruction affecte le bit C du registre dtat - 1 cycle dhorloge

106 - Encodage de linstruction:


13 0

00 1100 0

dfff

ffff

C (W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet dont on veut effectuer la rotation droite.

107

SLEEP
- Mise en veilleuse. Cette instruction sutilise non pas pour mettre le C hors tension, mais pour arrter le squencement des instructions (ralentir le signal dhorloge jusqu lextrme limite : la frquence zro). Pendant cette mise en veilleuse, lhorloge externe (faisant partie de ce que nous avons appel le cortge des invariants) est coupe. Le flux du programme est bloqu. Seul le chronomtre du Watch Dog (chien de garde) reste actif. La consommation du botier (qui normalement est de 2 mA) tombe 30 A. Parmi les causes pouvant rveiller le C retenons : une demande dinterruption, ou un signal provenant du chronomtre (timer) du chien de garde. - Cette instruction affecte deux bits du registre dtat : TO (Time Out) passe 1 PD (Power Down) passe 0 En plus, elle met zro le chronomtre du chien de garde, ainsi que le pr diviseur. - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0000 0 0

0110 6

0011 3

108

SUBLW
SUBtract Literal with W - Soustrait le literal (valeur immdiate reprsente par un octet pouvant aller de 00 FF) du contenu du registre W, et place le rsultat dans W. Literal - W = rsultat diminuende - diminuteur = diffrence

- Cette instruction affecte 3 bits du registre dtat : - le flag C (Carry) - le flag DC (Digit Carry) - le flag Z (Zero) - 1 cycle dhorloge - Encodage de linstruction:
13 0

11 110x kkkk kkkk 3 C Valeur de loctet (literal) reprsentant le diminuende (valeur pouvant aller de 00 FF).

109

SUBWF
SUBtract W from File - Soustrait la valeur contenue dans le registre W de la valeur se trouvant (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat (diffrence) peut tre rang soit dans le registre W, soit dans la mmoire RAM la place du diminuende. File (valeur se trouvant lemplacement RAM, le diminuende) - W (valeur contenue dans le registre W, le diminuteur ) Rsultat diffrence - Cette instruction affecte 3 bits du registre dtat : - le flag C (Carry) - le flag DC (Digit Carry) - le flag Z (Zero) - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0010 0 2

dfff

ffff

(W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) laquelle on veut ranger la diffrence.

110

SWAPF
SWAP File - Echange les quatre bits de poids fort dun octet se trouvant (en mmoire RAM) ladresse indique de suite (adresse comprise entre 00 et 4F), avec ses propres quatre bits de poids faible : 1 0 0 0 1 0 1 1 devient 1 0 1 1 1 0 0 0 Avec deux variantes : le rsultat de lchange peut tre plac soit dans le registre W, soit dans la mmoire RAM en lieu et place de loctet utilis pour effectuer le swap. - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 1110 0

dfff

ffff

E (W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet dont on veut changer les quartets.

111

TRIS
TRIState port - NB : cette instruction est spcifique au 16F84. Microchip recommande de ne pas lutiliser, dans le but de laisser les programmes (crits pour ce type de microcontrleur) compatibles avec ceux crits pour dautres modles de PIC. Il suffit de le savoir. Mais ceci nest pas un obstacle pour nous, du fait que notre intrt est exclusivement tourn vers le 16F84. - Charge le registre TRIS (A ou B), et met les lignes de port haute impdance. Ce registre configure, cest dire dfinit le sens de fonctionnement de chacune des lignes des ports A et B ; assigne chaque ligne soit le rle dentre, soit le rle de sortie, sans pour autant provoquer aucune entre ni aucune sortie. - Il sagit dun registre de 8 bits, pouvant tous se programmer individuellement par 0 ou par 1 : 0 = la ligne de port (qui lui correspond) est configure comme sortie 1 = la ligne de port (qui lui correspond) est configure comme entre - Sagissant dun registre lecture/criture simultane, on ne peut pas y crire directement, mais il faut obligatoirement transiter par le registre W. En programmation, on commence par crire loctet de configuration dans W. Puis linstruction TRIS (A ou B), en mme temps quelle adresse ce registre, copie automatiquement loctet de configuration dans le port A ou dans le port B.

112 - Encodage de linstruction :


13 0

00 0000 0110 0 0 6

0fff Ne peut prendre que deux valeurs : 101 (pour dsigner le port A) 110 (pour dsigner le port B)

- Exemple de programmation : MOVLW MOVWF 00000100 (en binaire) TRISB

On charge dans le registre W loctet de configuration de port (ligne 2 en entre, toutes les autres lignes en sortie), que linstruction TRIS valide. A partir de ce moment le port est configur, mais aucune donne ny entre, aucune donne ny sort. Les lignes du port sont mises en haute impdance (tristate).

113

XORLW
EXclusive OR Literal and W - Effectue un OU exclusif (Exclusive OR) entre la valeur immdiate du literal et loctet se trouvant dans le registre W. Le rsultat est rang dans W. - Le literal est un mot de 8 bits (de 00 FF). - Un OR exclusif permet de comparer deux octets bit bit. Si les bits de mme poids sont au mme niveau, le rsultat est zro. Si par contre ils sont des niveaux diffrents, le rsultat est 1. Exemple de XOR entre deux octets : 00110011 01110010 rsultat = 01000001 - Un OR exclusif permet dinverser un tat logique. Exemple : Soit au dpart loctet 11111111. Si le XOR se fait avec 00000000 , rien ne change ; le rsultat est : 11111111. Si par contre le XOR se fait avec 00000001,le rsultat est :11111110 (Alors que les zros ne font rien changer, les 1 provoquent un basculement dtat). - Table de vrit dune porte OU exclusif :

A 0 0 1 1

B 0 1 0 1

Q 0 1 1 0

114 - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

11 1010 kkkk kkkk 3 A Valeur de loctet avec lequel on veut effectuer le OU exclusif (valeur pouvant aller de 00 FF). Pourquoi cette instruction dans le set du 16F84 ? A quoi sertelle pratiquement ? Elle sert lorsque dans un octet on a besoin dinverser un bit en particulier (ou certains bits en particulier). Pour cela il suffit de prparer un masque, cest dire on octet compos de 0 (aux emplacements o se trouvent les bits ignorer) et de 1 (aux emplacements o se trouvent les bits quon veut inverser). Exemple : on souhaite inverser les bits 7, 6, 5 et 4 de loctet 01111010. On prpare alors le masque 11110000 et on fait un OU logique entre loctet et le masque. Comme ceci : 01111010 (octet) 11110000 (masque) Ce qui donne : 10001010 (rsultat) Linstruction XORLW a donc bien invers ltat logique des bits 7, 6, 5 et 4 de loctet se trouvant dans W. Les bits qui taient 0 sont passs 1, et inversement.

115

XORWF
Exclusive OR W and File - Effectue un OU exclusif (Exclusive OR) entre loctet se trouvant dans le registre W et loctet situ (en mmoire RAM) ladresse indique de suite (adresse comprise entre 0C et 4F) ; avec deux variantes : le rsultat peut tre rang soit dans le registre W, soit dans la mmoire RAM la place de loctet utilis pour effectuer le OU exclusif (la nouvelle valeur prend la place de lancienne). - Un OR exclusif permet de comparer deux octets bit bit. Si les bits de mme poids sont au mme niveau, le rsultat est zro. Si par contre ils sont des niveaux diffrents, le rsultat est 1. Exemple de XOR entre deux octets : 00110011 01110010 rsultat = 01000001 - Un OR exclusif permet dinverser un tat logique. Exemple : Soit au dpart loctet 11111111. Si le XOR se fait avec 00000000 , rien ne change ; le rsultat est : 11111111. Si par contre le XOR se fait avec 00000001, le rsultat est :11111110. (Alors que les zros ne font rien changer, les 1 provoquent un basculement dtat). - Table de vrit dune porte OU exclusif :

A 0 0 1 1

B 0 1 0 1

Q 0 1 1 0

116 - Cette instruction affecte le bit Z du registre dtat - 1 cycle dhorloge - Encodage de linstruction:
13 0

00 0110 0 6

dfff

ffff

(W) 0 ou (registre) 1 De 000 1100 100 1111 Adresse de la RAM (entre 0C et 4F) o se trouve loctet avec lequel on veut effectuer le OU exclusif.

Pourquoi cette instruction dans le set du 16F84? A quoi sertelle pratiquement? Elle sert essentiellement lorsque dans un octet on a besoin dinverser un bit en particulier (ou certains bits en particulier). Pour cela il suffit de prparer un masque, cest dire on octet compos de 0 (aux emplacements o se trouvent les bits ignorer) et de 1 (aux emplacements o se trouvent les bits quon veut inverser). Exemple : on souhaite inverser les bits 7, 6, 5 et 4 de loctet 01111010. On prpare alors le masque 11110000 et on fait un OU logique entre loctet et le masque. Comme ceci : 01111010 (octet) 11110000 (masque) Ce qui donne : 10001010 (rsultat) Linstruction XORWF a donc bien invers ltat logique des bits 7, 6, 5 et 4 de loctet en mmoire. Les bits qui taient 0 sont passs 1, et inversement.

117

ENCODAGE des INSTRUCTIONS

Signification des lettres utilises dans lencodage des instructions :


b = position du bit dans loctet sur lequel on opre ( il peut aller de 0 7) d = registre de destination, avec deux variantes : d = 0 : le rsultat est plac dans W d = 1 : le rsultat est plac dans le registre f = gnralement adresse de la mmoire RAM o se trouve loctet concern ( dans lespace mmoire compris entre 00 et 4F). Dans linstruction TRIS : octet de configuration de port k = valeur du literal (ou adresse, dans les instructions CALL et GOTO) w = registre W (accumulateur)

x = valeur indiffrente : peut tre soit 0 soit 1. Lassembleur lui donne automatiquement la valeur 0 (forme recommande par Microchip)

118

Exemples de programmes crits en langage ASSEMBLEUR


Programme 1

a) Organigramme

119

b) Fichier extension .asm


;Titre du programme : PROG1 ;Ce programme allume la LED branche sur la ;sortie RB0 (bit 0 du Port B) et la laisse ;indfiniment allume. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIRECTIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCESSOR 16F84 RADIX HEX INCLUDE P16F84.INC __CONFIG 3FF1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; VECTEUR de RESET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ORG 00 ;Vecteur de Reset. GOTO START ;Renvoi ladresse EEPROM 05 (hexa) ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALISATIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ START ORG 05 ;Saut introduit pour passer au-dessus ;des 5 premires adresses de la mmoire ;EEPROM (00 01 02 03 et 04). CLRF BSF PORTB ;Initialise le Port B. ;Met 1 (set) le bit 5 (RP0) du ;registre dtat (STATUS). ;Autrement dit : slectionne la ;page 1 du Register File (adresses ;de 80 8B) dans laquelle se trouve ;le Registre STATUS ( ladresse 83). ;Met la valeur binaire 00000000 dans ;le registre W, matrialisant ainsi notre ;intention dutiliser les 8 lignes du ;Port B comme SORTIES. ;Port B configur, mais encore en ;haute impdance (Trhee-state). ;Retour la page 0 du Register File.

STATUS,RP0

MOVLW b00000000

MOVWF TRISB BCF STATUS,RP0

120

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LOOP BSF PORTB,0 ;Allume la LED, car linstruction ; BSF met 1 (set). ;Dans le cas prsent, elle met 1 le ;bit zro du Port B (PORTB,0). GOTO END LOOP ;Le programme se reboucle. ;La LED reste indfiniment allume. ;Fin du programme.

c) Fichier extension .hex


020000000528D1 06000A00860183160030A0 080010008600831206140A2881 02400E00F13F80 00000001FF

121

Programme 2 a) Organigramme

122

b) Fichier extension .asm


;Titre du programme : PROG2 ;Ce programme fait clignoter indfiniment la LED branche sur la ;sortie RB0 (bit 0 du Port B). ;Le programme comporte une temporisation (DELAI) pour rendre ;perceptibles les allumages et les extinctions de la LED, sinon les ;transitions auraient lieu trs grande vitesse et notre il ne verrait ;pas les clignotements. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIRECTIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCESSOR 16F84 RADIX HEX INCLUDE P16F84.INC __CONFIG 3FF1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DECLARATIONS DES VARIABLES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ COMPT1 EQU 0C ;On met la variable COMPT1 ;ladresse RAM 0C. COMPT2 EQU 0D ;On met la variable COMPT2 ;ladresse RAM 0D. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; VECTEUR DE RESET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ORG 00 ;Vecteur de Reset. GOTO START ;Renvoi ladresse EEPROM 05 (hexa) ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALISATIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ START ORG 05 ;Saut introduit intentionnellement pour faire ;dmarrer le programme ladresse EEPROM 05. CLRF BSF PORTB ;Efface les 8 bits du Port B. ;Met 1 (set) le bit 5 (RP0) du ;registre dtat (STATUS). ;Autrement dit : slectionne la ;page 1 du Register File (adresses ;de 80 8B) dans laquelle se trouve ;le Registre STATUS ( ladresse 83). ;Met la valeur binaire 00000000 dans ;le registre W, matrialisant ainsi notre ;intention dutiliser les 8 lignes du

STATUS,RP0

MOVLW b00000000

123
;Port B comme SORTIES. ;La notation b00000000 indique que ;la valeur 00000000 est interprter ;en tant que chiffre binaire. MOVWF TRISB BCF STATUS,RP0 ;Port B configur, mais encore en ;haute impdance (Trhee-state). ;Retour la page 0 du Register File.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME PRINCIPAL ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MAIN BCF PORTB,0 ;LED teinte car linstruction ; BCF met 0 (clear). ;Ici, elle met 0 le bit 0 du ;Port B (PORTB,0). CALL BSF DELAI PORTB,0 ;Appelle le sous-programme de ;retard (DELAI). ;LED allume, car linstruction ; BSF met 1 (set). ;Ici elle met 1 le bit 0 du ;Port B (PORTB,0). ;On appelle nouveau le ;sous-programme de retard. ;Retour au programme principal.

CALL GOTO

DELAI MAIN

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SOUS-PROGRAMME de TEMPORISATION ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DELAI DECFSZ COMPT1,1 ;Dcrmente COMPT1et - sil nest pas GOTO DELAI ; zro - va DELAI MOVLW .255 MOVWF COMPT1 DECFSZ COMPT2,1 GOTO DELAI MOVLW .255 MOVWF COMPT1 MOVLW .255 MOVWF COMPT2 RETURN END ;Charge la variable COMPT1 (adresse ;RAM 0C) avec 255 (en dcimal). ;Dcrmente COMPT2, et sil nest pas ; zro, va DELAI ;Recharge COMPT1 avec 255 ;Recharge COMPT2 avec 255 ;Fin du sous-programme DELAI ;Fin du programme.

124

c) Fichier extension .hex


020000000528D1 06000A00860183160030A0 100010008600831206100F2006140F200A288C0B6E 100020000F28FF308C008D0B0F28FF308C00FF3025 040030008D00080037 02400E00F13F80 00000001FF

125

PROGRAMME 3 a) Organigramme

126

b) Fichier extension .asm


;Titre du programme : PROG3 ;Ce programme fait clignoter un certain nombre de fois la LED ;branche sur la sortie RB0 (bit 0 du PORT B), puis fait clignoter ;un certain autre nombre de fois la LED branche sur la sortie ;RB1 (bit 1 du Port B), et recommence le cycle indfiniment. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIRECTIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCESSOR 16F84 RADIX HEX INCLUDE P16F84.INC __CONFIG 3FF1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DECLARATIONS DES VARIABLES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ COMPT1 EQU 0C ;On met la variable COMPT1 ; ladresse RAM 0C. COMPT2 EQU 0D ; On met la variable COMPT2 ; ladresse RAM 0D. nFOIS EQU 0E ; On met la variable nFOIS ; ladresse RAM 0E. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; VECTEUR DE RESET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ORG 00 ;Vecteur de Reset. GOTO START ;Renvoi ladresse EEPROM 05 (hexa) ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALISATIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ START ORG 05 ;Saut introduit intentionnellement pour faire ;dmarrer le programme ladresse EEPROM 05. CLRF BSF PORTB ;Efface les 8 bits du Port B. ;Met 1 (set) le bit 5 (RP0) du ;registre dtat (STATUS). ;Autrement dit : slectionne la ;page 1 du Register File (adresses ;de 80 8B) dans laquelle se trouve ;le Registre STATUS ( ladresse 83). ;Met la valeur binaire 00000000 dans ;le registre W, matrialisant ainsi notre ;intention dutiliser les 8 lignes du

STATUS,RP0

MOVLW b00000000

127
;Port B comme SORTIES. ;La notation b00000000 indique que ;la valeur 00000000 est interprter ;en tant que chiffre binaire. MOVWF TRISB BCF GOTO STATUS,RP0 MAIN1 ;Port B configur, mais encore en ;haute impdance (Trhee-state). ;Retour la page 0 du Register File. ;Renvoi ladresse correspondant ;la label MAIN1.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SOUS-PROGRAMME de TEMPORISATION ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TEMPO MOVLW .255 ;Charge COMPT2 ( grande boucle ) MOVWF COMPT2 ;avec la valeur dcimale 255. DELAI2 MOVLW .255 MOVWF COMPT1 DELAI1 DECFSZ COMPT1,1 GOTO DELAI1 DECFSZ COMPT2,1 GOTO DELAI2 RETURN ;Charge COMPT1 ( petite boucle ) ;avec la valeur dcimale 255. ;Dcrmente COMPT1et - sil nest pas ; zro - va DELAI1 ;Dcrmente COMPT2, et sil nest pas ; zro, va DELAI2. ;Fin du sous-programme TEMPO.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME PRINCIPAL ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MAIN1 MOVLW .2 ;On dfinit le nombre de cycles de la MOVWF nFOIS ;premire phase (ici : 2 clignotements) LED1 BCF PORTB,0 ;LED teinte car linstruction ; BCF met 0 (clear). ;Ici, elle met 0 le bit 0 du ;Port B (PORTB,0). ;Appelle le sous-programme de ;retard (TEMPO). ;LED allume, car linstruction ; BSF met 1 (set). ;Ici elle met 1 le bit 0 du ;Port B (PORTB,0). ;On appelle nouveau le ;sous-programme de retard.

CALL BSF

TEMPO PORTB,0

CALL

TEMPO

128
DECFSZ nFOIS,1 GOTO LED1 GOTO MAIN2 ;Dcrmente le nombre de cycles ;affects LED1, et si le compteur ;nest pas arriv 0, effectue un ;nouveau cycle. Si par contre nFOIS ;est 0, linstruction GOTO LED1 ;est ignore et le programme saute ; GOTO MAIN2 . ;On dfinit le nombre de cycles de la ;deuxime phase (ici :5 clignotements) ;LED teinte car linstruction ; BCF met 0 (clear). ;Ici, elle met 0 le bit 1 du ;Port B (PORTB,1). ;Appelle le sous-programme de ;retard (TEMPO). ;LED allume, car linstruction ; BSF met 1 (set). ;Ici elle met 1 le bit 1 du ;Port B (PORTB,1). ;On appelle nouveau le ;sous-programme de retard. ;Dcrmente le nombre de cycles ;affects LED2, et si le compteur ;nest pas arriv 0, effectue un ;nouveau cycle. Si par contre nFOIS ;est 0, linstruction GOTO LED2 ;est ignore et le programme saute ; GOTO MAIN1 . ;Fin du programme.

MAIN2 LED2

MOVLW .5 MOVWF nFOIS BCF PORTB,1

CALL BSF

TEMPO PORTB,1

CALL

TEMPO

DECFSZ nFOIS,1 GOTO LED2 GOTO MAIN1

END

129

c) Fichier extension .hex


020000000528D1 06000A00860183160030A0 10001000860083121428FF308D00FF308C008C0B7B 100020000F288D0B0D28080001308E0006140B20C0 1000300006100B208E0B16281D2802308E00861409 0C0040000B2086100B208E0B1F281428AC 00000001FF

130

PROGRAMME 4

a) Organigramme

131

b) Fichier extension .asm


;Titre du programme : PROG4 ;Ce programme fait clignoter une LED ;branche sur la sortie RB0 (bit 0 du PORT B), si lentre RA4 ;(bit 4 du Port A) est active. ;En dsactivant RA4, la LED steint. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIRECTIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCESSOR 16F84 RADIX HEX INCLUDE P16F84.INC __CONFIG 3FF1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DECLARATIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STATUS EQU 03 ; Aurions pu ne pas les RP0 EQU 05 ; dclarer, car ces PORTA EQU 05 ; quivalences sont PORTB EQU 06 ; dfinies dans le fichier TRISA EQU 85 ; INCLUDE P16F84.INC . TRISB EQU 86 ; Cest redondant. Mais ce nest START EQU 05 ; pas interdit. COMPT1 EQU 0C ;On met la variable COMPT1 ; ladresse RAM 0C. COMPT2 EQU 0D .On met la variable COMPT2 ; ladresse RAM 0D. nFOIS EQU 0E ;On met la variable nFOIS ; ladresse RAM 0E. ORG GOTO ORG 00 START 05 ;Vecteur de Reset. ;Renvoi ladresse EEPROM 05 (hexa) ;Voulons intentionnellement faire ;dmarrer le programme ladresse EEPROM 05.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALISATIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLRF BSF PORTB STATUS,RP0 ;Efface les 8 bits du Port B. ;Met 1 (set) le bit 5 (RP0) du ;registre dtat (STATUS). ;Autrement dit : slectionne la ;page 1 du Register File pour atteindre ;le Registre TRISB ( ladresse 86).

132
MOVLW 00 MOVWF TRISB MOVLW 0xFF MOVWF TRISA ;Met des zros dans le registre W, ;pour les porter ensuite dans le ;Registre TRISB ;matrialisant ainsi notre intention ;dutiliser les 8 lignes du Port B ;comme sorties. ;Met 11111111 dans le Registre W, ;pour les porter ensuite dans le ;Registre TRISA ;matrialisant ainsi notre intention ;dutiliser les 8 lignes du Port A ;comme entres. ;Retour la page 0 du Register File. ;Renvoi au programme principal.

BCF GOTO

STATUS,RP0 MAIN

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SOUS-PROGRAMMES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TEMPO MOVLW .255 MOVWF COMPT2 DELAI2 MOVLW .255 MOVWF COMPT1 DELAI1 DECFSZ COMPT1,1 GOTO DELAI1 ;Dbut du sous-programme TEMPO ;Charge COMPT2 ( grande boucle ) ;avec la valeur dcimale 255 ;Charge COMPT1 (petite boucle ) ;avec la valeur dcimale 255 ;Dcrmente COMPT1, et sil nest pas ;arriv zro, va DELAI1. Ces deux ;instructions permettent de vider la ;variable COMPT1 (qui est une zone ;RAM et qui pourrait, au dmarrage du ;systme, contenir une valeur ;alatoire), pour ensuite lui donner ;une valeur prcise. ;Dcrmente COMPT2, et sil nest ;pas zro, va DELAI2, grande ;boucle engendrant un retard long ;COMPT2 fois la valeur de COMPT1. ;Fin du sous-programme TEMPO ;et retour au programme principal ; la ligne situe juste aprs ;linstruction CALL TEMPO . ;Dbut du sous-programme LED BSF PORTB,0 ;Allume la LED.

DECFSZ COMPT2,1 GOTO RETURN DELAI2

LED

133
CALL BCF CALL RETURN TEMPO PORTB,0 TEMPO ;Appel du sous-programme de ;temporisation. ;Eteint la LED. ;Nouvel appel du sous;programme de temporisation. ;Fin du sous-programme LED .

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME PRINCIPAL ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MAIN BTFSS PORTA,4 ;Est-ce que lentre RA4 est active ? GOTO CALL GOTO END MAIN LED MAIN ;NON. Alors on continue tester. ;OUI. Dans ce cas on appelle le ;sous-programme LED. ;Retour au programme principal.

c) Fichier extension .hex


020000000528D1 06000A00860183160030A0 100010008600FF30850083121B28FF308D00FF30E3 100020008C008C0B11288D0B0F28080006140D2056 0E00300006100D200800051E1B2816201B2898 00000001FF

134

PROGRAMME 5

Fichier extension .asm


;Titre du programme : PROG5 ;Ce programme fait clignoter une LED ;en utilisant les interruptions gnres ;par le timer interne (TMR0). ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIRECTIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCESSOR 16F84 INCLUDE P16F84.INC __CONFIG 3FF1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DECLARATIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SAVE_W SAVE_STAT EQU EQU 0C 0D ;Dclaration de ;deux variables.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; VECTEURS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ORG 00 ;Vecteur de Reset. GOTO START ORG GOTO 04 INT_VECT ;Vecteur dinterruption.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; START ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ START ORG 05 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALISATIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BSF STATUS,RP0 ;On passe en Page 1. ;Port B en sortie.

MOVLW b00000000 MOVWF TRISB

135
MOVLW b00000111 MOVWF OPTION_REG BCF CLRF CLRF STATUS,RP0 TMR0 PORTB ;On configure OPTION. .Le pr diviseur divise par 255. ;On revient en Page 0. ;Timer zro. ;Toutes LED teintes. ;On configure INTCON. ; - GIE (bit 7) 1 ; - T0IE (bit 5) 1 ; - tous les autres bits zro.

MOVLW b10100000 MOVWF INTCON

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME PRINCIPAL ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LOOP GOTO LOOP ;Boucle introduite juste pour occuper ;le processeur, car le but du programme ;est dattendre lapparition du signal ;dinterruption. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME dINTERRUPTION ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INT_VECT MOVWF SAVE_W MOVF STATUS,W MOVWF SAVE_STAT BCF INTCON,T0IF ;Phase de PUSH (store). ;On sauve le Registre W ;ainsi que le Registre ;STATUS. ;On met zro le flag ;T0IF qui passe 1 chaque ;dbordement du TMR0 ;(bit 2). ;On allume la LED RB0. ;On teint la LED RB0. ;Phase de POP (restore). ;On remet en place le :Registre STATUS, ainsi ;que le Registre W.

BTFSC GOTO BSF GOTO LED_OFF FIN BCF

PORTB,0 LED_OFF PORTB,0 FIN PORTB,0

MOVF SAVE_STAT,W MOVWF STATUS MOVF SAVE_W,W RETFIE

;Lorsquune interruption est gnre, ;le PIC met automatiquement zro le ;bit GIE du Registre INTCON pendant ;toute la dure dexcution du ;sous-programme dinterruption (pour

136
;empcher la prise en compte dune ;nouvelle interruption pouvant surgir, ;alors quil est justement en train den ;traiter une. (On dit que pendant ce ;temps-l les interruptions sont ;masques). :Linstruction RETFIE, en mme temps ;quelle provoque le retour au ;programme principal, remet 1 le bit ;GIE (Global Interrupt Enable). END

137

PROGRAMME 6

Fichier extension .asm


;Titre du programme : PROG6 ;Ce programme fait clignoter une LED ;en utilisant les interruptions gnres ;par le timer interne (TMR0), et - en plus - allume et laisse ;toujours allume une deuxime LED branche sur RB1. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIRECTIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCESSOR 16F84 INCLUDE P16F84.INC __CONFIG 3FF1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DECLARATIONS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SAVE_W SAVE_STAT CHOIX COMPT EQU EQU EQU EQU 0C 0D 0E 0F ;Variables

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; VECTEURS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ORG 00 ;Vecteur de Reset. GOTO START ORG GOTO 04 INT_VECT ;Vecteur dinterruption.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; START ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ START ORG 05 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALISATIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BSF STATUS,RP0 ;On passe en Page 1.

138
MOVLW b00000000 MOVWF TRISB MOVLW b00000111 MOVWF OPTION_REG BCF CLRF CLRF STATUS,RP0 TMR0 PORTB ;Port B en sortie. ;On configure OPTION. .Le pr diviseur divise par 255. ;On revient en Page 0. ;Timer zro. ;Toutes LED teintes. ;On configure INTCON. ; - GIE (bit 7) 1 ; - T0IE (bit 5) 1 ; - tous les autres bits zro.

MOVLW b10100000 MOVWF INTCON

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME PRINCIPAL ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ MAIN BSF PORTB,1 ;On allume la LED (BR1) et on la GOTO MAIN ;laisse toujours allume, en attendant ;lapparition dune interruption. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME dINTERRUPTION ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INT_VECT MOVWF SAVE_W MOVF STATUS,W MOVWF SAVE_STAT BCF INTCON,T0IF ;Phase de PUSH (store). ;On sauve W ;et STATUS dans la RAM. ;On met zro le flag ;T0IF qui passe 1 chaque ;dbordement du TMR0 ;(bit 2). ;On allume la LED RB0. ;On teint la LED RB0. ;Phase de POP (restore). ;On remet en place :STATUS et W.

BTFSC GOTO BSF GOTO SUITE FIN BCF

PORTB,0 SUITE PORTB,0 FIN PORTB,0

MOVF SAVE_STAT,W MOVWF STATUS MOVF SAVE_W,W RETFIE

;Lorsquune interruption est gnre, ;le PIC met automatiquement zro le ;bit GIE du Registre INTCON pendant ;toute la dure dexcution du ;sous-programme dinterruption (pour

139
;empcher la prise en compte dune ;nouvelle interruption pouvant surgir, ;alors quil est justement en train den ;traiter une. (On dit que pendant ce ;temps-l les interruptions sont ;masques). :Linstruction RETFIE, en mme temps ;quelle provoque le retour au ;programme principal, remet 1 le bit ;GIE (Global Interrupt Enable). END

140

PROGRAMME 7

Fichier extension .asm


;Titre du programme : PROG7 ;Ce programme active un chenillard sur 4 LED ;utilisant les bits 0, 1, 2, et 3 du Port B. ;Chaque LED sallume pendant un temps calibr de juste 1 minute ;(60 secondes) fourni par le TMR0 en association avec un compteur. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DIRECTIVES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PROCESSOR 16F84 INCLUDE P16F84.INC __CONFIG 3FF1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DECLARATIONS des VARIABLES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SHIFT EQU 0C COMPT1 EQU 0D ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; VECTEURS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ORG 00 ;Vecteur de Reset. GOTO START ;Renvoi ladresse EEPROM 05 ORG GOTO 04 INT_VECT ;Vecteur dinterruption. ;Renvoi au programme dinterruption.

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; INITIALISATIONS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ START ORG 05 ;Saut introduit intentionnellement ;pour passer au-dessus des adresses ;EEPROM 01 02 03 et 04, ;et obliger le programme dmarrer ; ladresse 05. BSF STATUS,RP0 ;On passe en Page 1 pour atteindre ;TRISB (adresse 86) et OPTION ;(adresse 81). ;Port B configur en sortie (0=sortie). ;Pr diviseur affect au TMR0, et

MOVLW b00000000 MOVWF TRISB MOVLW b00000100

141
MOVWF OPTION_REG BCF STATUS,RP0 ;configurer pour diviser par 32. ;On revient en Page 0.

MOVLW .125 MOVWF COMPT1 MOVLW b10100000 MOVWF INTCON ;On configure le Registre INTCON : ; - GIE (bit 7) 1 ; - T0IE (bit 5) 1 ; - tous les autres bits zro

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME PRINCIPAL ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LOOP1 GOTO LOOP1 ;Boucle introduite pour occuper le ;processeur, car le but principal du ;programme est dattendre lapparition ;du signal dinterruption pour ;dclencher lanimation du chenillard. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; PROGRAMME dINTERRUPTION ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INT_VECT MOVLW b00000001 ;On allume la LED MOVWF SHIFT ;branche sur RB0, MOVF SHIFT,0 ;en transitant par MOVWF PORTB ;la variable SHIFT. BCF RLF STATUS,0 SHIFT,1 ;Pour crer un effet de ;chenillard, on utilise ;linstruction RLF (Rotate ;Left File) laquelle : ; 1) provoque un glissement (rotation) ; gauche (Left), et ; 2) insre le contenu du bit de CARRY ; dans le bit 0 du Registre STATUS. ; Comme on ignore la valeur (0 ou 1) ; de la CARRY, il est impratif de ; leffacer au pralable. SHIFT,4 ;Lorsque de rotation en

BTFSC rotation

SWAPF

;le 1 baladeur atteint le bit 4, on ;provoque un SWAP (croisement) entre ;le demi octet de poids faible et le demi ;octet de poids fort (on inverse les ;demi octets) SHIFT,1 ;Aprs chaque rotation, loctet est ;gard dans le mme Registre SHIFT, ;pour y voluer. DELAI ;On appelle le sous programme DELAI

CALL

142

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SOUS-PROGRAMME de TEMPORISATION ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DELAI MOVLW .6 MOVWF TMR0 MOVF BTFSS TMR0,0 STATUS,Z ;On initialise le TMR0 avec la valeur ;6 (dcimal), afin quil dborde ;aprs 250 impulsions. ;On porte la valeur du TMR0 dans ;W pour pouvoir la tester : ;a-t-elle vu arriver (256 6) ;250 impulsions ? ;Cest dire : est-ce que le TMR0 ;est arriv FF ? ;Si NON : on continue tester. ;Si OUI : on recharge TMR0 ;avec 6 (dcimal) et ensuite ;on dcrmente la variable COMPT1 ;Est-ce que COMPT1 = 0 ? ;NON : on continue dcrmenter. ;OUI : 1 seconde sest coule. ;On recharge ;le TMR0. ;On recharge ;la variable COMPT1. ;Fin du sous-programme DELAI. ;Fin du programme.

TEST

GOTO MOVLW MOVWF DECFSZ GOTO

TEST .6 TMR0 COMPT1,1 TEST

MOVLW .6 MOVWF TMR0 MOVLW .125 MOVWF COMPT1 RETURN END