7142421-coursmicroreduit.pdf

Embed Size (px)

Citation preview

  • Formation 21/21 sur le thme :

    Assure par : ZAIDI Abdelaziz et Hmidne Ali

    Institut Suprieur des Etudes Technologiques de Sousse

    Microcontrleurs PIC16FXX

    2006/2007

    1

  • Sommaire

    A- Les microprocesseurs et les microcontrleurs 1- Historique . 2- Lactualit. 3- Architectures d'une Machine 4- Diffrence entre un microprocesseur et un microcontrleur .. 5- Quelques microcontrleurs connus . 6- Microcontrleurs et applications ..

    3 3 3 4 4 9

    B- Composition et fonctionnement des PICs

    1- Quest-ce quun PIC ?........................................................................................... 2- Les diffrentes familles des PICs.

    10 11

    C- Le PIC 16F84 1- Caractristiques gnrales du microcontrleur. 2- Architecture interne.. 3- Organisation du 16F84. 4- Les ports dentre/sortie.. 5- Les SFR (registres fonction spciale).. 6- Organisation des instructions. 7- Organisation dun fichier .asm 8- Les modes dadressage. 9- Ralisation dun programme embarqu .. 10- Les interruptions 11-Timer0 12- Les accs en mmoire eeprom . 13- Le watchdog (chien de garde) 14- Le mode Sleep (veille)

    11 12 13 15 16 16 20 27 29 36 41 45 47 48

    D- Le PIC 16F877 1- Introduction . 2- Les Ports du 16F877 3- La mmoire du Pic 4- Les modules internes du 16F877.. 4.1. Les Trois timers / compteurs.

    4.2. Un convertisseur analogique-numrique (CAN) 10 bits . 4.3. Les deux modules CCP et la gnration (PWM) 4.4 Le module MSSP en mode SPI . 4.5. Le module USART 4.6. Port D en mode PSP 4.7. liaison I2C

    5- Les Interruptions du 16F877

    50 52 54 55 56 60 68 72 73 79 80 85

    2

  • A-Les microprocesseurs et les microcontrleurs 1-Historique Avant les annes 50 John Mauchley et Prespert Eckert, construisent l'ENIAC : 18000 tubes, 1500 relais, consomme 140 kW. La mmoire de programme est un panneau de cblage. La mmoire des donnes comporte 20 mots de 10 chiffres dcimaux. L'Eckert-Mauchly Corporation lance son premier ordinateur, l'UNIVAC, en 1951. BULL lance son premier ordinateur, le Gamma 2, en 1951. IBM lance son premier ordinateur, le 701, en 1953. L'invention du transistor en 1948 marque le vrai dpart de lindustrie informatique. DEC lance le premier mini-ordinateur, le PDP-1 en 1961. IBM lance le 7090 en 1961. Le plus gros du moment. CDC lance le CDC 6600 en 1964. Le premier ordinateur parallle (conu par Seymour Cray) restera longtemps le plus puissant. IBM lance la mme anne la srie 360. Le premier ordinateur dot d'une unit de commande microprogramme et d'un vrai systme d'exploitation (la premire catastrophe logicielle). DEC invente le bus et lance le PDP-8 en 1965. INTEL invente le microprocesseur en 1971. 2-Lactualit Deux marques se partagent le march des processeurs destins aux ordinateurs : INTEL, grce IBM, ses PC et tous les compatibles qui sont apparus. MOTOROLA, grce Apple Computers et son Macintosh. 3-Architectures d'une Machine 3.1 Architecture de Von Neumann John Von Neumann : Brillant mathmaticien, il fixe pour jusqu' prsent l'architecture d'un ordinateur ( son poque, le mot n'est pas encore invent). constitution : Mmoire, Unit centrale, Communications. Dans ce cas, le traitement dune instruction et son oprande ncessite donc la lecture dau moins deux cases mmoires (3 si loprande est code sur deux octets). Cela correspond une dure de 2 ou 3 cycles machine. 3.2 Architecture de Harvard Cette architecture repose sur le principe de sparation de la mmoire-donnes de la mmoire-programme. Dans ce cas, la lecture dune seule case mmoire permet le traitement entier dune instruction et de son oprande. Un seul cycle machine est donc ncessaire. 3.3 Architectures Parallles Amlioration de l'unit centrale d'une architecture de Von Neumann ou de Harvard. Nouvelles architectures de machine.

    3

  • 4-Diffrence entre un microprocesseur et un microcontrleur Avec un microprocesseur dusage gnral, pour raliser une application bien dtermine, le microprocesseur et ses composants annexes (mmoire RAM, ROM,) doivent tre relis des circuits priphriques spcialiss tels que des ports parallles (entres/sorties logiques), des convertisseurs analogiques/numriques, des transmetteurs/rcepteurs srie (UART)

    Afin de rpondre ces besoins, les fabricants de semiconducteurs on eu lide de regrouper toutes ces fonctions dans un seul circuit spcialis : le microcontrleur.

    5-Quelques microcontrleurs connus 5.1 Le 80C552 de PHILIPS (noyau 8051 de Intel): Le 80C552 est un microcontrleur de 8bits. Il est fabriqu dans un processus suprieur de CMOS et c'est un driv de la famille des microcontrleurs 80C51. Il utilise les instructions mises pour le 80C51 en addition des registres de la fonction spciale qui sont incorpors pour contrler les priphriques.

    Microcontrleur

    4

  • Le schma synoptique de la figure au dessous, prsente les diffrents blocs internes du microcontrleur qui sont les suivants:

    - 8 koctets de ROM interne (mmoire programme) extensible jusqu' 64Koctets. - 256 octets de RAM (mmoire donnes) interne extensible jusqu' 64Koctets. - 2 Timers 16 bits standard (T0 et Tl). - Un troisime Timer de 16 bits (T2) coupl quatre registres de capture et trois

    registres de comparaison. - Convertisseur analogique numrique quip de huit entres dont la rsolution est de 10

    bits. - 2 sorties (PWM) de rsolution 8 bits. - 5 ports bidirectionnels. - Un port unidirectionnel.

    -Un systme de gestion d'interruption sur deux niveaux de priorit. -Un port srie du type USART. -Un module watchdog.

    La frquence maximale dhorloge est de 24 MHz. Pour un quartz de 12 MHz, la dure dun cycle machine est dune microseconde. 5

  • 5.2 Le 68HC11 de Motorola :

    Structure interne Le microcontrleur Motorola 68HC11 peut fonctionner avec des horloges allant jusqu'a 12MHz. Tous les registres tant statiques, une coupure d'horloge n'entrane pas de perte de donne. Le 68HC11 intgre de puissants priphriques :

    Jusqu'a 12KO de ROM ou d'EPROM (mmoire programme) Jusqu'a 1 KO de RAM (mmoire donne) Jusqu'a 8KO d'EEPROM (mmoire donne) Ports parallles Port de communication srie asynchrone Port de communication srie synchrone Ports analogiques Timers Chien de garde Gnration d'interruptions temps rel

    6

  • Le 68HC11 est disponible suivant les versions en botier DIP ou PLCC. Le modle fonctionnel du 68HC11Ex est donn ci-dessus. Des blocs fonctionnels peuvent tre diffrents ou absents dans certaines versions.

    Modes de fonctionnement

    - Single-Ship: Fonctionnement autonome, tous les ports du microcontrleur sont disponibles, par contre la memoire est limite la capacit interne - Expended multiplexed: Ce mode permet d'tendre la capacit mmoire ainsi que les peripheriques. L'ensemble devient plus puissant mais le matriel est plus complexe et deux ports 8 bits sont perdus sur Ie microcontrleur - Special Bootstrap : Lors du RESET un logiciel interne appel BOOTLOADER

    tlcharge automatiquement en RAM un programme provenant de la liaison srie asynchrone (SCI) et excute celui-ci. Ce mode est utilis pour stocker distance des valeurs de consigne (pour une rgulation par exemple) ou pour Ie dveloppement . - Special Test: Destin au dpart aux tests de production de Motorola, ce mode peut tre utilis pour le dveloppement, en particulier pour I'mulation, il permet entre autre de modifier le registre CONFIG aprs le RESET

    5.3 Le AT90S8535 de ATMEL

    Description :

    Le microcontrleur AT90S8535 est produit par ATMEL. Il sagit dun microcontrleur 8 bits, qui intgre de nombreux priphriques, ainsi que diffrents types de mmoire. La figure suivante prsente larchitecture interne du microcontrleur.

    7

  • Constitution:

    - CPU 8 Bits capable dexcuter une instruction par cycle dhorloge. - 8 Koctets de mmoire programme EEPROM FLASH programmable in situ. - 512 Octets dEEPROM (Stockage de donnes non volatiles) - 512 Octets de RAM (donnes) statique. - Convertisseur Analogique Numrique 10 bits 8 entres multiplexes. - Liaisons sries synchrone (SPI) et asynchrone (SCI) - 2 TIMERS 8 bits (dont 1 utilisable en RTC a laide dun oscillateur externe) - 1 TIMER 16 bits. - 1 Comparateur de tensions analogiques. - 2 entres dinterruptions externes et une entre de RESET. - 4 Ports dentres/sorties 8 bits. La frquence maximale dhorloge est de 8MHz ce qui donne 8MIPS (8 Milliers dInstructions Par Seconde). Le botier peut tre un botier DIL ou PLCC.

    7

  • Espace mmoire :

    La taille du bus de donnes est de 8 bits, les mmoires de donnes (SRAM et EEPROM) sont donc organises en mot de 8 bits. Les instructions excutables par lunit arithmtique et logique sont codes sur 16 bits, la mmoire de programme (FLASH) est donc organise en mots de 16 bits.

    Lespace de donnes est compltement spar de lespace adressable de la mmoire programme, ils possdent chacun leur propre bus dadresses et de donnes (Architecture de HARVARD).

    Le CPU : Le microprocesseur du AT90S8535 comporte : - Un bloc de 32 registres, contenant les donnes traiter, - Une unit arithmtique et logique (ALU) rapide, qui est capable dexcuter une instruction, (de registre registre) par cycle dhorloge, - Un compteur programme, - Un registre dinstruction et un dcodeur dinstruction, et un cache dinstruction.

    8

  • 6- Microcontrleurs et applications Dautres fabricants proposent dautres microcontrleurs. Par exemple :

    Parallax (Srie Basic Stamp) Arizona Microchip (Srie PIC) Rabbit Semiconductor (Srie Rabbit)

    Il sagit dun march gigantesque : Arizona Microchip dclare avoir vendu plus de 1,5 milliards dunits (2001). Les caractristiques principales dun microcontrleur sont : De nombreux priphriques dE/S Une mmoire de programme Une mmoire vive (en gnral de type SRAM) Eventuellement une mmoire EEPROM destine la sauvegarde par programme de donnes la coupure de lalimentation. Un processeur 8 ou 16 bits. Faible consommation lectrique Les tailles mmoire sont en gnral rduites, de lordre de : 16 koctets pour la mmoire programme Quelques octets 16 koctets pour la RAM La puissance de calcul est aussi limite : 0.012 MIPS pour les Basic Stamp 1 5 MIPS pour les PIC 20 MIPS pour les Rabbit Pour rfrence, un 80286 6MHz permet datteindre 0.9 MIPS, alors que la puissance de calcul dun Pentium 4 est de lordre de 5000 MIPS. Les nouvelles gammes de microcontrleurs prsentent des capacits importantes de calcul. Les microcontrleurs sont conus pour lusage dans plusieurs applications :

    Instrumentation

    9

  • Contrle industriel Contrle des automobiles Commande des machines Electromnager, Hi-Fi

    Nous allons durant ce cours tudier les microcontrleurs PIC. Ces microcontrleurs prsentent trois avantages majeurs : Le cot, le jeux dinstruction rduit et la facilit de chargement du programme avec, bien sr, toutes les fonctionnalits dun microcontrleur moderne. B- Composition et fonctionnement des PICs Nous allons maintenant nous pencher sur un PIC, et en particulier sur le 16F84. Rassurez-vous, tout ce que nous verrons sur le 16F84 pourra tre directement utilis sur les PIC16F877, qui ne sont rien dautre que des 16F84 amliores. Chaque PIC dispose des fonctionnalits des modles infrieurs, augmentes de nouvelles fonctions. Tout dabord, vous devez tlcharger le datasheet du 16F84, car cest un document qui facilite la comprhension de ce cours. Durant ce cours, on vous rfre des pages voir sur le datasheet, pour plus dinformations. Il est vivement conseill de limprimer, car vous en aurez toujours besoin quand vous vous lancerez dans la ralisation de vos propres programmes. Le datasheet du 16F877 vous serais aussi utile dans le cas ou vous aimeriez approfondir vos connaisances sur ce qui se passe rllement lintrieur du PIC, pour les priphriques qui sont intgrs dans le microcontrleur volu 16F877. 1- Quest-ce quun PIC ? Un PIC nest rien dautre quun microcontrleur, cest dire une unit de traitement de linformation de type microprocesseur laquelle on a ajout des priphriques internes permettant de raliser des montages sans ncessiter lajout de composants externes.

    La dnomination PIC est sous copyright de Microchip, donc les autres fabricants ont t dans limpossibilit dutiliser ce terme pour leurs propres microcontrleurs. Les PICs sont des composants dits RISC (Reduce Instructions Construction Set), ou encore composant jeu dinstructions rduit. Pourquoi ? Et bien, sachez que plus on rduit le nombre dinstructions, plus facile et plus rapide en est le dcodage, et plus vite le composant fonctionne.

    Toutes les PICs Mid-Range ont un jeu de 35 instructions, stockent chaque instruction dans un seul mot de programme, et excutent chaque instruction (sauf les sauts) en 1 cycle. On atteint donc des trs grandes vitesses, et les instructions sont de plus trs rapidement assimiles. Lhorloge fournie au PIC est prdivise par 4 au niveau de celui-ci. Cest cette base de temps qui donne le temps dun cycle.

    10

  • Si on utilise par exemple un quartz de 4MHz, on obtient donc 1000000 de cycles/seconde, or, comme le pic excute pratiquement 1 instruction par cycle, hormis les sauts, cela vous donne une puissance de lordre de 1MIPS (1 Million dInstructions Par Seconde).

    Pensez que les pics peuvent monter 20MHz. Cest donc une vitesse de traitement

    plus quhonorable. 2- Les diffrentes familles des PICs La famille des PICs est subdivise en 3 grandes familles : La famille Base-Line, qui utilise des mots dinstructions de 12 bits, la famille Mid-Range, qui utilise des mots de 14 bits (et dont font partie le 16F84 et 16F877), et la famille High-End, qui utilise des mots de 16 bits.

    Nous nous limiterons dans cet ouvrage la famille Mid-Range, sachant que si vous avez tout compris, vous passerez trs facilement une autre famille, et mme un autre microcontrleur.

    Notez ds prsent que les datasheets du 16F84 et 16F877 nest quune petite partie de la documentation complte. Pour obtenir la documentation complte, vous ajoutez encore plus de 600 pages en tlchargeant chez Microchip les datasheets pour la gamme Mid-Range.

    Cependant, la documentation de base suffit pour 99,9% des applications, et, de plus,

    les datasheets Mid-Range sont disponibles sous la forme dun fichier par chapitre.

    Notez ds prsent que les PICs sont des composants STATIQUES, cest dire que la frquence dhorloge peut tre abaisse jusqu larrt complet sans perte de donnes et sans dysfonctionnement. Une version 10 peut donc toujours tre employe sans problme en lieu et place dune 04. Pas linverse, naturellement.

    Ceci par opposition aux composants DYNAMIQUES, donc la frquence dhorloge doit rester dans des limites prcises. Nessayez donc pas de faire tourner votre PIII/500 166MHz, car cest un composant dynamique. Nous allons traiter dans ce cours le PIC16f84 qui est le microcontroleur de base de cette famille. Par la suite, on tudiera le 16F877 en dcrivant surtout ses priphriques.

    C-Le PIC 16F84:

    1-Caractristiques gnrales du microcontrleur:

    - Microcontrleur 8 bits.

    - Unit centrale de traitement avec une architecture RISC (Reduced Instruction

    Set Computer).

    - 1024 mots mmoire programme (flash).

    11

  • - 68 octets mmoire de donne (RAM).

    - 64 octets mmoire de donne (EEPROM).

    - Bus programme (mot dinstruction) ; 14 bits.

    - Bus de donne ; 8 bits.

    - 15 registres fonction spciale (SFR).

    - 35 instructions : toutes les instructions prennent un seul cycle sauf les

    branchements, ils prennent deux cycles.

    - Adressage direct, indirect et relatif.

    - 4 sources d'interruptions.

    - Frquence maximum d'horloge : 10Mhz.

    - Temps de cycle d'instruction : 200ns.

    - 13 entres/sorties avec contrle individuel de direction.

    - Courant maximum d'entre (par broche) : 25mA.

    - Courant maximum de sortie (par broche) : 20mA.

    - TMR0:8 bits temporisateurs/compteur programmable.

    - Chien de garde interne avec son propre oscillateur.

    - Programmation en mode srie travers deux broches (RB7 et RB6).

    - Plage de tension de Vdd entre 2V et 5.5V.

    - Botier de 18 broches (PDIP) : voir figure 1.2.

    Fig1.Brochage du 16f84

    2-Architecture interne:

    La famille des microcontrleurs PIC 16F8X utilise l'architecture RISC, cette architecture permet une accessibilit spare de la mmoire programme et celle de donne .Par consquent on deux bus : bus pour la mmoire donne et un autre pour la mmoire programme. L'UAL (Unit Arithmtique et Logique) est de 8 bits, elle communique avec un

    12

  • registre de travail (W). Elle peut affecter le contenu des bits ; carry (C), digit carry (DC) et Zro (Z) du registre d'tat (status), tout cela dpend du type d'instruction. La figure 2 montre la structure interne du 16f84 :

    3-Organisation du 16F84 La mmoire du 16F84 est divise en 3 parties. Page 4 du datasheet, vous trouverez la table 1-1 qui donne un aperu de la famille 16F8X. Les numros de pages peuvent varier en fonction des mises jour de Microchip. Vous devrez peut-tre chercher un peu. Pour ceux qui veulent tout comprendre, la figure 3-1 de la page 8 montre lorganisation interne dun 16F84.

    3.1 La mmoire programme

    La mmoire programme est constitue de 1K mots de 14 bits. Cest dans cette zone que vous allez crire votre programme. Ceci explique pourquoi vos fichiers sur PC font 2Kbytes.

    Fig2.Architecture interne du 16f84

    13

  • En effet, il faut 2 octets pour coder 14 bits. Ceci explique galement pourquoi, lorsque vous lisez une PIC vierge, vous allez lire des 0x3FFF. Cela donne en binaire B11111111111111, soit 14 bits.

    Notez ce point quune instruction est code sur 1 mot. Donc, 1K donne 1 bon millier

    dinstructions possibles (cest dj pas si mal). Quand vous en serez crire des programmes de 1K, vous serez sans aucun doute autonome pour vos applications.

    Fig3.Mmoire programme et pile

    3.2 La mmoire Ram

    La mmoire RAM est celle que nous allons sans cesse utiliser. Toutes les donnes qui y sont stockes sont perdues lors dune coupure de courant. La mmoire RAM est organise en 2 banques pour la 16F84. La RAM est subdivise de plus en deux parties. Dans chacune des banques nous allons trouver des cases mmoires spciales appeles REGISTRES SPECIAUX et des cases mmoires libres dont vous pouvez vous servir votre guise.

    Pour le cas du 16F84, vous disposerez de 68 octets libres. Lorganisation de la RAM est

    montre dans le tableau 4-2 page 13. Vous voyez la sparation verticale en 2 banques, et tout en bas vous voyez deux banques de 68 octets de RAM.

    Malheureusement, lindication mapped in bank 0) vous indique quaccder ces 68

    octets depuis la banque 0 ou la banque 1 donne en fait accs la mme case mmoire. Chaque registre provoque un fonctionnement spcial du PIC ou la mise en service dune

    fonction particulire. Vous remarquerez enfin que certains registres sont identiques dans les 2

    14

  • banques (FSR par exemple). Cela signifie quy accder depuis la banque 0 ou 1 ne fait pas de diffrence.

    Remarquez que la banque 0 utilise les adresses de 0x00 0x7F, la banque 1 allant de 0x80 0xFF (voir Fig4). Les zones en gris sont des emplacements non utiliss (et non utilisables). Lemplacement 0x00 est un emplacement auquel on ne peut pas accder.

    Pour la grande majorit des registres, chaque bit a une fonction spciale. Page 14, tableau

    4-1, vous trouverez les noms des bits utiliss dans ces registres. 3.3 La mmoire eeprom

    La mmoire eeprom (Electrical Erasable Programmable Read Only Memory), est constitue de 64 octets que vous pouvez lire et crire depuis votre programme. Ces octets sont conservs aprs une coupure de courant et sont trs utiles pour conserver des paramtres semi-permanents. Leur utilisation implique une procdure spciale que nous verrons par la suite, car ce nest pas de la RAM, mais bien une ROM de type spcial. Il est donc plus rapide de la lire que dy crire. Si vous programmez souvent des eeproms (2416) vous aurez constat dj ce phnomne. 4- Les ports dentre/sortie Le pic 16F84 possde deux ports dentr/sortie dont les broches sont bidirectionnelles et qu'ils peuvent tre programmes soit en entr soit en sortie. 4-1- Le PORTA :

    Le PORTA est un port bidirectionnel et quil possde cinq pins dont la fonction de chacune est :

    RA0 (bit 0) : broche E/S. RA1 (bit 1) : broche E/S. RA2 (bit 2) : broche E/S. RA3 (bit 3) : broche E/S. RA4 (bit 4) : broche E/S et multiplex avec une entre dhorloge pour TMR0.

    4-2- Le PORTB: Le PORTB est un port bidirectionnel de huit broches dont la fonction de chacune est : RB0 (bit 0) : broche E/S ou aussi une source dinterruption externe. RB1 (bit 1) : broche E/S. RB2 (bit2) : broche E/S. RB3 (bit 3) : broche E/S. RB4 ( bit 4 ) : broche E/S. RB5 ( bit 5 ) : broche E/S. RB6 (bit 6) : broche E/S et entre horloge pour la programmation srie du C. RB7 (bit 7) : broche E/S et entre donnes pour la programmation srie du C.

    15

  • Remarques :

    - Toutes les broches du PORTB possdent des rsistances + VDD (pullups). Ces rsistances sont mises en uvre par programmation (le bit /RBPU du registre OPTION_REG), elles sont automatiquement dsactives quand le port est en sortie.. - Les broches RB4:RB7 peuvent gnrer par programmation une interruption en cas de changement dtat. 5- Les SFR (registres fonction spciale):

    Les registres fonction spciale ou les SFR sont contenus dans la mmoire de donnes. Ils sont utiliss par l'unit centrale (CPU) .Lemplacement mmoire de ces registres est donn Dans la figure 4.Ces registres seront tudis ultrieurement.

    6- Organisation des instructions 6.1 Gnralits Allez, courage, cela devient de plus en plus concret. On va faire un petit survol du jeu dinstructions des PICs. On saute directement page 55 du datasheet, au chapitre 9. Et oui,

    FiG4. Mmoire dedonnes RAM et les SFR

    16

  • comme cet ouvrage nest pas un manuel de rfrence technique, mais un apprentissage, il faut voir les chapitres dans le dsordre. Sur cette page, vous trouvez un petit encadr gris qui fait allusion deux anciennes instructions qui ne sont plus utilises. Nous ne nous en servirons donc pas. Par contre, vous trouvez un tableau 9-1 qui indique comment les instructions sont codes dans le PIC. Et la, vous voyez enfin quoi correspondent nos 14 bits de mmoire programme. 6.2 Les types dinstructions Il existe 4 types dinstructions : 6.2.1 Les instructions orientes octet

    Ce sont des instructions qui manipulent les donnes sous forme doctets. Elles sont codes de la manire suivante :

    - 6 bits pour linstruction : logique, car comme il y a 35 instructions, il faut 6 bits pour

    pouvoir les coder toutes - 1 bit (d) pour indiquer si le rsultat obtenu doit tre conserv dans le registre de travail de

    lunit de calcul (W pour Work) ou sauv dans loprande (F pour File). - Reste 7 bits pour encoder loprande (File)

    Aie, premier problme, 7 bits ne donnent pas accs la mmoire RAM totale, donc voici ici lexplication de la division de la RAM en deux banques.

    En effet, il faudra bien trouver une solution pour remplacer le bit manquant. Vous avez dit

    un bit dun des registres ? BRAVO, vous avez tout compris. Il sagit en ralit du bit RP0 du registre STATUS.

    Ah, vous avez remarqu quil y a un RP1 ? Et oui, le 16F877 a 4 banques. Vous veillerez

    laisser RP1 0 pour la 16F84, afin de pouvoir porter votre programme sans problme vers une PIC suprieure. 6.2.2 Les instructions orientes bits

    Ce sont des instructions destines manipuler directement des bits dun registre particulier. Elles sont codes de la manire suivante :

    - 4 bits pour linstruction (dans lespace rest libre par les instructions prcdentes) - 3 bits pour indiquer le numro du bit manipuler (bit 0 7 possible), et de nouveau 7 bits

    pour indiquer loprande.

    17

  • 6.2.3 Les instructions gnrales Ce sont les instructions qui manipulent des donnes qui sont codes dans linstruction directement. Nous verrons ceci plus en dtail lorsque nous parlerons des modes dadressage. Elles sont codes de la manire suivante : - Linstruction est code sur 6 bits - Elle est suivie dune valeur IMMEDIATE code sur 8 bits (donc de 0 255). 6.2.4 Les sauts et appels de sous-routines Ce sont les instructions qui provoquent une rupture dans la squence de droulement du programme. Elles sont codes de la manire suivante : - Les instructions sont codes sur 3 bits - La destination code sur 11 bits

    Nous pouvons dj en dduire que les sauts ne donnent accs qu 2K de mmoire programme (211).

    Rappelez-vous que lespace mmoire programme est de 1Kmots. Pour coder une adresse

    de saut lintrieur de la mmoire programme, il faut donc 10 bits (210 = 1024 = 1K). Par convention, en effet, 1Kbytes correspond 210 = 1024 octets. Ce qui explique que si

    vous avez 16K de mmoire, en ralit vous avez 16*1024 = 16384 bytes. Par extension, 1Mbyte = 1024 Kbytes, donc 1048576 octets.

    Maintenant vous voyez pourquoi vous voyez plus que votre mmoire thorique lors du

    test mmoire au dmarrage de votre ordinateur. Une petite parenthse qui na rien voir ici : les fabricants de disques durs considrent que 1Mbytes = 1000000 bytes. Comme Windows indique la taille en Mbytes de 1048576 bytes, cela vous explique pourquoi la plupart de vos disques durs semblent plus petits que prvus. Le tableau suivant prsente les instructions de la famille 16F(C)xxx :

    18

  • Fig5.Le jeux dinstructions de la famille 16F8xx 6.3 Les indicateurs dtat Ces indicateurs sont indispensables pour la programmation. Il est donc absolument ncessaire davoir compris leur fonctionnement (du moins pour Z et C).

    Lisez donc attentivement ce qui suit. Tous les indicateurs sont des bits du registre STATUS. Voyez le tableau page 15. Nous aborderons ici les flags Z et C. Les autres seront traits lors de ltude des registres. 6.3.1 Lindicateur dtat Z Cest lindicateur Zero, il fonctionne de la manire suivante :

    Si le rsultat dune opration POUR LEQUEL IL EST AFFECTE, donne un rsultat gal 0, le flag Zero passe 1.

    Donc, ne vous mlangez pas les pinceaux. Dire si Z = 1 correspond dire si

    rsultat = 0 . Le tableau de la figure 5, colonne 5 vous indique les instructions qui modifient Z.

    19

  • Donc, si vous faites une addition avec ADDWF et que le rsultat obtenu est 0, le bit Z sera 1. Si le rsultat est 0 (diffrent de 0), le bit Z vaudra 0. Dans les 2 cas il est modifi.

    Par contre, si vous stockez une valeur avec linstruction MOVWF, le bit Z ne sera pas

    modifi, mme si la valeur vaut 0. Ces remarques sont valables pour les autres flags. 6.3.2 Lindicateur dtat C Cest lindicateur pour Carry (report). Si le rsultat dune opration entrane un dbordement, le bit C sera positionn. Il sagit en fait du 9me bit de lopration. Petit exemple : Si vous ajoutez B11111110 (254) + B00000011 (3) Vous obtenez B100000001, (257) donc 9 bits.

    Comme les registres de la PIC ne font que 8 bits, vous obtiendrez B00000001 (1) et C positionn 1 (en fait le 9me bit, donc le bit 8, donc 28 = 256). Donc le rsultat final est de 256 + 1 = 257.

    Remarquez que si vous aviez ajout B11111110 et B00000010, vous auriez obtenu B00000000.

    Dans ce cas, vous auriez eu C 1 ET Z 1, ce qui signifie rsultat nul, mais avec report (donc rsultat = 256).

    Les autres bits du registre dtat seront vus plus loin.

    7- Organisation dun fichier .asm

    On utilisera pour ldition dun fichier .asm lditeur de MPLAB. MPLAB est loutil logiciel gratuit fournit par MICROCHIP pour ldition, la compilation et la simulation dun programme en assembleur.

    Tout dabord, cliquez nimporte o lintrieur dun fichier asm quelconque. Vous tes lintrieur dun simple traitement de texte. Dans le coin infrieur gauche, vous verrez un numro de ligne et de colonne. Cest la position actuelle de votre curseur. Nous nous servirons de cette position pour vous guider. Najoutez donc pas de lignes pour linstant, pour garder la correspondance correcte avec ce texte.

    Si vous narrivez pas effectuer des modifications dans votre fichier, et que votre

    clavier semble inactif, cest que vous avez utilis un caractre tendu dans le nom de votre fichier. MPLAB est allergique certains caractres, comme le .

    7.1 Les commentaires

    Au dbut du fichier on trouve gnralement un grand cadre. Si vous remarquez attentivement le premier caractre de chaque ligne, vous verrez le symbole ; . Tout ce qui

    20

  • suit tant considr comme zone de commentaire, vous pouvez y mettre tout ce que vous voudrez.

    Prenez lhabitude de toujours commenter vos programmes. Soyez sr que dans 6

    mois, vous ne vous rappellerez plus ce que vous avez voulu faire, les commentaires vous seront alors dune grande utilit si vous dcidez de modifier votre programme.On prendra lexemple du fichier qui fera le sujet de notre premier programme.

    7.2 Les directives

    A la ligne 8, nous trouvons une DIRECTIVE destine MPASM pour indiquer quel

    type de processeur est utilis dans ce programme. Les DIRECTIVES ne font pas partie du programme, elles ne sont pas traduites en

    OPCODE, elles servent indiquer lassembleur de quelle manire il doit travailler. Ce sont donc des COMMANDES destines lassembleur en lui-mme.

    Au contraire, les INSTRUCTIONS seront traduites en OPCODE et charges dans le

    PIC. Il est donc impratif de bien faire la distinction. 7.3 les fichiers include

    La ligne 9 signale lassembleur que les ASSIGNATIONS sont dans le fichier P16F84.inc. Que contient ce fichier ? Et bien tout simplement la valeur de toutes les CONSTANTES que nous allons utiliser. Pour voir ce quil contient, allez dans le menu file ->Open , choisissez all files dans le cadre infrieur, et ouvrez p16F84.inc. Une fois dpasse la zone de commentaires, vous verrez des lignes du style :

    FSR EQU H'0004'

    Cette ligne signifie tout simplement que FSR EGAL 0x0004. Autrement dit, lorsque

    vous utiliserez FSR dans une instruction, MPASM interprtera FSR comme tant 0x04. 0x04 tant tout simplement ladresse de FSR dans la mmoire du PIC.

    H0004 est une autre mthode autorise pour exprimer un nombre hexadcimal, tout

    comme 04h

    Si vous prenez votre tableau 4-2 page 13, vous constaterez que cest bien le cas. Ce fichier est donc principalement destin vous viter davoir mmoriser toutes les adresses, un nom est bien plus simple utiliser. Fermez le fichier p16F84.inc pour ne pas encombrer votre fentre. 7.4 La directive _CONFIG La ligne suivante, commence par __CONFIG . Cette ligne contient les fameux fusibles qui fixent le fonctionnement du PIC.

    Les valeurs crites ici seront intgres dans le fichier .hex pour signaler au programmateur les valeurs encoder aux adresses spcifiques du PIC. Nous y reviendrons.

    21

  • On trouve dans le fichier toutes les valeurs possibles de ces paramtres, avec les explications correspondantes. Il suffit de remplacer une des valeurs par celle souhaite. Par exemple, activons le Code Protect (protection en lecture) : On remplacera donc simplement la ligne : __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _HS_OSC Par __CONFIG _CP_ON & _WDT_ON & _PWRTE_ON & _HS_OSC

    Faites-le. Remarquez que les diffrentes valeurs sont lies par le symbole & (AND). Ils fonctionnent donc en plaant des bits 0 , si vous avez tout suivi. Les valeurs exactes sont de nouveau dans le fichier P16F84.INC .

    7.5 Les assignations

    A la ligne 30, vous trouverez des ASSIGNATIONS personnelles qui fonctionnent

    selon le mme principe que dans le fichier .inc . A quoi cela sert-il ? Et bien faciliter la MAINTENANCE de votre programme. Il est

    en effet plus simple de retenir dans votre programme la valeur MASQUE que de manipuler la valeur 0x5B.

    Les assignations se comportent comme une simple substitution. Au moment de

    lassemblage, chaque fois que lassembleur va trouver une assignation, il la remplacera automatiquement par sa valeur.

    Un autre avantage est que si vous remplacez la valeur dune assignation, le

    changement sera effectif pour tout le programme. Vous ne risquez donc pas doublier des valeurs en chemin.

    Il est vivement conseill dutiliser les ASSIGNATIONS et autres mthodes que nous

    allons voir plus bas. La syntaxe est simple puisquil sagit de EQU (gal ) Exemple dassignation :

    mavaleur EQU 0x05

    7.6 Les dfinitions Descendons encore un peu. Nous dcouvrons, lignes 38 et 39 des exemples de

    DEFINE. Sachez que les define fonctionnent comme des ASSIGNATIONS. A ceci prs que nous rserverons les assignations pour les valeurs, et les dfinitions pour remplacer un texte plus complexe.

    Par exemple nous pourrons utiliser un PORT suivi dun numro de bit, ou bien

    carrment une instruction avec ses paramtres.

    22

  • Une dfinition est construite de la manire suivante : La directive #DEFINE, suivie par le nom que lon dsire utiliser, puis la chane substituer. Par exemple :

    #DEFINE monbit PORTA, 1

    7.7 Les macros

    Plus bas, lignes 46 52, nous trouvons les MACRO.

    La macro se compose dun nom crit en premire colonne, suivi par la directive macro . Commence alors la ligne suivant la portion de code qui constitue la macro. La fin de la macro est dfinie par la directice endm) (end of macro).

    Une macro remplace donc un morceau de code que nous utilisons souvent. La macro

    fonctionne galement uniquement comme un simple traitement de texte.

    La macro simplifie donc lcriture, mais ne raccourci pas la taille du fichier .hex obtenu, puisque les 2 lignes seront crites dans le PIC.

    Notez que lon peut utiliser des macros plus complexes, avec passage de paramtres,

    mais nous nentrerons pas dans ces fonctions particulires pour linstant. Notez galement que vous disposez dune aide dans le menu help->MPASM Help .

    En effet, laide de MPLAB concerne lutilisation du logiciel. Les aides concernant le langage sont dans MPASM, puisque cest ce langage que MPLAB utilise (revoyez ldition des nuds).

    7.8 La zone des variables

    Toute zone dfinie par lutilisateur commence avec la DIRECTIVE CBLOCK, suivie

    par ladresse du dbut de la zone. Pour placer nos variables, qui sont des emplacements mmoires auxquels on a donn

    un nom, nous consultons de nouveau le tableau 4-2. Nous voyons que la zone RAM librement utilisable commence l'adresse 0x0C. Notre zone de variable contiendra donc la directive

    CBLOCK 0x00C ; dbut de la zone variables

    Ensuite, vous pouvez utiliser 68 emplacements mmoire, qui rpondront la syntaxe suivante : nom de la variable suivi du signe : suivi de la taille utilise. Par exemple :

    w_temp :1 ; Zone de 1 byte montableau : 8 ; zone de 8 bytes

    Ensuite, vous devrez prciser la fin de la zone en cours laide de la directive :

    ENDC ; Fin de la zone

    23

  • 7.9 Les tiquettes Vous trouverez dans les programmes en 1ere colonne ce que nous appellerons des ETIQUETTES. Ce sont des noms que vous choisissez et qui sont des REPERES pour le programme.

    Lassembleur les remplacera par ladresse du programme lendroit o elles sont positionnes. Ceci vous vite de devoir calculer les emplacements programme. Nous en verrons plus loin le principe. 7.10 La directive ORG La directive ORG, suivie de ladresse, prcise quelle adresse les instructions qui suivent seront places dans le PIC. Il est important de savoir 2 choses : - Aprs un reset ou une mise sous tension, le PIC dmarre toujours ladresse 0x00. Le

    dbut de votre programme doit donc se situer l. - Ladresse 0x04 est ladresse utilise par les interruptions (nous verrons le principe plus

    tard). Il ne vous reste donc pas une grande place pour placer votre programme. Nous commencerons donc par un saut vers lemplacement du programme principal o nous aurons plus de place. Allons donc voir ligne 70 comment tout ceci fonctionne :

    org 0x000 ; Adresse de dpart aprs reset goto init ; Adresse 0: initialiser

    La premire ligne est une DIRECTIVE qui indique que la ligne suivante sera place ladresse 0x00.

    La seconde ligne est une INSTRUCTION, explique page 62 du datasheet, qui indique

    au PIC que le programme doit SAUTER ladresse init . init est une ETIQUETTE.

    Aprs le reset, le PIC excute donc linstruction goto init qui se trouve ladresse 0x00, suivie par linstruction qui se trouve ladresse init plus bas dans le programme (donc juste en dessous de ltiquette init). 7.11 La directive END Cette directive prcise lendroit o doit cesser lassemblage de votre programme. Elle est obligatoire dans tout programme, sous peine dune erreur qui vous signalera que la fin de fichier (End Of File) a t atteinte avant de rencontrer la directive END. Toutes les instructions situes aprs la directive END seront tout simplement ignores. 7.12 Explication des registres fondamentaux Vous voici prt lancer une simulation. Mais quoi cela pourrait-il vous servir si vous ne comprenez pas les changements qui vont soprer dans les registres spciaux ? On va donc

    24

  • commencer par vous expliquer les registres de base ncessaires la comprhension du processus. 7.12.1 Les registres PCL et PCLATH

    Un processeur, quel quil soit est un composant qui excute SEQUENTIELLEMENT une srie dINSTRUCTIONS organises selon un ensemble appel PROGRAMME.

    Il existe donc dans le processeur un SEQUENCEUR, cest dire un compteur qui permet

    de pointer sur la PROCHAINE instruction excuter. Ce squenceur est appel suivant les processeurs compteur ordinal , Pointeur de programme etc. Dans le cas des PICs, il sappelle PC, pour Program Counter. Le PC nest pas accessible directement par lutilisateur.

    Le principe de base est toujours le mme. Dans les PICs, les registres ne font que 8 bits,

    on ne peut donc stocker quune adresse maximale de 255. Il faudra donc 2 registres pour accder une adresse. Les PICs ont un fonctionnement un peu particulier ce sujet.

    Nous trouvons tout dabord un registre qui contient ladresse basse du PC, cest dire les

    8 bits de poids faibles. Ce registre est accessible en lecture et en criture. Il est appel PCL (PC Low)

    Il existe un autre registre de 5 bits qui participe au fonctionnement du squenceur. Il

    sappelle PCLATH (PC LATch counter High). Il est accessible en lecture et en criture par lutilisateur.

    Le PC complet tant cod sur 13 bits, il faudra donc complter PCL avec 5 bits

    supplmentaires. Il existe deux cas possibles :

    - Lors dun saut, par exemple, le contenu du PC est charg directement avec les 11 bits de destination contenus dans linstruction en elle-mme. Les 2 bits manquants sont extraits du registre PCLATH. Les bits 3 et 4, qui doivent tre positionns par lutilisateur, sont placs directement dans les bits 11 et 12 du PC afin de complter ladresse de destination. Comme la 16F84 ne gre que 1K de mmoire programme, nous naurons pas besoin de ce registre dans le cas des sauts. Le 16F84 ne gre que 10 des 13 bits du PC.

    - En cas de modification du PCL directement par lutilisateur, comme pour un registre

    ordinaire, PCL est charg dans PC et complts par les 5 bits du registre PCLATH. Comme le 16F84 ne traite que 1K de mmoire programme, les bits b2, b3 et b4 de PCLATH seront inutiliss ici.

    Remarquez que la limite du PC est de 13 bits, ce qui implique que les PICs de la

    famille mid-range auront une capacit de mmoire programme de 8K mots maximum (soit 213).

    Il est trs important de se rappeler que le PC pointe toujours sur linstruction suivante,

    donc linstruction qui nest pas encore excute. Cest indispensable de bien comprendre ceci pour analyser les programmes en cours de debbuggage.

    25

  • 7.12.2 Le registre W

    Ce registre est un registre utilis par les pics pour raliser toutes sortes de calculs. Dans une instruction la destination dun rsultat (d) peut en gnral tre un emplacement RAM (f) ou le registre de travail (w). Cest un donc un registre fondamental. 7.12.3 Le registre STATUS

    Cest un registre dont chaque bit a une signification particulire. Il est principalement utilis pour tout ce qui concerne les tests. Il est donc galement dune importance fondamentale. Il est dcrit dans le tableau de la page 15 du datasheet..

    Voici les diffrents bits qui le composent, en commenant par le bit0 (b0), donc le bit le

    plus droite, ou encore le moins significatif. Remarquez quon utilise le terme LSB, parfois comme byte le moins significatif, parfois comme bit le moins significatif. Cest galement un abus de langage, mais le contexte permet trs bien de les distinguer.

    b0 : C Carry (report) Ce bit est en fait le 9me bit dune opration.

    Par exemple, si une addition de 2 octets donne une valeur >255 (0xFF), ce bit sera positionn.

    b1 : DC Digit Carry Ce bit est utilis principalement lorsque lon travaille avec nombres BCD : il indique un report du bit 3 vers le bit 4. Pour info, un nombre BCD est un nombre dont chaque quartet reprsente un chiffre dcimal. Nous naborderons pas ce principe ici.

    b2 : Z Zero Ce bit est positionn 1 si le rsultat de la dernire opration vaut 0. Rappelez-vous cependant que ces flags ne sont positionns que pour les instructions qui le prcisent (Status bit affected). b3 : PD Power down Indique quel vnement a entraner le dernier arrt du PIC (instruction sleep ou dpassement du temps du watchdog). Nous y reviendrons plus tard. En ralit, vous verrez que PD est surmont dune petite barre qui signifie : actif ltat bas. Donc que 0 = bit valid. Les inversions sont en italique b4 : TO Time-Out bit Ce bit indique (si 0), que la mise en service suit un arrt provoqu par un dpassement de temps ou une mise en sommeil. Dans ce cas, PD effectue la distinction. b5 : RP0 Register Bank Select0 Permet dindiquer dans quelle banque de RAM on travaille.0 = banque 0. b6 : RP1 Register Bank Select1 Permet la slection des banques 2 et 3. Inutilis pour la 16F84, doit tre laiss 0 pour garantir la compatibilit ascendante (portabilit du programme). B7 : IRP Indirect RP Permet de dcider quelle banque on adresse dans le cas de ladressage indirect (que nous verrons plus tard).

    26

  • 8- Les modes dadressage Les instructions utilisent toutes une manire particulire daccder aux informations quelles manipulent. Ces mthodes sont appeles modes dadressage .

    On va simplement donner un petit exemple concret de ce quest chaque mode dadressage. Supposons que vous vouliez mettre de largent dans votre poche : 8.1 Ladressage littral ou immdiat

    Avec l ADRESSAGE IMMEDIAT ou ADRESSAGE LITTERAL, vous pouvez dire : on mets 100D en poche. La valeur fait IMMEDIATement partie de la phrase. Pas besoin dun autre renseignement. Exemple Movlw 0x55 ; charger la valeur 0x55 dans W 8.2 Ladressage direct

    Avec l ADRESSAGE DIRECT, vous pouvez dire : on va mettre le contenu du coffre numro 10 dans notre poche. Ici, lemplacement contenant la valeur utile est donn DIRECTement dans la phrase. Mais il faut dabord aller ouvrir le coffre pour savoir ce que lon va effectivement mettre en poche. On ne met donc pas en poche le numro 10, mais ce quil contient. Exemple Movf 0x10 , W ; charger le contenu de lemplacement 0x10 dans W 8.3 Ladressage indirect

    Avec l ADRESSAGE INDIRECT, vous pouvez dire : Le prpos du guichet numro 3 va me donner le numro du coffre qui contient la

    somme quon va mettre en poche. Ici, vous obtenez le numro du coffre INDIRECTement par le prpos au guichet.

    Vous devez donc allez demander ce prpos quil vous donne le numro du coffre que vous irez ouvrir pour prendre largent. On ne met donc en poche, ni le numro du prpos, ni le numro du coffre que celui-ci va vous donner. Il y a donc 2 oprations pralables avant de connatre la somme que vous empocherez. Cet adressage fait appel 2 registres, dont un est particulier, car il nexiste pas vraiment. Examinons-les donc :

    27

  • 8.3.1 Les registres FSR et INDF Ceux qui suivent sont dj en train de chercher dans le tableau 4-2 aprs INDF.

    INDF signifie INDirect File. Vous le voyez maintenant ? Et oui, cest le fameux registre de ladresse 0x00. Ce registre nexiste pas vraiment, ce nest quun procd daccs particulier FSR utilis par le PIC pour des raisons de facilit de construction lectronique interne. Le registre FSR est ladresse 0x04 dans les 2 banques. Il nest donc pas ncessaire de changer de banque pour y accder, quelle que soit la banque en cours dutilisation.

    Dans lexemple schmatique prcdent, le prpos au guichet, cest le registre FSR. Ladressage indirect est un peu particulier sur les PICS, puisque cest toujours la mme adresse que se trouvera ladresse de destination. Comment cela se passe-t-il ?

    - Premirement, nous devons crire ladresse pointe dans le registre FSR. - Ensuite, nous accdons cette adresse pointe par le registre INDF.

    On peut donc dire que INDF est en fait le registre FSR utilis pour accder la case

    mmoire. Donc, quand on veut modifier la case mmoire pointe, on modifie FSR, quand on veut connatre ladresse de la case pointe, on accde galement FSR. Si on veut accder au CONTENU de la case pointe, on accde via INDF. Nous allons voir tout ceci par un petit exemple, mais avant, ATTENTION Le contenu du registre FSR pointe sur une adresse en 8 bits. Or, sur certaines PICs, la zone RAM contient 4 banques (16F877). Ladresse complte est donc une adresse sur 9 bits. Ladresse complte est obtenue, en adressage DIRECT, par lajout du bit 7 et 8 sous forme de RP0et RP1 (RP1 est inutilis pour le 16F84 car seulement 2 banques) et par lajout du bit IRP dans le cas de ladressage INDIRECT (inutilis sur le 16F84). Veillez donc toujours laisser IRP (dans le registre STATUS) et RP1 0 pour assurer la portabilit de votre programme. Exemple movlw 0x50 ; chargeons une valeur quelconque movwf mavariable ; et plaons-la dans la variable mavariable

    movlw mavariable ; on charge lADRESSE de mavariable, par

    ; exemple, dans les leons prcdentes, ctait ; 0x0e. (W) = 0x0E

    movwf FSR ; on place ladresse de destination dans FSR. ; on dira que FSR POINTE sur mavariable movf INDF,w ; charger le CONTENU de INDF dans W.

    LE CONTENU DE INDF EST TRADUIT PAR LE PIC COMME ETANT LE CONTENU DE LEMPLACEMENT MEMOIRE POINTE PAR FSR (W) = 0X50

    28

  • 8.4 Quelques exemples On va rpter, mais les modes dadressages doivent imprativement tre compris. Pour les habitus des processeurs divers, excusez ces rptitions. Les registres sont intialiss avec les valeurs prcdentes. movlw mavariable

    Cest de ladressage immdiat ou littral ; donc on charge la VALEUR de mavariable,

    ce qui correspond en ralit son ADRESSE. Donc 0x0E est plac dans (W). Ceci se reconnat au l de linstruction movlw movf mavariable , w

    Cette fois, cest de ladressage DIRECT, donc, on va ladresse mavariable voir ce quil y a lintrieur. On y trouve le CONTENU de mavariable, donc (w) = 0x50 (dans notre exemple). movf INDF , w Maintenant, cest de ladressage INDIRECT. Ce mode dadressage se reconnat immdiatement par lutilisation du registre INDF. Le PIC va voir dans le registre FSR, et lit ladresse contenue, dans ce cas 0X0E. Elle va ensuite dans lemplacement vis, et lit le CONTENU. Donc, dans (W) on aura le contenu de 0x0E, soit 0x50. movf FSR , w Ceci est un pige. Cest en effet de ladressage DIRECT. On placera donc dans (W) le CONTENU du registre FSR, donc 0X0E sera mis dans (W). 9- Ralisation dun programme embarqu 9.1 Edition du fichier source Compltez le cadre den-tte suivant votre dsir. Vous trouverez ci-dessous un exemple. Prenez lhabitude de toujours documenter vos programmes. Ce nest pas un luxe, cest impratif pour une maintenance efficace dans le temps. ;********************************************************************************* ; PROGRAMME DE CLIGNOTEMENT D'UNE LED CONNECTEE SUR LE PORTA.2 * ; D'UN PIC16F84. PROGRAMME D'ENTRAINEMENT AU FONCTIONNEMENT * ; DES PICS.LA FREQUENCE DE CLIGNOTTEMENT EST DE 1 HZ (avec un quartz de 4MHz)* ;********************************************************************************* 9.2 Choix de la configuration

    Plus bas dans le fichier, vous trouverez ceci : __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

    29

  • ; '__CONFIG' prcise les paramtres encods dans le processeur au moment de ; la programmation du processeur. Les dfinitions sont dans le fichier include. ; Voici les valeurs et leurs dfinitions : ; _CP_ON Code protection ON : impossible de relire ; _CP_OFF Code protection OFF ; _PWRTE_ON Timer reset sur power on en service ; _PWRTE_OFF Timer reset hors-service ; _WDT_ON Watch-dog en service ; _WDT_OFF Watch-dog hors service ; _LP_OSC Oscillateur quartz basse consommation ; _XT_OSC Oscillateur quartz moyenne vitesse ou externe ; _HS_OSC Oscillateur quartz grande vitesse ; _RC_OSC Oscillateur rseau RC On inclus les commentaires dans le fichier de faon ce quil soit plus rapidement

    modifiables sans devoir recourir au datasheet.

    Remarquez quon effectue un AND (&) entre les diffrentes valeurs, les niveaux actifs sont donc des niveaux 0

    Le premier paramtre prcise si votre PIC sera protge ou non contre la lecture la fin de la programmation. Laissez ici ce paramtre sur CP_OFF = non protge.

    Le second paramtre prcise si le chien de garde (watchdog) est mis ou non en service. Dans un premier temps, remplacez WDT_ON par WDT_OFF pour le mettre hors-service.

    Ensuite, laissez PWRTE sur ON pour prciser que vous utilisez un reset scuris ,

    donc avec un allongement du temps avant dmarrage. Ceci vous met labri des alimentations un peu lentes dmarrer.

    Enfin, vient le fonctionnement de loscillateur que vous allez utiliser. Le tableau 8-1

    page 40 donne les valeurs recommandes en fonction des frquences utilises pour un PIC de 10MHz. Retenez que la valeur _HS_OSC convient pour les frquences leves. Sinon utiliser XT_OSC pour les frquences 4MHz.

    Il est important de ne pas utiliser _RC_OSC si on utilise un quartz. Ce paramtre est rserv un fonctionnement par rseau R/C tel que dessin figure 8-7 page 41.

    LE FAIT DUTILISER LE PARAMETRE RC AVEC UNE HORLOGE

    EXTERNE PEUT ENTRAINER LA DESTRUCTION DU PIC. Mme, si en pratique, les PICs sont des composants trs solides, vitez de vous

    tromper ce niveau. Et voil, vous connaissez parfaitement _Config. Vous avez maintenant la ligne suivante :

    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

    30

  • 9.3 Le registre OPTION

    Si vous regardez le tableau 4-2, vous constaterez que ce registre se trouve ladresse 0x81, donc dans la banque1. Dans les fichiers include de MPLAB, ce registre est dclar avec le nom OPTION_REG.

    Cest donc ce nom que vous devrez utiliser. Nous allons le dtailler ici. Ce registre est un

    registre de bits, cest dire que chaque bit a un rle particulier : Le tableau de la page 16 reprsente le contenu de ce registre : b7 : RBPU Quand ce bit est mis 0 (actif niveau bas en italique), une rsistance de rappel au +5 volt est place sur chaque pin du PORTB. b6 : INTEDG

    Donne, dans le cas o on utilise les interruptions sur RB0, le sens de dclenchement de linterruption. Si b6 = 1, on a interruption si le niveau sur RB0 passe de 0 vers 1. Si b6 = 0, linterruption seffectuera lors de la transition de 1 vers 0. b5 : TOCS

    Ce bit dtermine le fonctionnement du timer0, que nous verrons bientt. Retenez que le timer0 est incrment soit en fonction de lhorloge interne (synchronis au programme), dans ce cas b5 = 0, soit il compte les impulsions reues sur la pin RA4, dans ce cas b5=1.

    Comme ce dernier mode ncessite un circuit de gnration de pulses externe, nous

    utiliserons pour le timer0 lhorloge interne, donc b5 = 0 b4 : TOSE

    Donne, pour le cas ou le bit 5 serait 1, le sens de la transition qui dtermine le comptage de tmr0. Si b4 = 1, on a comptage si le signal passe de 5V 0V sur RA4, si on a b4 = 0, ce sera le contraire.

    Comme nous avons plac b5=0, b4 est alors inutilis. Nous laisserons donc b4 = 0.

    b3 : PSA Nous avons dans le PIC un prdiviseur. Quest-ce que cest ? Et bien tout simplement, ceci indique le nombre de pulses qui devra tre reu pour provoquer une incrmentation de la destination. Nous y reviendrons en dtail avec le fonctionnement du tmr0.

    A ce niveau, sachez simplement que ce prdiviseur peut servir une des deux fonctions suivantes (et pas les deux) : soit il effectue une prdivision au niveau du timer du watchdog (b3 = 1), soit il effectue une prdivision au niveau du tmr0 (timer0) (b3=0). Dans notre cas, mettez b3 = 1 (nous verrons ci-dessous pourquoi).

    31

  • b2, b1,b0 : PS2,PS1,PS0

    Ces trois bits dterminent la valeur de prdivision pour le registre dtermin ci-dessus. Il y a donc 8 valeurs possibles, montres dans le petit tableau de la page 16.

    Remarquez que les valeurs sont diffrentes pour le watchdog et pour tmr0. En effet, il ny

    a pas de division par 1 pour ce dernier registre. Si vous dsirez ne pas utiliser de prdiviseur du tout, la seule mthode est de mettre b3=1

    (prdiviseur sur watchdog) et PS2 PS0 0. Dans ce cas : pas de prdiviseur sur tmr0, et prdiviseur 1 sur watchdog, ce qui correspond pas de prdiviseur non plus. Nous mettrons donc b2=b1=b0= 0. 9.4 Edition du programme

    Nous utiliserons donc la valeur B00001000 pour notre programme dessai, soit 0x08. Il faut avoir lhabitude de ne pas traner des valeurs fixes travers mes programmes, afin den faciliter la maintenance. On place ces valeurs en dbut de programme en utilisant des assignations.

    Lassignation est dj cre plus bas dans le programme. On a cr une

    CONSTANTE quon a appel OPTIONVAL et qui contiendra la valeur placer plus tard dans le registre OPTION_REG. On rappelle que les CONSTANTES noccupent pas de place dans le PIC, elles sont simplement remplaces par lassembleur au moment de la compilation. Elles servent faciliter la lecture du programme.

    Cherchez donc plus bas dans le programme aprs les assignations, et remplacez la

    valeur affecte OPTIONVAL par celle que nous avons trouve et ajoutez vos commentaires. Supprimez lassignation concernant INTERMASK, car nous ne nous servirons pas des interruptions dans ce premier programme. Dans la zone des assignations, il vous reste donc ceci : ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* OPTIONVAL EQU H'0008 ; Valeur registre option ; Rsistance pull-up ON ; Pas de prscaler Descendons encore jusqu la zone des dfinitions. Nous allons donner un nom notre bouton-poussoir et notre LED. Les instructions bcf et bsf que nous allons utiliser pour mettre ou lire des 1 ou des 0 dans les registres ont la syntaxe suivante bsf f, n et comme le registre daccs sappelant PORTA (pour le port A) et PORTB (pour le port B), nous utiliserons des DEFINE permettant dintgrer f et n en mme temps.

    32

  • Nous voyons sur le schma que la LED est connecte sur le bit 2 du port A. Le bouton-poussoir est connect sur le bit 2 du port B. Nous effaons donc les dfinitions de lexemple, et nous les remplaons par les ntres. Nous obtenons alors ceci : ;********************************************************************* ; DEFINE * ;********************************************************************* #DEFINE LED PORTA,2 ; Led rouge #DEFINE BOUTON PORTB,2 ; bouton-poussoir Notez que LED et BOUTON sont des noms que nous avons librement choisis, condition quil ne sagisse pas dun mot-cl. Pas question par exemple dutiliser STATUS ou encore MOVLW, bien que ces exemples soient tirs par les cheveux, cela pourrait vous arriver un jour dutiliser un mot rserv par inadvertance. A quoi servent les dfinitions ? Et bien supposons que vous dcidez de connecter la LED sur le PORTB bit 1 (RB1), par exemple. Et bien, nul besoin de rechercher partout dans le programme, il suffira de changer dans la zone DEFINE. On descend encore un peu, et on arrive dans la zone des macros. Nous nen avons pas vraiment besoin ici, mais nous allons quand mme les utiliser titre dexemple. Effacez la macro donne titre dexemple et entrons celles-ci. ;********************************************************************* ; MACRO * ;********************************************************************* LEDON macro bsf LED endm LEDOFF macro bcf LED endm

    La premire colonne donne le nom de la macro (ici, 2 macros, une LEDON et une LEDOFF). La directive macro signifie dbut de la macro la directive endm signifie fin de la macro. Notez que les macros peuvent videmment comporter plusieurs lignes de code.

    Prenons notre exemple : quand nous utiliserons la ligne suivante dans notre

    programme (attention, ne pas mettre la macro en premire colonne) :

    LEDON Au moment de la compilation, notre assembleur remplacera LEDON par :

    bsf LED Il remplacera galement LED par PORTA,2. Ce qui fait quen ralit nous obtiendrons :

    33

  • bsf PORTA , 2

    Nous avons donc obtenu une facilit dcriture et de maintenance. Gardez lesprit que les macros sont des simples substitutions de traitement de texte. Si votre macro se compose de 50 lignes de code, les 50 lignes seront copies dans le PIC chaque appel de la macro. Nous arrivons dans la zone des variables. Nous ajouterons celles-ci au fur et mesure de leur ncessit. Effacez donc les 2 variables prsentes, car elles sont utilises dans les routines dinterruption que nous nutiliserons pas ici. ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x00C ; dbut de la zone variables ENDC ; Fin de la zone A lORG 0x00, laissons lappel vers la routine dinitialisation. Tout programme comporte en effet une tape dinitialisation des variables et des registres. Prenez lhabitude de sparer cette initialisation du reste du programme. Comme nous nutiliserons pas les interruptions, supprimez tout ce qui suit jusqu la routine dinitialisation, vous obtenez : ********************************************************************** ; DEMARRAGE SUR RESET * ;********************************************************************** org 0x000 ; Adresse de dpart aprs reset goto init ; Adresse 0: initialiser ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* suite du programme

    A ce stade, avant de poursuivre, nous allons tudier les registres dont nous allons nous servir, et tout dabord : 9.5 Le registre PORTA

    Ce registre est un peu particulier, puisquil donne directement accs au monde extrieur. Cest en effet ce registre qui reprsente limage des pins RA0 RA4, soit 5 pins. Si vous suivez toujours, cest ce registre qui va servir allumer la LED.

    Ce registre se situe ladresse 05H, dans la banque0. Chaque bit de ce registre reprsente

    un pin. Donc, seuls 5 bits sont utiliss. Pour crire sur un pin en sortie, on place le bit correspondant 1 ou 0, selon le niveau souhait.

    34

  • Par exemple : bsf PORTA , 1 ; envoyer niveau 1 sur RA1 place un niveau +5V sur la pin RA1. Notez quil faut pour cela que cette pin soit

    configure en sortie (voir TRISA). Pour tester une entre, on pourra par exemple utiliser btfss PORTA,3 ; tester RA3 et sauter si vaut 5V

    9.6 Le registre TRISA

    Ce registre est situ la mme adresse que PORTA, mais dans la banque 1. Son adresse complte sur 8 bits est donc 0x85.

    Ce registre est dun fonctionnement trs simple et est li au fonctionnement du PORTA. Chaque bit positionn 1 configure le pin correspondant en entre. Chaque bit 0

    configure le pin en sortie. Au reset du PIC, tous les pins sont mis en entre, afin de ne pas envoyer des signaux non

    dsirs sur les pins. Les bits de TRISA seront donc mis 1 lors de chaque reset. Notez galement que, comme il ny a que 5 pins utilises sur le PORTA, seuls 5 bits

    (b0/b4) seront utiliss sur TRISA. 9.7 Les registres PORTB et TRISB

    Ces registres fonctionnent exactement de la mme manire que PORTA et TRISA, mais concernent bien entendu les 8 pins RB. Tous les bits sont donc utiliss dans ce cas. Voyons maintenant les particularits du PORTB. Nous en avons dj vu une, puisque les entres du PORTB peuvent tre connectes une rsistance de rappel au +5V de manire interne.

    La slection seffectuant par le bit 7 du registre OPTION. Le schma interne visible figures 5-3 et 5-4 page 23 (datasheet) vous montre que les bits b0 et b4/b7 peuvent tre utiliss comme source dinterruption, le bit 0 peut de plus tre utilis de manire autonome pour gnrer un autre type dinterruption. Note :

    Aprs un reset, vous vous demandez peut-tre quel est ltat de tel ou tel registre. Vous trouverez ces explications dans le tableau de la page 14. Vous voyez quaprs un reset, le registre OPTION_REG a tous ses bits 1. Vous devez donc spcifier leffacement du bit7 pour valider les rsistances de rappel au +5V. 9.8 Finalisation du programme Tout dabord, il nous faut une routine de temporisation :

    35

  • ;********************************************************************* ; SOUS-ROUTINE DE TEMPORISATION * ;********************************************************************* ;--------------------------------------------------------------------- ; Cette sous-routine introduit un retard de 500.000 s. ; Elle ne reoit aucun paramtre et n'en retourne aucun ;--------------------------------------------------------------------- tempo movlw 2 ; pour 2 boucles movwf cmpt3 ; initialiser compteur3 boucle3 clrf cmpt2 ; effacer compteur2 boucle2 clrf cmpt1 ; effacer compteur1 boucle1 nop ; perdre 1 cycle decfsz cmpt1 , f ; dcrmenter compteur1 goto boucle1 ; si pas 0, boucler decfsz cmpt2 , f ; si 0, dcrmenter compteur 2 goto boucle2 ; si cmpt2 pas 0, recommencer boucle1 decfsz cmpt3 , f ; si 0, dcrmenter compteur 3 goto boucle3 ; si cmpt3 pas 0, recommencer boucle2 return ; retour de la sous-routine Le programme principal est compos de 5 instructions seulement : ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* DEBUT bsf STATUS,RP0 clrf TRISA ; port A en sortie bcf STATUS,RP0 LEDON ; allumer la LED : call tempo ; appeler la tempo de 0.5s LEDOFF ; teindre LED call tempo ; appeler la tempor de 0.5s goto DEBUT ; boucler END ; directive fin de programme 10- Les interruptions 10.1 Quest-ce quune interruption ?

    Imaginez une conversation normale. Chaque interlocuteur prend la parole quand vient son tour de parler. Survient alors un vnement extrieur dont le traitement est urgent. Par exemple, un piano tombe du 3me tage de limmeuble au pied duquel vous discutez. Vous imaginez bien que votre interlocuteur ne va pas attendre la fin de votre phrase pour vous

    36

  • signaler le danger. Il va donc vous INTERROMPRE durant le cours normal de votre conversation afin de pouvoir TRAITER IMMEDIATEMENT lEVENEMENT extrieur. Les interlocuteurs reprendront leur conversation o elle en tait arrive, sitt le danger cart.

    Et bien, pour les programmes, cest exactement le mme principe. Votre programme se droule normalement. Survient un vnement spcifique. Le programme principal est interrompu (donc, subit une INTERRUPTION), et va traiter lvnement, avant de reprendre le programme principal lendroit o il avait t interrompu.

    Linterruption est donc une RUPTURE DE SEQUENCE ASYNCHRONE, cest dire

    non synchronise avec le droulement normal du programme. Vous voyez ici lopposition avec les ruptures de squences synchrones, provoques par le

    programme lui-mme (goto, call, btfss). 10.2 Mcanisme gnral dune interruption

    Nous pouvons dire, sans nous tromper de beaucoup, quune routine dinterruption est un sous-programme particulier, dclench par lapparition dun vnement spcifique. Cela a lair un peu ardu, mais vous allez voir que cest trs simple.

    Voici donc comment cela fonctionne : - Le programme se droule normalement - Lvnement survient - Le programme achve linstruction en cours de traitement - Le programme saute ladresse de traitement de linterruption - Le programme traite linterruption - Le programme saute linstruction qui suit la dernire excute dans le programme

    principal.

    Il va bien sr de soi que nimporte quel vnement ne peut pas dclencher une interruption. Il faut que 2 conditions principales soient remplies :

    - Lvnement en question doit figurer dans la liste des vnements susceptibles de

    provoquer une interruption pour le processeur sur lequel on travaille - Lutilisateur doit avoir autoriser linterruption, cest dire doit avoir signal que

    lvnement en question devait gnrer une interruption. Organigramme gnral de lexcution dune interruption.

    37

  • Fig 6. Mchanisme gnral dune interruption

    Que pouvons-nous dire en voyant cet ordinogramme ? Et bien, nous pouvons dj nous dire que le programme principal ne sait pas quand il est interrompu, il est donc crucial de lui remettre ses registres dans ltat o ils taient avant linterruption.

    En effet, supposons que linstruction xxx ait positionn un flag (par exemple, le bit dindicateur Z). Si par malheur, la routine dinterruption a modifi ce bit, le programme ne pourra pas se poursuivre normalement. Nous voyons galement que linstruction xxx termine son excution avant de se brancher sur la routine dinterruption. Une instruction commence nest donc jamais interrompue.

    10.3 Mcanisme dinterruption sur les PICs

    Bien entendu, les PICs rpondent au fonctionnement gnral ci-dessus, mais elles ont galement leurs particularits. Voyons maintenant le principe des interruptions sur les PICs

    - Tout dabord, ladresse de dbut de toute interruption est fixe. Il sagit toujours de

    ladresse 0x04. Toute interruption provoquera le saut du programme vers cette adresse.

    - Toutes les sources dinterruption arrivant cette adresse, si le programmeur utilise

    plusieurs sources dinterruptions, il lui faudra dterminer lui-mme laquelle il est en train de traiter.

    - Les PICs en se connectant cette adresse, ne sauvent rien automatiquement, hormis le

    contenu du PC, qui servira connatre ladresse du retour de linterruption. Cest donc lutilisateur de se charger des sauvegardes.

    38

  • - Le contenu du PC est sauv sur la pile interne (8 niveaux). Donc, si vous utilisez des interruptions, vous ne disposez plus que de 7 niveaux dimbrication pour vos sous-programmes. Moins si vous utilisez des sous-programmes dans vos interruption.

    - Le temps de raction dune interruption est calcul de la manire suivante : le cycle

    courant de linstruction est termin, le flag dinterruption est lu au dbut du cycle suivant. Celui-ci est achev, puis le processeur sarrte un cycle pour charger ladresse 0x04 dans PC. Le processeur se connecte alors ladresse 0x04 o il lui faudra un cycle supplmentaire pour charger linstruction excuter. Le temps mort total sera donc compris entre 3 et 4 cycles.

    - Une interruption ne peut pas tre interrompue par une autre interruption. Les

    interruptions sont donc invalides automatiquement lors du saut ladresse 0x04 par leffacement du bit GIE (que nous allons voir).

    - Les interruptions sont remises en service automatiquement lors du retour de

    linterruption. Linstruction RETFIE agit donc exactement comme linstruction RETURN, mais elle repositionne en mme temps le bit GIE.

    Fig7. Les interruptions sur les PICs

    10.4 Les sources dinterruptions du 16F84 Le 16F84 est trs pauvre ce niveau, puisquelle ne dispose que de 4 sources dinterruptions possibles (contre 14 pour le 16F877 par exemple). Les vnements susceptibles de dclencher une interruption sont les suivants :

    - TMR0 : Dbordement du timer0 (tmr0). Une fois que le contenu du tmr0 passe de 0xff 0x00, une interruption peut tre gnre.

    - EEPROM : cette interruption peut tre gnre lorsque lcriture dans une case EEPROM interne est termine.

    - RB0/INT : Une interruption peut tre gnre lorsque, la pin RB0, encore appele INTerrupt pin, tant configure en entre, le niveau qui est appliqu est modifi.

    39

  • - PORTB : De la mme manire, une interruption peut tre gnre lors du changement dun niveau sur une des pins RB4 RB7. Il nest pas possible de limiter linterruption une seule de ces pins. Linterruption sera effective pour les 4 pins ou pour aucune.

    10.5 Le registre INTCON (INTerrupt CONtrol) Ce registre se situe ladresse 0x0B, dans les 2 banques. Il est donc toujours accessible. Il est dtaill figure 4-5 page 16. Cest un registre de bits, donc, chaque bit a une fonction particulire. Voici le dtail de ces bits : b7 : GIE

    Global Interrupt Enable bit. Il permet de valider ou dinvalider toutes les interruptions dune seule fois. Ce bit correspond donc notre interrupteur de validation gnrale. b6 : EEIE

    Eeprom write complete Interrupt Enable bit. Ce bit permet de valider linterruption de fin dcriture en eeprom (nous tudierons plus tard le mcanisme dcriture eeprom). b5 : T0IE

    Tmr0 Interrupt Enable bit : Valide linterruption gnre par le dbordement du timer0. b4 : INTE

    INTerrupt pin Enable bit : Valide linterruption dans le cas dune modification de niveau de la pin RB0.

    ATTENTION : rappelez-vous le bit 6 du registre OPTION, qui dtermine quel est le sens

    de transition qui provoque linterruption. On pourra donc choisir si cest une transition 0->1 ou 1->0 qui provoque linterruption, mais pas les deux ensemble. b3 : RBIE

    RB port change Interrupt Enable bit : Valide les interruptions si on a changement de niveau sur une des entres RB4 RB7. b2 : T0IF

    Tmr0 Interrupt Flag bit. Cest un Flag, donc il signale. Ici cest le dbordement du timer0

    b1 : INTF

    INTerrupt pin Flag bit : signale une transition sur la pin RB0 dans le sens dtermin par INTEDG du registre OPTION (b6) b0 : RBIF

    Port Interrupt Flag bit : signale quune des entres RB4 RB7 a t modifie.

    40

  • Remarque

    Rappelez-vous que les flags ne se remettent pas 0 tout seuls. Cest votre programme qui doit sen charger, sous peine de rester indfiniment bloqu dans une routine dinterruption. Nous dirons que ces flags sont des FLAGS REMANENTS

    10.6 Particulatit de linstruction RETFIE A ce niveau de lexpos, une remarque pertinente serait la suivante : Pourquoi existe-t-il une instruction RETFIE, alors quon pourrait utiliser RETURN ?

    Et bien, vous ne pouvez pas interrompre une interruption par une autre. Si ctait le cas, les sauvegardes des registres W et STATUS seraient cras par une seconde opration (mais cest possible sur dautres processeurs). Donc, ds que le programme est branch sur linterruption, le bit GIE est mis 0 automatiquement. Pour quune nouvelle interruption puisse avoir lieu une fois celle en cours termine, il faut remettre GIE 1. Ceci est excut automatiquement par RETFIE. 11-Timer0 : 11.1 Les diffrents modes de fonctionnement du timer0 :

    Nous avons vu que le timer0 est en fait un compteur. Mais que compte-t-il ? Et bien, vous avez deux possibilits.

    - En premier lieu, vous pouvez compter les impulsions reues sur le pin RA4/TOKI.

    Nous dirons dans ce cas que nous sommes en mode compteur - Vous pouvez aussi dcider de compter les cycles dhorloge du PIC lui-mme. Dans ce

    cas, comme lhorloge est fixe, nous compterons donc en ralit du temps. Donc, nous serons en mode timer .

    La slection dun ou lautre de ces deux modes de fonctionnement seffectue par le bit 5 du registre OPTION : T0CS pour Tmr0 Clock Source select bit. T0CS = 1 : Fonctionnement en mode compteur T0CS = 0 : Fonctionnement en mode timer Dans le cas o vous dcidez de travailler en mode compteur, vous devez aussi prciser lors de quelle transisition de niveau le comptage est effectu. Ceci est prcis grce au bit 4 du registre OPTION : T0SE pour Timer0 Source Edge select bit. T0SE = 0 : comptage si lentre RA4/TOKI passe de 0 1 T0SE = 1 : comptage si lentre RA4/TOKI passe de 1 0

    41

  • 11.2 Le registre tmr0

    Ce registre, qui se localise ladresse 0x01 en banque0, contient tout simplement la valeur actuelle du timer0. Vous pouvez crire ou lire tmr0. Si par exemple vous avez configur tmr0 en compteur, la lecture du registre tmr0 vous donnera le nombre dvnements survenus sur le pin RA4/TOKI.

    11.3 Les mthodes dutilisation du timer0

    Comment utiliser le timer0, et quelles sont les possibilits offertes ce niveau, voil de quoi nous allons parler ici. 11.3.1 Le mode de lecture simple La premire mthode qui vient lesprit est la suivante : Nous lisons le registre tmr0 pour voir ce quil contient. La valeur lue est le reflet du nombre dvnements survenus, en prenant garde au fait que le tmr0 ne peut compter que jusque 255. En cas de dpassement, le tmr0 recommence 0. Cest donc vous de grer cette possibilit. Petit exemple : Clrf tmr0 ; dbut du comptage ; ici un certain nombre dinstructions movf tmr0 , w ; charger valeur de comptage movwf mavariable ; sauver pour traitement ultrieur 11.3.2 Le mode de scrutation du flag Nous devons savoir ce niveau, que tout dbordement du timer0 (passage de 0xFF 0x00) entrane le positionnement du flag T0IF du registre INTCON. Vous pouvez donc utiliser ce flag pour dterminer si vous avez eu dbordement du timer0, ou, en dautres termes, si le temps programm est coul. Cette mthode linconvnient de vous faire perdre du temps inutilement Petit exemple : clrf tmr0 ; dbut du comptage bcf INTCON , T0IF ; effacement du flag loop btfss INTCON , T0IF ; tester si compteur a dbord goto loop ; non, attendre dbordement ; suite du programme ; oui, poursuivre : 256 vnements couls

    Mais vous pourriez vous dire que vous ne dsirez pas forcment attendre 256

    incrmentations de tmr0. Supposons que vous dsiriez attendre 100 incrmentations. Il suffit dans ce cas de placer dans tmr0 une valeur telle que 100 incrmentations plus tard, tmr0 dborde.

    exemple

    42

  • movlw 256-100 ; charger 256 100 movwf tmr0 ; initialiser tmr0 bcf INTCON , T0IF ; effacement du flag loop btfss INTCON , T0IF ; tester si compteur a dbord goto loop ; non, attendre dbordement ; suite du programme ; oui, poursuivre : 100 vnements couls 11.3.3 Le mode dinterruption Cest videmment le mode principal dutilisation du timer0. En effet, lorsque T0IE est positionn dans le registre INTCON, chaque fois que le flag T0IF passe 1, une interruption est gnree. 11.3.4 Les mthodes combines Supposons que vous vouliez, par exemple, mesurer un temps entre 2 impulsions sur le broche RB0. Supposons galement que ce temps soit tel que plusieurs dbordements du tmr0 puissent avoir lieu. Une mthode simple de mesure du temps serait la suivante : 1) A la premire impulsion sur RB0, on lance le timer 0 en mode interruptions. 2) A chaque interruption de tmr0, on incrmente une variable 3) A la seconde interruption de RB0, on lit tmr0 et on arrte les interruptions 4) Le temps total sera donc (256*variable)+tmr0 On a donc utilis les interruptions pour les multiples de 256, et la lecture directe de tmr0 pour les units . 11.4 Le prdiviseur

    Supposons que nous travaillons avec un quartz de 4MHz. Nous avons donc dans ce cas (4000000/4) = 1.000.000 de cycles par seconde. Chaque cycle dhorloge dure donc 1/1000000me de seconde, soit 1s.

    Si nous dcidons dutiliser le timer0 dans sa fonction timer et en mode interruptions.

    Nous aurons donc une interruption toutes les 256s, soit peut prs toutes les quarts de millime de seconde.

    Si nous dsirons raliser une LED clignotante une frquence de +- 1Hz, nous aurons

    besoin dune temporisation de 500ms, soit 2000 fois plus. Ce nest donc pas pratique. Nous disposons pour amliorer ceci dun PREDIVISEUR . Quest-ce donc ? Et bien, tout simplement un diviseur dvnements situ AVANT lentre de comptage du timer0. Nous pourrons donc dcider davoir incrmentation de tmr0 tous les 2 vnements par exemple, ou encore tous les 64 vnements.

    Regardez tableau de la page 16. Vous voyez en bas le tableau des bits PS0 PS2 du registre OPTION qui dterminent la valeur du prdiviseur.

    43

  • Ces valeurs varient, pour le timer0, entre 2 et 256. Le bit PSA, quand lui, dtermine si le prdiviseur est affect au timer0 ou au watchdog. Voici un tableau exprimant toutes les possibilits de ces bits :

    PSA PS2 PS1 PS0 /tmr0 /WD Temps tmr0 Temps typique Watchdog

    (minimal) 0 0 0 0 2 1 512 s 18 ms (7ms) 0 0 0 1 4 1 1024 s 18 ms (7ms) 0 0 1 0 8 1 2048 s 18 ms (7ms) 0 0 1 1 16 1 4096 s 18 ms (7ms) 0 1 0 0 32 1 8192 s 18 ms (7ms) 0 1 0 1 64 1 16384 s 18 ms (7ms) 0 1 1 0 128 1 32768 s 18 ms (7ms) 0 1 1 1 256 1 65536 s 18 ms (7ms) 1 0 0 0 1 1 256 s 18 ms (7ms) 1 0 0 1 1 2 256 s 36 ms (14 ms) 1 0 1 0 1 4 256 s 72 ms (28 ms) 1 0 1 1 1 8 256 s 144 ms (56 ms) 1 1 0 0 1 16 256 s 288 ms (112 ms) 1 1 0 1 1 32 256 s 576 ms (224 ms) 1 1 1 0 1 64 256 s 1,152 Sec (448 ms) 1 1 1 1 1 128 256 s 2,304 Sec (996 ms) - PSA PS0 sont les bits de configuration du prdiviseur - /tmr0 indique la valeur du prdiviseur rsultante sur le timer0 - /WD indique la valeur du prdiviseur rsultante sur le Watchdog - temps tmr0 indique le temps max entre 2 interruptions tmr0 avec quartz de 4MHz - Temps watchdog indique le temps typique disponible entre 2 reset watchdog (indpendant

    du quartz utilis). La valeur entre parenthses indique le temps minimal, qui est celui utiliser pour faire face toutes les circonstances.

    Remarques importantes : - Il ny a quun prdiviseur, qui peut tre affect au choix au timer du watchdog (que nous

    verrons plus tard) ou au timer0. Il ne peut tre affect aux deux en mme temps. - Il nexiste pas de prdiviseur = 1 pour le timer0. Si vous ne voulez pas utiliser le prdiviseur, vous devez donc imprativement le slectionner sur le watchdog avec une valeur de 1. - La valeur contenue dans le prdiviseur nest pas accessible. Par exemple, si vous dcidez

    dutiliser un prdiviseur de 64, et quil y a un moment donn 30 vnements dj survenus, vous navez aucun moyen de le savoir. Le prdiviseur limite donc la prcision en cas de lecture directe.

    - Lcriture dans le registre tmr0 efface le contenu du prdiviseur. Les vnements survenus

    au niveau du prdiviseur sont donc perdus.

    44

  • 12- Les accs en mmoire eeprom Ce paragraphe dcrit laccs dans leeprom interne du PIC. Il ne faut pas confondre ceci avec lcriture dans une eeprom externe type 2416. Pour ce type deeprom, il suffit de suivre les directives du datasheet du composant concern. 12.1 Taille et localisation de la mmoire eeprom

    Ladresse physique de la zone eeprom commence, pour les PICs mid-range, ladresse 0x2100. Cette adresse se situe hors de lespace dadressage normal des PICs, donc nous pouvons dj en dduire quil nous faudra utiliser une procdure spciale pour y accder.

    Notez dj que si ces emplacements ne sont pas accessibles directement par le

    programme, par contre ils le sont au moment de la programmation. Vous pourrez donc initialiser votre zone eeprom au moment de programmer votre composant.

    Ceci est galement vrai pour des registres spciaux des PICs. Par exemple, ladresse

    0x2007 contient les paramtres que vous crivez dans _CONFIG. Vous pourriez donc remplacer cette directive par une initialisation directe ladresse 0x2007. Nous vous le dconseillons cependant pour des raisons de portabilit et dvolution rapide vers une autre famille de PICs.

    De mme, ladresse 0x2006 contient lidentification du composant. Cest ainsi quun

    programmateur volu peut faire la distinction entre une 16F84 et une 16F84A, car leur identification constructeur diffre.

    La 16F84 dispose de 64 emplacements eeprom disponibles pour votre libre usage. Nous

    allons voir comment les utiliser. 12.2 Le registre EEDATA

    Cest dans ce registre que va transiter la donne crire vers ou la donne lue en provenance de leeprom. Ce registre est situ ladresse 0x08 banque0. 12.3 Le registre EEADR

    Dans ce registre, situ ladresse 0x09 banque0, nous allons prciser sur 8 bits ladresse concerne par lopration de lecture ou dcriture en eeprom. Nous voyons dj que pour cette famille de PICs, nous ne pourrons pas dpasser 256 emplacements deeprom. Pour la 16F84, la zone admissible va de 0x00 0x3F, soit 64 emplacements. 12.4 Le registre EECON1

    Ce registre, situ ladresse 0x88 en banque1, contient 5 bits qui dfinissent ou indiquent le fonctionnement des cycles de lecture/criture en eeprom. Voici son contenu :

    bits 7/6/5

    non utiliss

    45

  • bit 4 : EEIF

    Eeprom write operation Interrupt Flag bit. Cest le flag qui est en liaison avec linterruption EEPROM. Il passe 1 une fois lcriture en eeprom termine. Si le bit EEIE du registre INTCON est 1, une interruption sera gnre bit 3 : WRERR

    WRite Error. Cest un bit derreur. Il passe 1 si une opration dcriture en eeprom a t

    interrompue, par exemple par un reset. bit 2 : WREN WRite ENable. Autorisation de dmarrage du cycle dcriture bit 1 : WR

    WRite. Dmarrage du cycle dcriture. Est remis 0 automatiquement une fois lcriture termine. bit 0 : RD

    ReaD. Dmarrage dun cycle de lecture. Reste 1 durant un cycle, puis est remis 0 automatiquement 12.5 Le registre EECON2 Nous revoici en prsence dun registre fantme , puisque ce registre nexiste pas. Il sagit tout simplement dune adresse 0x89 banque1, qui sert envoyer des commandes au PIC concernant les procdures eeprom. Vous ne pouvez lutiliser quen vous servant des instructions expliques plus bas. 12.6 Accs en lecture dans la mmoire eeprom

    Pour lire une donne en eeprom, il suffit de placer ladresse concerne dans le registre EEADR. Ensuite, vous positionnez le bit RD 1. Vous pouvez ensuite rcuprer la donne lue dans le registre EEDATA. Il ne faut pas bien sr oublier les diffrents changements de banques.

    Comme cette procdure est courte et toujours la mme, nous allons crer une macro

    cette intention. Comme la macro doit contenir ladresse de lecture, nous raliserons une macro avec passage de paramtre. Voici la macro ajouter. Vous devrez tre dans la banque0 pour appeler cette macro, et elle vous retourne la valeur lue dans le registre W. READEE macro adeeprom ; macro avec 1 paramtre (argument) movlw adeeprom ; charger adresse eeprom (argument reu) movwf EEADR ; adresse lire dans registre EEADR bsf STATUS , RP0 ; passer en banque1

    bsf EECON1 , RD ; lancer la lecture EEPROM bcf STATUS , RP0 ; repasser en banque0

    46

  • movf EEDATA , w ; charger valeur lue dans W endm ; fin de la macro

    Vous remarquez que vous passez un argument la macro. Vous dsignez cet ou ces arguments aprs la directive macro. Nous avons utilis ici largument adeeprom pour indiquez ladresse eeprom. Chaque utilisation de adeeprom dans notre macro sera remplace par largument reu au moment de lappel de la macro.

    Pour utiliser cette macro, nous devons donc lui passer un argument. Par exemple :

    READEE eereload ; lecture de ladresse eereload de leeprom Lira leeprom ladresse eereload, cest dire ladresse 0x00. 12.7 Laccs en criture la zone eeprom

    Maintenant vous allez nous dire avec raison que cela ne sert rien de lire en eeprom si on narrive pas y crire. Notre programme ne prsente donc rien de plus que ce que nous avions auparavant. Cest tout fait justifi. Aussi allons-nous tudier la mthode dcriture. Comme vous vous en doutez, cette mthode utilise les mmes registres. La procdure suivre consiste dabord placer la donne dans le registre EEDATA et ladresse dans EEADR. Ensuite une squence spcifique (il ny a rien comprendre, cest impos par le constructeur) doit tre envoye au PIC. 13- Le watchdog Le watchdog, ou chien de garde est un mcanisme de protection de votre programme. Il sert surveiller si celui-ci sexcute toujours dans lespace et dans le temps que vous lui avez attribus. 13.1 Le principe de fonctionnement

    La mise en service ou larrt du watchdog se dcide au moment de la programmation de votre PIC, laide de la directive _CONFIG. Si vous prcisez le paramtre _WDT_OFF est prcis, le watchdog ne sera pas en service. Si au contraire vous prcisez _WDT_ON , le watchdog sera actif.

    IL NEST DONC PAS POSSIBLE DE METTRE EN OU HORS SERVICE LE

    WATCHDOG DURANT LEXECUTION DE VOTRE PROGRAMME. Le fonctionnement du watchdog est li un timer interne spcifique, qui nest pas synchronis au programme, ni un vnement extrieur. La dure spcifique de dbordement de ce timer est approximativement de 18ms. Cette valeur est prendre avec prcaution, car elle varie en fonction de diffrents paramtres comme la tension dalimentation ou la temprature. La valeur minimale de 7ms est celle que vous devrez utiliser dans la pratique. Chaque fois que linstruction clrwdt est envoye au PIC, le timer du watchdog est remis 0, ainsi que la valeur contenue dans son prdiviseur. Si par accident cette instruction nest pas reue dans le dlai prvu, le PIC est redmarre ladresse 0x00 et le bit TO du

    47

  • registre STATUS est mis 0. En lisant ce bit au dmarrage, vous avez donc la possibilit de dtecter si le PIC vient dtre mise sous tension, ou si ce dmarrage est du un plantage de votre programme. 13.2 Le prdiviseur et le watchdog

    Nous avons vu dans les leons prcdentes que le prdiviseur pouvait tre affect au tmr0 ou au watchdog, via le bit PSA du registre OPTION. Si nous dcidons de mettre le prdiviseur sur le watchdog (PSA = 1), le tableau de la page 16 nous donnera les valeurs du prdiviseur obtenues suivant les bits PS0/PS2. En ralit, pour le watchdog, il sagit dun postdiviseur, mais cela ne concerne que llectronique interne du PIC. Vous navez pas vous tracasser pour cette diffrence.

    Ce prdiviseur multiplie le temps de dbordement du timer du watchdog. Par exemple,

    avec un prdiviseur de 2, vous obtenez un temps minimal de 7ms*2 = 14ms. Donc, avec un quartz de 4MHz, cela vous oblige envoyer linst