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 duneseule 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 : J usqu'a 12KO de ROM ou d'EPROM (mmoire programme) J usqu'a 1 KO de RAM (mmoire donne) J usqu'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 (2 11 ).
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 (2 10 =1024 =1K).
Par convention, en effet, 1Kbytes correspond 2 10 =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 9 me 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 9 me bit, donc le bit 8, donc 2 8 =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 <<Ledcli.asm>>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 :
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 2 13 ).
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 9 me 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 :
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.
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 * ;**********************************************************************
;********************************************************************* ; 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 3 me 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/1000000 me 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 linstruction clrwdt au moins une fois tous les 14.000 cycles dinstructions. Dans la plupart des cas, le reset seffectuera en ralit aprs 18ms*2 =36ms, soit 36.000 cycles dinstructions.
13.3 Les rles du watchdog
Le watchdog est destin vrifier que votre programme ne sest pas gar dans une zone non valide de votre programme (parasite sur lalimentation par exemple), ou sil nest pas bloqu dans une boucle sans fin (bug du programme). Il sert galement rveiller un PIC place en mode sleep , ce que nous verrons plus tard.
13.4 Utilisation correcte du watchdog
La premire chose faire, si vous dsirez profiter de cette protection intgre, est de paramtrer la _CONFIG pour la mise en service du watchdog. La premire chose constater, cest que si vous indiquez _WDT_ON pour un programme qui ne gre pas le watchdog, celui-ci redmarrera sans arrt, et donc ne fonctionnera pas, car il ne contiendra aucune instruction clrwdt .
Cest une erreur frquente pour ceux qui ne matrisent pas les bits de configuration de leur programmateur. Les bits de configurations indiqus dans le fichier sont en effet modifiables sur la plupart des softs de programmation, qui sont capables de forcer une valeur de _CONFIG diffrente de celle prvue par le concepteur du logiciel.
Ensuite, vous devez placer une ou plusieurs instructions clrwdt dans votre programme en vous arrangeant pour quune instruction clrwdt soit reue dans les dlais requis par votre PIC. A ce propos, ne tenez pas compte du temps nominal de 18ms, mais plutt du temps de la situation la plus dfavorable. Ce temps est de minimum 7ms. En prenant ce temps comme temps maximum autoris, vous tes certain que votre programme fonctionnera dans toutes les conditions.
14- Le mode Sleep
Nous allons tudier dans ce paragraphe un mode trs particulier des PICs, qui leur permet de se mettre en sommeil afin de limiter leur consommation. 48
14.1 Principe de fonctionnement
Le mode sleep ou power down est un mode particulier dans lequel vous pouvez placer votre PIC grce linstruction sleep . Une fois dans ce mode, le PIC est place en sommeil et cesse dexcuter son programme. Ds rception de cette instruction, la squence suivante est excute :
- Le watchdog est remis 0, exactement comme le ferait une instruction clrwdt .
- Le bit TO du registre STATUS est mis 1.
- Le bit PD du registre STATUS est mis 0.
- Loscillateur est mis larrt, la PIC nexcute plus aucune instruction.
Une fois dans cet tat, le PIC est larrt. La consommation du circuit est rduite au minimum. Si le tmr0 est synchronis lhorloge interne, il est galement mis dans lincapacit de compter.
Par contre, il est trs important de se rappeler que le timer du watchdog possde son propre circuit dhorloge. Ce dernier continu compter comme si de rien ntait.
Pour profiter au maximum de la chute de la consommation (montage sur piles par exemple), Microchip recommande de veiller ce que les pins dentres/sorties et llectronique connecte soient des niveaux 0 ou 1 tels quil ny ait aucun passage de courant qui rsulte du choix de ces niveaux.
14.2 La sortie du mode sleep
Le passage en mode sleep na rellement dintrt que sil est possible den sortir. La 16F84 ne ragit dans ce mode quaux vnements suivants, qui sont seuls susceptibles de replacer la 16F84 en mode de fonctionnement normal. Ces vnements sont les suivants :
- Application dun niveau 0 sur le pin MCLR. Ceci provoquera un reset de la 16F84. La PIC effectuera un reset classique ladresse 0x00. Lutilisateur pourra tester les bits TO et PD lors du dmarrage pour vrifier lvnement concern (reset, watch-dog, ou mise sous tension).
- Ecoulement du temps du timer du watchdog. Notez que pour que cet vnement rveille le PIC, il faut que le watchdog ait t mis en service dans les bits de configuration. Dans ce cas particulier, le dbordement du watchdog ne provoque pas un reset du PIC, il se contente de la rveiller. Linstruction qui suit est alors excute au rveil.
- Une interruption RB0/INT, RB, ou EEPROM est survenue. Notez que pour quune telle interruption puisse rveiller le processeur, il faut que les bits de mise en service de linterruption aient t positionns. Par contre le bit GIE na pas besoin dtre mis en service pour gnrer le rveil du PIC. Vous pouvez donc dcider par exemple de rveiller le PIC la fin du cycle dcriture EEPROM. Pour ce faire, vous devez mettre 49 le bit EEIE de INTCON 1 et lancer le cycle dcriture, suivi par linstruction sleep Une fois lcriture termine, le PIC est rveille et poursuit son programme.
14.3 Rveil avec GIE hors service.
Si votre PIC est rveille par une interruption alors que le BIT GIE de INTCON est mis 0, le programme se poursuivra tout simplement linstruction qui suit linstruction sleep .
14.4 Rveil avec GIE en service
Dans le cas o votre bit GIE est positionn, un rveil suite une interruption entranera la squence suivante.
- Linstruction qui suit linstruction sleep est excute.
- Le programme se branche ensuite ladresse 0x04 comme une interruption ordinaire. Notez que si vous ne voulez pas excuter linstruction qui suit linstruction sleep , il vous suffit de placer cet endroit une instruction nop .
14.5 Cas typiques dutilisation
Ce mode de fonctionnement est principalement utilis dans les applications dans lesquelles la consommation en nergie doit tre conomise (piles). On placera donc dans ce cas le PIC en mode Power Down ou sleep aussi souvent que possible.
Une autre application typique est un programme dans lequel le PIC na rien faire dans lattente dun vnement extrieur particulier. Dans ce cas, plutt que dutiliser des boucles sans fin, une instruction sleep pourra faire efficacement laffaire.
D- LE PIC16F877:
1-Introduction
Le 16F877 est un microcontroleur mmoire FLASH de la famille des PIC de Microchip. Son prdcesseur le plus connu, est le 16F84. Cest le microcontroleur le plus riche en priphriques de cette gamme. Il sagit dun circuit intgr contenu dans un botier dit DIL 40 . Il prsente donc 40 broches, 20 de chaque ct. Les broches sont virtuellement numrotes de 1 40, la broche 1 tant celle qui se trouve dans le coin situ gauche de lencoche de reprage. Comme pour tout circuit intgr, chacune de ses broches a une ou plusieurs fonctions qui sont rsumes par un sigle mnmotechnique.
50
Fig9.Brochage du 16f877 1.1 Les broches dalimentation :
Le 16F877 a des broches dalimentation : 2 pour le 0V broche 11 et 32 et 2 pur le +5V broche 12 et 31. Il suffit de connecter une de chaque lalimentation pour que le CI fonctionne.
1.2 Les broches du Quartz :
Comme pour tout micrcontrleur, le 16F877 a besoin dune horloge pour fixer la vitesse dexcution des instructions. On utilise pour ce faire un quartz dont le rle est de crer une impulsion de frquence leve.
Le micrcontrleur se base sur cette frquence pour son fonctionnement interne. Notons que le 16F877 excute une instruction lmentaire du langage assembleur en 4 cycles dhorloge. Il va donc pouvoir excuter 1millions doprations lmentaires par seconde.Le quartz est connect sur les 2 broches OSC1 et OSC2. 51
Fig10.Architecture interne du 16f877 2- Les Ports du 16F877 :
Le 16F877 possde 5 ports diffrents :
- le port A (6 broches) - le port B (8 broches) - le port C (8 broches) 52 - le port D (8 broches) - le port E (3 broches)
Les broches de chaque port sont numrotes de 0 n. Les broches de ports sont dsignes par un R suivi de la lettre du port et du numro de broche. Ainsi, la broche 0 du port A est dsigne par RA0, la broche 4 du port B par RB4, etc On a donc 33 broches dentres-sorties (E/S) disponibles. Cest lun des grands avantages du 16F877. Mais toutes ces broches ne seront pas forcment disponibles en tant que broche E/S car presque toutes sont galement utilises par lun ou lautre des modules internes du 16F877. Elles ne seront pas disponibles en tant que broche E/S si le module concern est activ. Toutes les broches de ces ports sont des broches E/S, on peut donc les configurer en entre ou en sortie.Les caractristiques lectriques de ces broches sont spcifies dans le datasheet du micrcontrleur Chaque port est configur par un registre nomm TRIS, suivi de la lettre du port. Ainsi le port A est configur par le registre TRISA. Chaque bit de ces registres (TRIS) dtermine le sens Entre ou Sortie des broches du port.
2.1 Le PORTA :
Le port A contient 6 pins I/O (input/output) numrotes de RA0 RA5. On a donc 6 bits dans le registre PORTA et 6 bits dans le registre TRISA. Les bits 6 et 7 de ces registres ne sont pas implments. Le port A est configur comme un ensemble dentres analogiques. Donc, il faut forcer une valeur dans le registre ADCON1 dans la routine dinitialisation pour pouvoir utiliser ce port comme port dentre/sortie de type gnral.
2.2 Le PORTB :
Ce port fonctionne exactement comme celui du 16f84.
2.3 Le PORTC :
Ce port utilise un registre TRISC localis dans la banque 1, qui permet de dcider quelles sont les entres et quelles sont les sorties. le positionnement dun bit 1 place la pin en entre, le positionnement de ce bit 0 place pin en sortie. Nous trouvons galement le registre PORTC, qui se trouve dans la banque 0.
2.4 Le PORTD :
Le registre TRISD comporte 8 bits de direction, pendant que le registre PORTD correspond aux pins I/O concernes.
2.5 Le PORT E :
Il ne comporte que 3 pins, RE0 RE2 ces pins peuvent galement tre utilises comme pins dentres analogiques. Le registre ADCON1 dtermine si ce port sera utilis comme port I/O ou comme port analogique.
2.5.1 Le registre TRISE :
Le registre TRISE dispose de certains bits de configuration. 53
b7 : IBF : Input Buffer Full status bit b6 : OBF : Output Buffer Full status bit b5 : IBOV : Input Buffer OVerflow detect bit b4 : PSPMODE : Parallel Slave Port MODE select bit b3 : 0 : Non implment (lu comme 0 ) b2 : Direction I/O pour RE2 (1 =entre) b1 : Direction I/O pour RE1 b0 : Direction I/O pour RE0
Ls bits 0 2 fonctionnent de faon identique ceux des autres TRISx. Un bit 1 positionne le pin en entre, un bit 0 la positionne en sortie. Le bit 4 (PSPMODE) est le bit qui dtermine si le PORTD sera utilis en port I/O. Si On place ce bit a 1, le PORTD sera considr comme un port dinterfaage parallle avec un microprocesseur (fonctionnement esclave).
3-La mmoire du Pic :
La mmoire du 16F877 est divise en trois parties distinctes :
3.1. Une mmoire FLASH (8K).
Cest la mmoire programme proprement dite. Chaque case mmoire unitaire fait 13 bits. La mmoire FLASH est un type de mmoire stable, quon peut recrire volont cette mmoire flash fait 8Koctet.
3.2. Une mmoire RAM ( 368 octets).
La mmoire RAM disponible du 16F877 est de 368 octets, rpartie de la manire suivante :
1) 80 octets en banque 0, adresses 0x20 0x6F 2) 80 octets en banque 1, adresses 0xA0 0XEF 3) 96 octets en banque 2, adresses 0x110 0x16F 4) 96 octets en banque 3, adresses 0x190 0x1EF 5) 16 octets communs aux 4 banques, soit 0x70 0x7F ; 0xF0 0xFF ; 0x170 0x17F ; 0x1F0 0x1FF. La signification de ces octets communs est que si on accde au registre (adresse mmoire RAM) 0x70 ou au registre 0XF0, en ralit on accde au mme emplacement. Ceci lavantage de permettre dutiliser ces emplacements sans devoir connatre ltat de RP0, RP1, et IRP.
54
Fig11.La RAM du 16F877
3.3 Une EEPROM Interne ( 256 Octets). Cest une mmoire de donnes.
4-Les modules internes du 16F877 :
Le 16F877 comprend :
1. Trois timers / compteurs : - le timer 0 - le timer 1 - le timer 2
55 2. Un convertisseur analogique-numrique (CAN) 10 bits 8 canaux
3. Deux modules de gnration dimpulsion priode rglable (PWM), qui fonctionnent aussi en mode capture et comparaison
4. Un module de communication srie synchrone
5. Une USART
6. Un module de communication en port parallle en mode esclave
7. Un chien de garde
4.1. Les Trois timers / compteurs :
Lintrt des modules de comptage, cest quils permettent de tenir compte dvnements qui surviennent de faon rpte sans que le microprocesseur soit monopolis par cette tche. Dans la plupart des cas, une interruption a lieu que lorsque le compteur dborde (overflow). 4.1.1. Le timer 0 : fonctionne exactement comme dcrit dans la partie du microcontroleur 16F84.
4.1.2. Le timer 1 :cest un compteur 16 bits qui peut compter (de 0 65535) : - soit les impulsions de lhorloge - soit les impulsions externes, et en particulier les impulsions dun quartz externe. Le dbordement provoque aussi une interruption.
4.1.2.1 Caractristiques du timer 1 :
Le timer 1 fonctionne dans son ensemble comme le timer 0. Ce timer est capable de compter sur 16 bits, il sera donc capable de compter de D0 D65535. Le Comptage avec le timer 16 bits ncessite 2 registres. Ces registres se nomment TMR1L et TMR1H. Le contenu de TMR1L et de TMR1H nest pas remis 0 lors dun reset. Donc, pour compter partir de 0, il faut remettre 0 les deux registres. Le timer 1 permet galement, de gnrer une interruption une fois le dbordement effectu. Le timer 1 dispose, de la possibilit de mettre en service un prdiviseur. Mais ce prdiviseur ne permet quune division maximale de 8. Par consquent il peut atteindre une valeur maximale de 65536 multipli par 8, soit 524288.
4.1.2.2 Le timer 1 et les interruptions :
Le timer 1 permet, de gnrer une interruption au moment ou il dborde, cest--dire au moment o sa valeur passe de 0xFFFF 0x0000. Pour que le timer 1 gnre une interruption les conditions suivantes doivent etre satisfaites : - Il faut que le bit dautorisation dinterruption du timer 1 (TMR1IE) soit mis 1. Ce bit se trouve dans le registre PIE1. - Pour que le registre PIE1 soit actif, il faut que le bit PEIE dautorisation des interruptions priphriques soit positionn dans le registre INTCON. 56 - Il faut que le bit dautorisation gnrale des interruptions (GIE) soit positionn dans le registre INTCON. Une interruption sera alors gnre chaque dbordement du timer1. Cet vnement sera indiqu par le positionnement du flag TMR1IF dans le registre PIR1.
4.1.2.3 Les diffrents modes de fonctionnement du timer1 :
Le timer 1 peut fonctionner en mode timer, ou en mode compteur. Cependant, le timer 1 dispose de 2 modes diffrents en mode comptage : un mode de type synchrone et un mode de type asynchrone. Cest dire en synchronisme ou non avec lhorloge interne. On a la possibilit, au niveau du timer 1, dutiliser un quartz sur les pins T1OSI et T1OSO afin de disposer dune horloge spare de lhorloge principale. Le timer peut donc fonctionner en tant que : - Timer bas sur lhorloge interne (compteur de cycles dinstruction) - Timer bas sur une horloge auxiliaire - Compteur synchrone - Compteur asynchrone. Les modes de fonctionnement sont dfinis en configurant correctement le registre T1CON.
4.1.2.4 Le registre T1CON :
Ce registre, situ en banque 0, va permettre de configurer le timer1 en fonction des besoins dutilisation .Les bits qui le composent sont :
b7 : Inutilis b6 : Inutilis b5 : T1CKPS1 : Timer 1 oscillator ClocK Prescale Select bit 1 b4 : T1CKPS0 : Timer 1 oscillator ClocK Prescale Select bit 0 b3 : T1OSCEN : Timer 1 OSCillator ENable control bit b2 : T1SYNC : Timer 1 external clock input SYNChronisation control bit b1 : TMR1CS : TiMeR 1 Clock Source select bit b0 : TMR1ON : TiMeR 1 ON bit Les bits T1CKPS1 et T1CKPS0 dterminent eux deux la valeur du prdiviseur. Le prdiviseur, permet, de ne pas compter chaque vnement reu, mais seulement chaque multiple de cet vnement. La valeur de ce multiple est la valeur du prdiviseur.
T1CKPS1 T1CKPS0 Valeur du prdiviseur
0 0 1 0 1 2 1 0 4 1 1 8 T1OSCEN : ce bit permet de mettre en service loscillateur interne, et donc permet dutiliser un second quartz pour disposer dun timer prcis travaillant une frquence distincte de la frquence de fonctionnement du PIC. Si on place ce bit 1 , on met en service loscillateur interne. T1SYNC : permet de choisir si le comptage des vnements sera effectu de faon synchrone ou asynchrone avec lhorloge principale du PIC. Lorsque TMR1 est utilis en mode timer , 57 T1SYNC na aucune influance. Le comptage tant dtermin par loscillateur principal du PIC, il est automatiquement synchrone. TMR1CS : permet de dfinir quel est le mode de comptage du timer 1 : - Soit on place TMR1CS 0 , dans ce cas, le timer compte les cycles dinstructions du PIC. - Soit, on place ce bit 1 , et TMR1 compte alors les flancs montants du signal appliqu sur le pin RC0/T1OSO/T1CKI . TMR1ON, si ce bit est mis 1 , autorise le timer 1 fonctionner, alors que sil est mis 0 , fige le contenu du timer 1, et donc, le met larrt. - lors dune criture dans TMR1L ou TMR1H.
4.1.3. Le timer 2 :
Le timer 2 est un timer coupl au module CCP. Il est utilis essentiellement pour la gnration dimpulsions priode ajustable (PWM). Le timer2 dispose de certaines caractristiques diffrentes des deux autres timers.
4.1.3.1 Caractristiques du timer 2 :
Le timer 2 est un compteur sur 8 bits. Il possde lui aussi un prdiviseur. Celui-ci peut tre paramtr avec une des 3 valeurs suivantes : 1,4, ou 16. Cependant, le timer 2 dispose galement dun postdiviseur, qui effectue une seconde division aprs lunit de comparaison. Ce postdiviseur peut prendre nimporte quelle valeur comprise entre 1 et 16. La valeur du diviseur total est obtenue en multipliant la valeur du prdiviseur par celle du postdiviseur.On obtient alors les valeurs suivante du diviseur :
Le timer 2 incrmente le registre TMR2, (un seul registre comptage sur 8 bits). Les valeurs de division minimale et maximale sont identiques celles du timer 0. Le registre TMR2 est remis automatiquement 0 lors dun reset, contrairement au timer 1. Ce timer ne dispose daucune entre extrieure via un pin du PIC. Il ne peut donc fonctionner quen mode timer avec lhorloge interne.
4.1.3.2 Le timer 2 et les interruptions :
Le timer 2 fonctionne, ce niveau, comme le timer1. Le flag dinterruption se nomme TMR2IF tandis que le bit dautorisation sappelle TMR2IE. Il sagit dune interruption priphrique, la procdure pour autoriser les interruptions du timer 2 se fait en 3 tapes : - Autorisation des interruptions priphriques via le bit PEIE du registre INTCON - Autorisation de linterruption timer 2 via TMR2IE du registre PIE1 - Autorisation gnrale des interruptions via le bit GIE du registre INTCON
4.1.3.3 Le timer 2 et les registres PR2 et T2CON :
La particularit du timer 2 cest la possibilit davoir un dbordement avec une valeur prdfinie par lutilisateur cette valeur tant mmorise dans le registre PR2. On peut donc 58 avoir, par exemple, un dbordement de 0x56 0x00, en plaant la valeur 0x56 comme valeur maximale dans le registre PR2. On peut donc dire que le fonctionnement du timer est le suivant : - On incrmente le contenu du prdiviseur chaque cycle dinstruction - Chaque fois que ce contenu correspond un multiple de la valeur du prdiviseur, on incrmente TMR2. - Chaque fois que le contenu de TMR2 dpasse le contenu de PR2, on remet TMR2 0, et on incrmente le contenu du postdiviseur. - Chaque fois que le contenu du postdiviseur correspond un multiple de la valeur du postdiviseur, on positionne le flag TMR2IF. - Chaque fois que le contenu du postdiviseur est gal un multiple de la valeur de ce celui-ci, paramtre par TOUTPS0 TOUTPS3, le flag TMR2IF est forc 1, et une interruption est ventuellement gnre. Une criture dans le registre TMR2 efface le contenu du prdiviseur et du postdiviseur.
En conclusion ; le principal avantage du timer2, est quil permet de configurer le dbordement sur nimporte quelle valeur de TMR2, associ un large ventail de valeurs de diviseur. Cet avantage, combin la grande flexibilit de lensemble prdiviseur/postdiviseur, permet dobtenir trs facilement des dures dinterruption prcises sans complications logicielles. Le contenu du registre T2CON, qui permet de paramtrer le prdiviseur et le postdiviseur, ainsi que dautoriser ou non le fonctionnement du timer2, est le suivant :
T2CON (en banque 0 ) - b7 : non utilis, - b6 : TOUTPS3 : Timer2 OUTput PostScale bit 3 - b5 : TOUTPS2 : Timer2 OUTput PostScale bit 2 - b4 : TOUTPS1 : Timer2 OUTput PostScale bit 1 - b3 : TOUTPS0 : Timer2 OUTput PostScale bit 0 - b2 : TMR2ON : TiMeR 2 ON - b1 : T2CKPS1 : Timer 2 ClocK PreScale bit 1 - b0 : T2CKPS0 : Timer 2 ClocK PreScale bit 0
Les bits TOUTPSx permettent de configurer la valeur du postdiviseur. Il y a 16 valeurs possibles (0 15). Comme une valeur de diviseur de 0 na aucun sens, le nombre form par les 4 bits de TOUTPSx est incrment de 1 pour obtenir la valeur effective du postdiviseur. Les valeurs utilisables sont donc :
La formule de la dure sparant 2 positionnements conscutifs du flag TMR2IF est :
Dure totale = temps dune instruction * prdiviseur * postdiviseur * (PR2 +1)
La valeur maximale est, comme pour le timer 0 de 16*16*256 =65536.
4.2. Un convertisseur analogique-numrique (CAN) 10 bits :
Le CAN prsent dans le 16F877 est un CAN 10bits. Un CAN convertit une tension analogique en une valeur numrique binaire, qui pourra ensuite tre utilise pour des calculs ou autres. Sa rsolution de 10bits donne une prcision en 5V de 5mv environ.
Par ailleurs, ce CAN peut convertir les tensions de 8 voies analogiques. Ce CAN tant associ au microcontrleur, il va tre possible denvisager dacqurir des donnes.
4.2.1. Principe de conversion :
Le 16F877 travaille avec un convertisseur analogique / numrique qui permet un chantillonnage sur 10 bits. Le signal numrique peut donc prendre 1024 valeurs possibles. Pour pouvoir convertir une grandeur, nous devons connatre la valeur minimale quelle peut prendre, ainsi que sa valeur maximale. Les pics considrent par dfaut que la valeur minimale correspond leur Vss dalimentation, tandis que la valeur maximale correspond la tension positive dalimentation Vdd. Mais il est cependant possible dutiliser dautres valeurs. La squence de conversion linterieur du PIC est la suivante : - Le pic connecte la pin sur laquelle se trouve la tension numriser un condensateur interne, qui va se charger via une rsistance interne jusque la tension applique. - Le pin est dconnect du condensateur, et ce dernier est connect sur le convertisseur analogique/numrique interne. - Le pic procde la conversion.
4.2.2. Le temps dacquisition :
60 Cest le temps quil faut pour que le condensateur interne atteigne une tension proche de la tension convertir. Cette charge seffectue travers une rsistance interne et la rsistance de la source connecte au pin. Ce temps est incrment du temps de raction des circuits internes, et dun temps qui dpend de la temprature (coefficient de temprature). En effet que les rsistances augmentent avec la temprature, donc les temps de raction des circuits galement. Donc, si on pose :
Tacq = temps dacquisition total Tamp = temps de raction des circuits Tc = temps de charge du condensateur Tcoff = temps qui dpend du coefficient de temprature. La formule est donc : Tacq = Tamp + Tc + Tcoff
Le temps de raction Tamp est typiquement de 2s, Tamp =2s Pour le cofficient de temprature, il nest ncessaire que pour les tempratures suprieures 25C. Dans les autres cas on peut le ngliger. Ce cofficient est typiquement de 0,05 s par C qui est suprieur 25C. Donc, ce temps Tcoff sera au minimum de 0 ( moins de 25C) et au maximum de (50-25)*0.05, soit 1,25 s. La t du pic ne pouvant pas, en effet, excder 50C.
Le temps de charge dpend de la rsistance place en srie avec le condensateur. En ralit, il y a 2 rsistances, celle de la source de signal, et celle lintrieur du PIC. Il est recommand que la rsistance de la source reste infrieure 10KOhms. La rsistance interne au PIC est directement lie la tension dalimentation. Plus la tension baisse, plus la rsistance est leve, donc plus le temps de chargement est long. La rsistance interne totale (compose de 2 rsistances internes) varie de 6Kohms 6V pour arriver 12Kohms sous 3V, en passant par 8Kohms sous 5V.
Le condensateur interne une valeur de 120pF, les formules du temps de chargement dun condensateur est :
Tc = -C * (Rinterne + Rsource) * ln (1/2047)
La valeur 2047 vient du fait que pour numriser avec une prcision de bit, la numrisation utilisant une valeur maximale de 1023, la charge du condensateur doit tre au minimum de 2046/2047 me de la tension mesurer. Comme C et ln(1/2047) sont des valeurs fixes la constante sera :
-C * ln(1/2047) = 0,914895 * 10 -9
La formule devient donc :
Tc = 0,914895 * 10 -9 * (Rinterne + Rsource)
Si on se place dans le cas le plus dfavorable (tension de 3V, et rsistance source = 10Kohms), notre temps de chargement est de =
Tc = 0,914895 * 10 -9 * (10 * 10 + 12 * 10) 61
Tc maximal = 20,12 s
Pour le cas le plus favorable (tension de 6V, et rsistance source ngligeable) :
Tc = 0,914895 * 10 -9 * (0 * 10 + 6 * 10)
Tc minimal : 5,48 s.
Dans le cas typique, savoir une tension dalimentation de 5V et une rsistance de source de 10 Kohms, nous aurons :
Tc = 0,914895 * 10 -9 * (10 * 10 + 8 * 10)
Tc typique = 16,46 s.
Le temps total dacquisition Tacq pour le cas typique est :
Tacq sous 5V = 2s + 16,46s + 1,25s = 19,71s.
Donc, On prendra un Tacq de 20s pour une alimentation de 5V.
4.2.3. La conversion :
Le principe utilis est celui de lapproximation successive. Cette mthode consiste couper lintervalle dans lequel se trouve la grandeur analogique en 2 parties gales, et de dterminer dans laquelle de ces deux parties se situe la valeur numriser. Une fois cet intervalle dtermin, on le coupe de nouveau en deux, et on continu ainsi jusqu lobtention de la prcision demande.Cette mthode permet un gain de temp considrable. Le temps ncessaire la conversion est gal au temps ncessaire la conversion dun bit multipli par le nombre de bits dsirs pour le rsultat. La conversion dun bit ncessite un temps quon nomme Tad. Le temps de conversion Tad peut prendre une valeure minimale de 1,6s. La formule dobtention des temps Tad est :
Le temps dinstruction (Tosc) divis par le diviseur donn.
Le PIC ncessite galement un temps Tad avant le dmarrage effectif de la conversion, et un temps supplmentaire Tad la fin de la conversion. Donc, le temps total de conversion est de :
- Tad : avant le dbut de conversion (le temps de connexion du condensateur est inclus) - 10 * Tad pour la conversion des 10 bits du rsultat - Tad supplmentaire pour la fin de la conversion de b0
62 Le total, est un un temps de 12 Tad.
Un temps quivalent 2 * Tad est ncessaire avant de pouvoir effectuer une nouvelle conversion. Donc le temps ncessaire pour effectuer lensemble des oprations :
- chargement du condensateur interne (ncessite le temps Tacq) - on effectue la conversion (ncessite le temps 12 * Tad) - attente de 2 * Tad avant de pouvoir recommencer une autre conversion
4.2.4. Frquence maximale dchantillonage :
La frquence maximale la quelle on peut chantillonner le signal analogique, dans le cas le plus dfavorable avec une alimentation de 5V :
T entre 2 chantillonnages = Tacq + 12 Tad + 2 Tad = Tacq + 14 Tad = 19.71+14*1.6 = 42.11s Ceci correspond une frquence de :
F = 1/T =23747 Hz
Cette frquence permet dchantillonner des signaux sinusodaux dune frquence maximale de 11874 Hz (la moiti de la frquence dchantillonnage).
4.2.5 Les pins et les canaux utiliss par le convertisseur :
Le PIC ne contient quun seul convertisseur, mais il dispose de plusieurs pins sur lesquelles connecter les signaux analogiques. Un circuit de commutation slectionne laquelle des pins sera relie au condensateur de maintien interne durant le temps Tacq. Les diffrentes entres sont des canaux diffrents dun seul convertisseur. Le 16F877 dispose de 8 canaux dentre analogique. On peut chantillonner jusque 8 signaux diffrents sur les pins AN0 AN7. Les pins AN0 AN4 sont les dnominations analogiques des pins RA0 RA5 (RA4 non inclus), tandis que les pins AN5 AN7 sont les dnominations analogiques des pins RE0 RE2. 63
Fig12. Multiplexage des voies analogiques
4.2.6. Les tensions de rfrence :
La conversion analogique/numrique ncessite une tension de rfrence minimale (Vref-) et une tension de rfrence maximale (Vref+). Au niveau du PIC, il y a 3 modes de fonctionnement possibles :
- Utilisation de Vss (masse du PIC) comme tension Vref- et de Vdd (alimentation positive du PIC) comme tension Vref+. Dans ce mode, les tensions de rfrences sont xtraites en interne de la tension dalimentation.
- Utilisation du pin Vref+pour fixer la tension de rfrence maximale Vref+, et utilisation de Vss comme tension de rfrence Vref-. Dans ce cas, la tension Vref+doit donc tre fournie au PIC via le pin RA3.
- Utilisation de la pin Vref+pour fixer la tension de rfrence maximale Vref+, et utilisation du pin Vref- pour fixer la tension de rfrence minimale Vref-. Dans ce cas, les deux tensions de rfrences devront tre fournies au PIC via RA3 et RA2. RA5/AN4 64 La broche Vref+est une dnomination alternative de la broche RA3/AN3, tandis que la broche Vref- est une dnomination alternative de la broche RA2/AN2. La procdure de numrisation, pour le cas o plusieurs canaux sont utiliss, est la suivante :
- On choisit le canal numriser, on engage le convertisseur - On attend Tacq - On lance la numrisation - On attend la fin de la numrisation - On attend 2 Tad - On recommence avec le canal suivant.
4.2.7. Les registres ADRESL et ADRESH :
Le rsultat de la conversion est sauvegard dans 2 registres. Ces registres sont ADRESL et ADRESH. Le rsultat tant sur dix bits le rsultat peut tre soit justifi gauche, soit droite. La justification droite complte la partie gauche du rsultat par des 0 . Le rsultat obtenu est de la forme :
La justification gauche procde de la mthode inverse :
Le choix de la mthode seffectue laide du bit 7 de ADCON1.
Le registre ADRESH se situe en banque 0, alors que ADRESL se trouve en banque 1.
4.2.8. Le registre ADCON1 :
Ce registre permet de dterminer le rle de chacune des pins AN0 AN7. Pour pouvoir utiliser un pin en mode analogique, il faudra que ce pin soit configur galement en entre par TRISE. Le registre ADCON1 dispose de 8 bits, dont seulement 5 sont utiliss :
ADCON1 - b7 : ADFM : A/D result ForMat select - b6 : Inutilis : lu comme 0 - b5 : Inutilis : lu comme 0 - b4 : Inutilis : lu comme 0 - b3 : PCFG3 : Port ConFiGuration control bit 3 - b2 : PCFG2 : Port ConFiGuration control bit 2 - b1 : PCFG1 : Port ConFiGuration control bit 1 - b0 : PCFG0 : Port ConFiGuration control bit 0
Le bit ADFM permet de dterminer si le rsultat de la conversion sera justifi droite (1) ou gauche (0).
65
On trouve dans ce registre 4 bits de configuration des pins lis au convertisseur analogique/numrique. Ces bits permettent la dtermination du rle de chaque pin. Il y a 16 combinaisons possibles, et autant de possibilits de configuration.
4.2.9. Le registre ADCON0 :
Ce registre est le dernier utilis par le convertisseur analogique/numrique. Il contient les bits quon manipule lors de la conversion. Sur les 8 bits du registre, 7 seront utiliss.
- b7 : ADCS1 : A/D conversion Clock Select bit 1 - b6 : ADCS0 : A/D conversion Clock Select bit 0 - b5 : CHS2 : analog Channel Select bit 2 - b4 : CHS1 : analog Channel Select bit 1 - b3 : CHS0 : analog Channel Select bit 0 - b2 : GO/DONE : A/D conversion status bit - b1 : Inutilis : lu comme 0 - b0 : ADON : A/D ON bit
Afin de dterminer lhorloge du convertisseur en fonction de la frquence du quartz utilis. On choisi le diviseur laide des bits ADCS0 et ADCS1.
Le choix et la slection du canal analogique pour procder la conversion seffectuent travers les bits CHS0, CHS1 et CHS2.
Le bit ADON permet de mettre en service le convertisseur. Si le canal a t correctement choisi, le positionnement de ce bit permet de dmarrer la charge du condensateur interne, et donc dtermine le dbut du temps dacquisition. Le bit Go/DONE, sera plac 1 la fin du temps dacquisition. Cette action dtermine le dbut de la conversion. Une fois la conversion termine, ce bit est remis 0 ( Done = Fait ) par llectronique du convertisseur. Cette remise 0 est accompagne du positionnement du flag ADIF du registre PIR1. Ce bit permettra ventuellement de gnrer une interruption.
4.2.10. La conversion analogique/numrique et les interruptions :
Cette partie ne comporte aucune difficult particulire. En effet, linterruption gnre par le convertisseur est une interruption priphrique, et doit donc tre traite comme telle. Les diffrentes tapes de sa mise en service sont donc : - Positionnement du bit ADIE du registre PIE1 - Positionnement du bit PEIE du registre INTCON - Positionnement du bit GIE du registre INTCON Moyennant quoi, toute fin de conversion analogique entranera une interruption. Il vous suffira de remettre 0 le flag ADIF aprs traitement de cette interruption.
4.2.11. Lutilisation pratique du convertisseur : Arriv ce stade, vous disposez de toutes les informations pour effectuer votre mesure de grandeur analogique. Voici un rsum des oprations concrtes effectuer pour chantillonner votre signal : 1) Configurez ADCON1 en fonction des pins utilises en mode analogique, ainsi que les registres TRISA et TRISE si ncessaire. 2) Validez, si souhaite, linterruption du convertisseur. 3) Paramtrez sur ADCON0 le diviseur utilis. 4) Choisissez le canal en cours de digitalisation sur ADCON0. 5) Positionnez, si ce nest pas dj fait, le bit ADON du registre ADCON0. 6) Attendez le temps Tacq (typiquement 19,7s sous 5V). 7) Dmarrez la conversion en positionnant le bit GO du registre ADCON0. 8) Attendez la fin de la conversion. 9) Lisez les registres ADRESH et si ncessaire ADRESL 10) Attendez un temps quivalent 2Tad (typiquement 3,2s). 11) Recommencez au point 4. Notez que puisque lacquisition redmarre automatiquement aprs le temps 2 Tad , vous pouvez relancer lacquisition directement, votre charge dattendre non pas le temps Tacq pour la fin de lacquisition, mais le temps Tacq +2Tad. Ceci vous pargne une 67 temporisation. En effet, 2 temporisations qui se suivent peuvent tre remplaces par une temporisation unique de temps cumul. Si donc, nous prenons un PIC cadence 20Mhz, sous une tension dalimentation de 5V, nous aurons : 1) Configurez ADCON1 en fonction des pins utilises en mode analogique, ainsi que les registres TRISA et TRISE si ncessaire. 2) Validez, si souhait, linterruption du convertisseur (PEIE, ADIE, GIE) 3) Paramtrez le diviseur 32 sur ADCON0 (B10000000) 4) Choisissez le canal en cours de digitalisation sur ADCON0 et lancez le convertisseur (B10xxx001) 5) Attendez le temps (Tacq+2Tad), soit 19,7s +3,2s =22,9s 6) Dmarrez la conversion en positionnant le bit GO du registre ADCON0 7) Attendez la fin de la conversion 8) Lisez les registres ADRESH et si ncessaire ADRESL 9) Recommencez au point 4 Notez que vous pouvez, comme montr, raliser plusieurs oprations en mme temps. Cependant, fort logiquement, vous ne pouvez pas positionner les bits ADON et GO/DONE en mme temps, puisque le temps Tacq doit imprativement les sparer. Remarque : Lorsque vous disposez de beaucoup de temps entre 2 lectures de la valeur analogique, nous vous conseillons deffectuer plusieurs mesures intermdiaires, et deffectuer la moyenne de ces mesures. Ainsi, un parasite ventuel, ou une lgre fluctuation de votre tension sera fortement attnue. Il est pratique dans ce cas deffectuer un nombre de mesures qui est une puissance de 2 (2 mesures, 4,8,16). Ainsi, pour effectuer votre moyenne, il suffira deffectuer la somme de toutes les valeurs, la division seffectuant par simple dcalage.
4.3. Les deux modules CCP et la gnration (PWM) :
Ce module est trs puissant pour crer des impulsions des frquences leves. On pourra dfinir la priode, la dure du niveau haut pendant cette priode. Le 16F877 dispose de deux modules CCP. CCP signifie Capture, Compare, and PWM. Ces modules CCP sont fortement lis et dpendant des timers 1 et 2. Ils sont galement lis au convertisseur A/D. Les 2 modules CCP1 et CCP2 sont strictement identiques, except la possibilit, pour le module CCP2, de dmarrer automatiquement la conversion A/D.
4.3.1 Les registres CCP1CON et CCP2CON
Ces registres ont la mme fonction, CCP1CON concerne le module CCP1, tandis que CCP2CON concerne le module CCP2. Le registre CCPxCON permet de dterminer le mode de fonctionnement du module.
CCPxCON b7 : Inutilis : Lu comme 0 b6 : Inutilis : Lu comme 0 b5 : CCPxX : module Capture Compare and Pwm x bit X b4 : CCPxY : module Capture Compare and Pwm x bit Y b3 : CCPxM3 : module Capture Compare and Pwm x Mode select bit 3 b2 : CCPxM2 : module Capture Compare and Pwm x Mode select bit 2 68 b1 : CCPxM1 : module Capture Compare and Pwm x Mode select bit 1 b0 : CCPxM0 : module Capture Compare and Pwm x Mode select bit 0
Les bits CCPxX et CCPxY. Ces bits sont en fait les 2 bits de poids faible qui compltent le nombre de 10 bits utilis pour le mode de fonctionnement PWM. Dans les autres modes, ces bits sont donc inutiliss. Les bits CCPxM3 CCPxM0 servent dterminer quel sera le mode de fonctionnement du module concern. Les possibilits sont les suivantes :
CCPM Fonctionnement
0000 Module CCPx larrt 0100 Mode capture valid sur chaque flanc descendant 0101 Mode capture valid sur chaque flanc montant 0110 Mode capture valid sur chaque multiple de 4 flancs montants 0111 Mode capture valid sur chaque multiple de 16 flancs montants 1000 Mode compare, place la sortie 1 sur dbordement (+bit CCPxIF =1) 1001 Mode compare, place la sortie 0 sur dbordement (+bit CCPxIF =1) 1010 Mode compare, positionne CCPxIF sans affecter la sortie 1011 Mode compare, positionne CCPxIF sans affecter la sortie, et gnre le trigger 11xx Mode PWM
4.3.2. Le mode capture :
Ce mode fait intervenir un pin comme vnement dclencheur. Il sagit donc dune entre. Il est donc impratif de configurer le pin CCPx en entre via le registre TRISC avant de pouvoir utiliser le module CCPx en mode capture .
Principe de fonctionnement : Le mode capture est en troite liaison avec les pins RC1/CCP2 et RC2/CCP1 du PIC. le principe est le suivant : - Au moment de lapparition de lvnement dclencheur sur le pin concerne, la valeur (16bits) du timer 1 contenue dans les registres TMR1H et TMR1L est copie dans les registres CCPR1H et CCPR1L. - Simultanment, le bit CCP1IF du registre PIR1 est valid, et une interruption intervient si elle est configure. Lvnement dclencheur est une variation du signal sur le pin CCP1/RC2 pour le module CCP1, et sur le pin CCP2/RC1 pour le module CCP2. Lvnement qui provoque la capture dpend des bits CCPxM3 CCPxM0.
4.3.3. Le mode compare :
Ce mode de fonctionnement est bas sur la correspondance de la valeur du timer 1(TMR1H/TMR1L) avec la valeur contenue dans CCPRxH/CCPRxL. Lgalit de ces valeurs entranera les ractions souhaites.
4.3.4. Le mode PWM :
4.3.4.1 La thorie du PWM :
69 PWM signifie Pulse Width Modulation , ce quon pourrait traduire par modulation de largeur dimpulsion. Il sagit dun signal binaire de frquence fixe dont le rapport cyclique peut tre modul par logiciel. Le module PWM a besoin dun pin du PIC configure en sortie. Le rapport cyclique dun signal binaire frquence fixe peut tre dfini comme tant le rapport entre le temps o il se trouve ltat 1 par rapport au temps total dun cycle. Un cycle ntant constitu, par dfinition, que dun tat 1 suivi dun tat 0 , la somme des temps des 2 tats tant constante. Il y a donc deux paramtres qui dfinissent un signal PWM : - La dure dun cycle complet - Le rapport cyclique
Donc, si on pose :
- Tc = Dure dun cycle - Rc le rapport cyclique - Th = dure de ltat haut - Tb = dure de ltat bas
Alors :
- Tc = Th + Tb (Dure dun cycle en secondes = dure de ltat haut + dure de ltat bas) - Frquence du signal (en hertz) = 1/Tc - Rc = Th / Tc (rapport cyclique en % = temps ltat haut divis par le temps de cycle)
Fig13. Signal PWM avec un rapport cyclique de 50% (0.5)
Un signal avec un rapport cyclique de 0% est un signal dont le temps ltat haut occupe 0% du temps total. Cest donc un signal qui est constamment ltat bas. De mme, un signal avec un rapport cyclique de 100% est un signal qui est constamment ltat haut.
70 Le rapport cyclique dun signal PWM doit donc tre suprieur 0% et infrieur 100%. Le PIC permet donc de crer un signal priodique dont il est possible de faire varier (moduler) le rapport cyclique.
4.3.4.2 Les registres utiliss :
On a besoin de plusieurs registres pour programmer toutes les valeurs ncssaires au module. On a besoin dune valeur de dbordement pour le timer 2, cette valeur se trouve dans le registre PR2. Cest une valeur sur 8 bits. La valeur de la seconde comparaison (celle qui fait passer la sortie de 1 0) est une valeur de 8 bits complte de 2 bits fractionnaires. Le nombre entier sera inscrit dans le registre CCPRxL. Les 2 bits fractionnaires qui compltent ce nombre sont les bits DCxB1(CCP1X) et DCxB0(CCP1Y) du registre CCPxCON. Pour lancer le mode PWM , nous devons donc procder aux initialisations suivantes :
1) On initialise PR2 en fonction de la dure totale du cycle (Tc): PR2 = (TC / (prdiviseur * 4 * Tosc) 1
2) On calcule la valeur de comparaison DCB en valeur fractionnaire suivant la formule : DCB = Th / (prdiviseur * Tosc) On place les bits 9 2 dans CCPRxL (valeur entire), les bits 1 et 0 (fraction) tant positionns dans DCxB1 et DCxB0 du registre CCPxCON.
3) On place le pin CCPx en sortie en configurant TRISC.
4) On lance le timer 2 en programmant son prdiviseur.
5) On configure CCPxCON pour travailler en mode PWM . 71
Fig14.Fonctionnement en mode PWM 4.3.4.3. Remarques :
La valeur de rfrence encode dans CCPRxL ne peut tre suprieure la valeur contenue dans PR incrmente de 1. Dans le cas contraire, le signal ne pourrait jamais atteindre cette consigne, et la pin CCPx resterait bloque au niveau haut (rapport cyclique >100%) Il est possible dutiliser le timer 2 la fois comme timer classique et comme gnrateur pour le module PWM. Le registre CCPRxH nest pas accessible en criture lors du fonctionnement en mode PWM. La prise en compte du changement de valeur du rapport cyclique ne se fera quaprs la fin du cycle en cours.
4.3.5 Champs dapplication
En fait, vous utiliserez ce module chaque fois que vous aurez besoin dun signal de frquence fixe, mais de rapport cyclique variable. Lapplication typiquee est la variation de vitesse dun moteur courant continu.
4.4 Le module MSSP en mode SPI :
Le module MSSP, pour Master Synchronous Serial Port, permet lchange de donnes du PIC avec le mode extrieur, en utilisant des transmissions srie synchrones. Il nest pas le seul proposer des communications, nous avons dj vu la liaison parallle dans le module PSP, et nous verrons dautres communications srie avec le module USART. Vous verrez que lensemble de ces modules vous ouvre toutes les voies royales de la communication, que ce soit avec votre PC, avec des afficheurs, des mmoires de type 72 eeprom, des dtecteurs de temprature, des horloges en temps rel, etc Avec ces modules, nous navons plus nous occuper de la transmission des bits en eux- mmes, mais nous les recevrons et mettrons directement sous forme doctet, toute la procdure de srialisation tant alors automatique. Outre le gain en taille programme qui en dcoulera, vous vous rendez compte que les vitesses de transmission pourront tre amliores de faon notable. Au lieu que votre programme ne soit interrompu lors de la rception ou de lmission de chaque bit, il ne le sera plus que pour chaque octet. Ceci multiplie allgrement la vitesse maximale possible dans un facteur de plus de 10. Il y a tellement de modes possibles de fonctionnement, quil ne nous sera pas possible de donner systmatiquement des exemples. Nous nous limiterons donc des situations courantes. Nous verrons que le module MSSP peut travailler selon 2 mthodes. Soit en mode SPI (Serial Peripherial Interface), soit en mode I2C.
4.5.Le module USART :
4.5.1 Le mode srie asynchrone Une liaison srie asynchrone, comme son nom lindique, fonctionne de la mme faon, en mettant les bits les uns la suite des autres, mais sans fournir le signal dhorloge qui a permis de les gnrer. Ceci a forcment plusieurs consquences, dont les suivantes : - Comme le rcepteur dune donne ne reoit pas le signal dhorloge, il doit savoir quelle vitesse lmetteur a gnr son transfert. Cest en effet la seule faon pour lui de savoir quand commence et quand fini un bit. - Comme metteur et rcepteur se mettent daccord pour adopter une vitesse commune, et tant donn que chacun travaille avec sa propre horloge, de lgres diffrences peuvent apparatre sur les 2 horloges, introduisant des drives. Il faudra grer ceci. - Il faut un mcanisme qui permette de dtecter le dbut dune donne. En effet, imaginons que la ligne soit niveau 1 et que lmetteur dcide denvoyer un 1 . Comment savoir que la transmission a commenc, puisque rien ne bouge sur la ligne concerne ? - De la mme faon, il faut tablir un mcanisme pour ramener la ligne son tat de repos en fin de transmission. Ceci tant indispensable pour permettre la dtection de la donne suivante. - Notez enfin que dans les transmissions asynchrones, la grande majorit des liaisons procdent en commenant par lenvoi du bit 0. Ce sera notre cas. La liaison utilisera les 2 mmes pins que pour la liaison synchrone, savoir RC6/TX/CK et RC7/RX/DT. Les dnominations qui conviendront dans ce cas seront bien entendu TX pour lmission et RX pour la rception. Ces pins devront tre configures en entre via TRISC pour fonctionner en mode USART. 4.5.1.1 Le start-bit : Au repos, nous allons imaginer que notre ligne soit au niveau 1 . Nous choisissons ce niveau parce que cest celui prsent sur la ligne dmission de votre PIC. Rien nempche de travailler avec une lectronique qui modifie ces niveaux, comme par exemple lutilisation dun driver RS485 (par exemple le MAX485), ou un pilote RS232 (comme le MAX232) qui permettra a votre liaison srie de devenir compatible lectriquement avec le port RS232 de votre PC . Donc, notre ligne se trouve 1 . Or, nous navons quune seule ligne ddicace un sens de transfert, donc nous disposons dun seul et unique moyen de faire savoir au destinataire que la transmission a commenc, cest de faire passer cette ligne 0 . On peut donc simplement dire que le start-bit est : 73 - Le premier bit mis - Un bit de niveau toujours celui oppos au niveau de repos (donc 0 dans notre cas). - Un bit dune dure, par convention, la mme que celle dun bit de donne. 4.5.1.2 Les bits de donne : Nous avons envoy notre start-bit, il est temps de commencer envoyer nos bits de donne. En gnral, les bits de donne seront au nombre de 7 ou de 8 (cas les plus courants). La dure dun bit est directement lie au dbit choisi pour la connexion. En effet, le dbit est exprim en bauds, autrement dit en bits par seconde. Donc, pour connatre la dure dun bit, il suffit de prendre linverse du dbit. Tb =1 / Dbit. Par exemple, si on a affaire une connexion 9600 bauds, nous aurons : Tb =1 / 9600 bauds =104,16 s. 4.5.1.3 La parit : Directement aprs avoir envoy nos 7 ou 8 bits de donnes, nous pouvons dcider denvoyer ou non un bit de parit. Ce bit permet dimposer le nombre de bits 1 mis (donne +parit), soit comme tant pair (parit paire), soit comme tant impair (parit impaire). Le rcepteur procde la vrification de ce bit, et, si le nombre de bits 1 ne correspond pas la parit choisie, celui-ci saura que la rception ne sest pas effectue correctement. La parit permet de dtecter les erreurs simples, elle ne permet ni de les rparer, ni de dtecter les erreurs doubles. Par contre, la dtection frquente derreurs de parit indique un problme dans lchange des donnes. Voici par exemple, un cas de parit paire : La donne vaut : B00110100 Nous avons 3 bits 1 . Donc, pour avoir notre parit paire, notre bit de parit devra donc valoir 1 , ce qui forcera le nombre total de bits 1 valoir 4 , ce qui est bien pair. On enverra donc : B001101001 : 4 bits 1 =parit paire 4.5.1.4 Le stop-bit : Nous avons maintenant mis tous nos bits de donne et notre parit ventuelle. Reste permettre notre ligne de transmission de revenir ltat de repos. Ce passage est dnomm stop-bit . On peut dire son sujet que : - Il sera le dernier bit mis de loctet - Son niveau est toujours celui du niveau de repos (donc 1 dans notre cas). - Sa dure sera par convention la mme que celle dun bit de donne. Le stop-bit nest pas comptabilis (pas plus que le start-bit) pour le calcul du bit de parit. Notez quil est permis dimposer lutilisation de 2 stop-bits . Une autre faon de voir les choses, est de dire quon ne pourra envoyer loctet suivant quaprs une dure Tb aprs lmission du premier stop-bit. O, dit encore autrement, on doit mnager une pause dune dure de 1 bit, entre lmission de 2 octets conscutifs. Un mot concernant la lecture dun bit par le rcepteur. Il est vident que la lecture de chaque bit doit seffectuer dans la zone prsentant la plus grande probabilit de stabilit du bit. En gnral, les lectroniques sont construites pour mesurer le bit au milieu de sa dure. Voici, pour illustrer tout ceci, lmission dune donne code sur 8 bits, avec parit paire et un stop-bit. Les lectures sont indiques par les flches infrieures : 74
4.5.2 Mise en uvre : Le PIC est capable de travailler en mode full-duplex. Ceci vous laisse plusieurs possibilits de configuration. Voyons tout dabord comment interconnecter les circuits dans ce mode :
Dans ce cas, notre PIC est privilgi, puisquil peut parler avec le circuit 2 et 3, alors que ces circuits ne peuvent dialoguer entre eux. Vous voyez donc que le mode full-duplex procure un inconvnient. Soit on se contente de communiquer entre 2 composants, soit, si on a plus de 2 composants, un seul se trouve en situation privilgie. Notez que nous reprsentons toujours des liaisons directes, connectes directement sur votre PIC. On peut aussi, pour diverses raisons, dont la principale est dallonger les distances de communication, utiliser des pilotes de lignes spcifiques. Prenons par exemple le cas de la communication half-duplex entre votre PIC et le port srie dun PC :
Vous notez la prsence dun driver de ligne, de type MAX232 qui convertit les niveaux 75 0v/5V de votre PIC en niveaux +12V/-12V destination de la RS232 de votre PC, et rciproquement. La norme RS232 est galement une norme qui prcise un mode de fonctionnement full-duplex.
4.5.3 le registre TXSTA :
TXSTA en mode asynchrone :
b7 : non : non utilis en mode asynchrone b6 : TX9 : TRANSMITT 9 bits enable bit (1 =9 bits, 0 =8 bits) b5 : TXEN : TRANSMITT ENable bit b4 : SYNC : SYNChronous mode select bit (1 =synchrone, 0 =asynchrone) b3 : N.U. : Non Utilis : lu comme 0 b2 : BRGH : Baud Rate Generator High mode select bit b1 : TRMT : TRansMiT shift register status bit (1 =TSR vide) b0 : TX9D : TRANSMIT 9th bit Data
Voyons ou rappelons ce que signifie tout ceci : TX9 : indique si vous voulez envoyer des donnes codes sur 8 ou sur 9 bits. Un bit plac 1 ici conduira mettre des donnes codes sur 9 bits. TXEN : permet de lancer lmission. Cette fois, en mode asynchrone, votre USART pourra mettre et recevoir en mme temps. Rien donc ne vous empche de slectionner mission et rception simultane. Nous ne retrouverons donc pas ici la notion de priorit de commande. SYNC : indique si vous travaillez en mode synchrone (1) ou asynchrone (0). Dans ce paragraphe, nous traitons le mode asynchrone, donc ce bit devra tre positionn 0 . BRGH : permet de choisir entre 2 prdiviseurs internes pour la gnration des bits en fonction de SPBRG. Nous aurons un mode grande vitesse (BRGH =1) et un mode basse vitesse (BRGH =0). Nous en reparlerons au moment de ltude de SPBRG. TRMT : indique quand le registre TSR est vide, cest--dire quand lmission de la dernire valeur prsente est termine. TX9D : contient la valeur du 9me bit envoyer, quand vous avez dcid, via le positionnement de TX9, de raliser des missions de mots de 9 bits.
4.5.4 Le registre RCSTA :
RCSTA en mode asynchrone :
b7 : SPEN : Serial Port ENable bit b6 : RX9 : RECEIVE 9 bits enable bit (1 =9 bits, 0 =8 bits) b5 : non : non utilis en mode asynchrone b4 : CREN : Continuous Receive ENable bit b3 : ADDEN : ADDress detect ENable bit b2 : FERR : Frame ERRor b1 : OERR : Overflow ERRor bit b0 : RX9D : RECEIVE 9th Data bit
Quant au rle de chacun de ces bits : SPEN : met le module USART en service. RX9 : permet de choisir une rception sur 8 ou sur 9 bits, exactement comme pour lmission. 76 CREN : lance la rception continue. Les octets seront reus sans interruption jusqu ce que ce bit soit effac par vos soins. Dans le mode asynchrone, il nexiste que ce mode de rception. FERR : indique une erreur de trame. Ceci se produit lorsquau moment o devrait apparatre le stop-bit en mode lecture, lUSART voit que la ligne de rception est 0 . Ce bit est charg de la mme faon que le bit RX9D. Autrement dit, ce nest pas un flag effacer, cest un bit qui est li la donne quon vient de lire. On doit donc lire ce bit, tout comme RX9D : avant de lire RCREG. Une fois ce dernier lu, le nouveau FERR crase lancien. Si vous suivez, on a donc un bit FERR vu comme sil tait le 10me bit du mot reu. OERR : indique une erreur de type overflow. Il se retrouve positionn si vous navez pas lu RCREG suffisamment vite. Leffacement de ce bit ncessite le reset de CREN. Le non effacement de OERR positionn bloque toute nouvelle rception dune donne. RX9D : contient le 9me bit de votre donne reue, pour autant, bien entendu, que vous ayez activ le bit RX9.
4.5.5 Le registre SPBRG : Ce registre, tout comme pour le mode synchrone, permet de dfinir le dbit qui sera utilis pour les transferts. Cest le mme registre qui est utilis pour mission et rception. De ce fait, un transfert full-duplex seffectuera toujours avec une vitesse dmission gale celle de rception. Par contre, en mode half-duplex, rien ne vous empche de modifier SPBRG chaque transition mission/rception et inversment. Nous avons 2 grandes diffrences pour ce registre par rapport au mode synchrone : - Le registre SPBRG doit toujours tre configur, puisque tous les interlocuteurs doivent connatre le dbit utilis - La formule utilise pour le calcul de SPBRG nest pas identique celle du mode synchrone. En ralit, nous avons 2 formules distinctes, selon que nous aurons positionn le bit BRGH 1 ou 0 Si BRGH = 0 (basse vitesse) Dbit = Fosc / (64 * (SPBRG + 1)) Ou encore : SPBRG = (Fosc / (Dbit * 64)) 1 Les limites dutilisation sont (avec un PIC 20MHz) : Dbit min =20*10 6 / (64 * (255+1)) =1221 bauds Dbit max =20*10 6 / (64 * (0+1)) =312.500 bauds Si BRGH = 1 (haute vitesse) Dbit =Fosc / (16 * (SPBRG +1)) Ou encore : SPBRG =(Fosc / (Dbit * 16)) 1 Les limites dutilisation sont (avec unPIC 20MHz) : Dbit min =20*10 6 / (16 * (255+1)) =4883 bauds Dbit max =20*10 6 / (16 * (0+1)) =1.250.000 bauds Vous voyez tout de suite que le mode basse vitesse permet dobtenir des vitesses plus basses, tandis que le mode haute vitesse permet de monter plus haut en dbit. Il existe une zone couverte pas les 2 modes. Dans ce cas, vous choisirez BRGH =1 si cela vous permet dobtenir le taux derreur le moins lev.
Pour lmission : - Vous validez la mise en service de lmission en positionnant le bit TXEN. 77 - La validation de TXEN positionne le flag TXIF 1 puisque le registre TXREG est vide. - Si vous utilisez le format de donne sur 9 bits, vous devez commencer par placer la valeur du 9me bit dans le bit TX9D. - Ensuite, vous placez la donne mettre dans le registre TXREG (TRANSMITT REGister). - Cette donne est transfre ds le cycle dinstruction suivant, ainsi que le bit TX9D, dans son registre TSR. TRMT passe 0 (TSR plein). - Vous recommencez ventuellement le chargement de TX9D +TXREG, le flag TXIF passe 0 (TXREG plein) - Ds que le premier octet est mis, le second est transfr dans TSR, le registre TXREG est vide, TXIF est positionn. Vous pouvez charger le troisime octet, et ainsi de suite. - Quand le dernier octet est transmis, TRMT passe 1 (TSR vide, mission termine) Avec toujours les mmes remarques : - Vous avez toujours un octet en cours de transmission dans TSR, le suivant tant dj prt dans TXREG. - Si on a besoin de 9 bits, on place toujours TX9D avant de charger TXREG. - Chaque fois que TXIF passe 1 (avec interruption ventuelle), vous pouvez recharger TXREG avec loctet suivant (tant que vous en avez). - Quand la communication est termine, TRMT passe 1. - TXIF passe 1 ds que TXEN est positionn Pour quil y ait une mission, il faut donc que, le module tant initialis et lanc : - TXEN soit positionn - Le registre TXREG soit charg Pour la rception : - Vous positionnez CREN, ce qui a pour effet que votre PIC est prt recevoir une donne. - Loctet reu est transfr dans le registre RCREG (le 9me bit ventuel est transfr vers RX9D), et le flag RCIF est positionn - Vous lisez alors le bit RX9D ventuel puis le registre RCREG, ce qui provoque leffacement du bit RCIF. De nouveau, nous retrouvons notre file FIFO, qui nous permettra de recevoir 2 octets (plus un en cours de rception), avant dobtenir une erreur doverflow. Pour rappel : - Le premier octet est en cours de rception dans RSR, RCREG est vide, donc RCIF est 0 - Le premier octet est reu et transfr dans la file de RCREG, RCIF est positionn, le second octet est en cours de rception dans RSR - Si vous ne ragissez pas de suite, le second octet est reu et transfr dans la file de RCREG, RCIF reste positionn, le troisime octet est en cours de rception dans RSR. Comme on na que 2 emplacements, vous devrez ragir avant la fin de la rception du troisime octet, mais vous voyez que votre temps de raction peut tre allong. Voici alors ce que vous allez faire dans ce cas : - Vous lisez, si vous travaillez sur 9 bits, le 9me bit, RX9D, puis RCREG, donc le premier octet reu. Cette lecture ne provoque pas leffacement de RCIF, puisque RCREG nest pas vide. Par contre, le 9me bit du second octet est transfr ce moment dans RX9D, ce qui explique que vous deviez le lire en premier. - Vous lisez alors, si vous travaillez sur 9 bits, le bit RX9D qui est le 9me bit de votre second octet, puis RCREG, donc le second octet reu. Le flag RCIF est effac, le registre RCREG est vide. Lerreur doverflow sera gnre si un troisime octet est reu alors que vous navez pas lu les deux qui se trouvent dans la file FIFO. Le positionnement empche toute nouvelle 78 rception. Leffacement de ce bit ncessite deffacer CREN. Votre raction devrait donc tre du style : - Tant que RCIF est positionn - J e lis RX9D puis RCREG - RCIF nest plus positionn, OERR est positionn ? - Non, pas de problme - Oui, je sais que jai perdu un octet et je coupe CREN Evidemment, vous avez beaucoup moins de chance davoir une erreur doverflow si vous travaillez via les interruptions, ce que nous vous conseillons fortement dans ce mode. 4.5.6 Lerreur de frame : Lerreur de frame survient si, au moment o lUSART sattend recevoir un stop-bit, il voit que le niveau de sa ligne de rception est positionne 0 . Dans ce cas, quelque chose sest mal droul. Le bit FERR sera positionn, mais, attention, ce bit fait partie de la file FIFO, tout comme le bit RX9D. Donc, vous lisez RX9D et FERR, et, ensuite, vous lisez RCREG. A ce moment, le nouveau bit FERR concernant loctet suivant crasera le FERR actuel, exactement comme le nouveau bit RX9D effacera lactuel.Vous navez donc pas effacer FERR, qui est, du reste, en lecture seule.
4.6.Port D en mode PSP :
4.6.1 A quoi sert le mode PSP ? Le mode PSP (pour Parallel Slave Port) permet un microprocesseur, ou tout autre systme extrieur de prendre le contrle du PORTD de votre PIC. Ce systme pourra crire de lui-mme des valeurs sur le PORTD, et y lire des valeurs que votre programme PIC y aura prpare son intention. Le PORTD devra donc passer alternativement en entre et en sortie, et sous la seule dcision du systme extrieur. Cest donc celui-ci qui dcide quel moment une lecture ou une criture sopre. Les transferts sont donc raliss de faon asynchrones avec le programme de votre PIC. Voici une affaire qui va intresser les lectroniciens pointus dsireux dinterfacer leur PIC avec un autre processeur, de faon , par exemple, obtenir un super UART. Pour les autres, ne vous inquitez pas si vous ne comprenez pas tout, car vous nutiliserez probablement jamais cette possibilit, et, du reste, cela ne vous empchera pas de profiter des autres possibilits de votre PIC. La premire chose est de bien se mettre daccord sur les termes. Nous parlons ici du PORD en mode parallle. Il ne sagit pas ici du port parallle de votre imprimante, mais de la mthode de communication entre 2 microprocesseurs. Ensuite, il faut comprendre que ce mode est un mode Slave (esclave), cest dire sous le contrle du microprocesseur sur lequel vous connectez votre PIC. Cest ce processeur qui va prendre le contrle de votre PORTD. 4.6.2 Comment passer en MODE PSP ? La premire chose faire est de forcer le bit PSPMODE du registre TRISE 1 . Ensuite, les 3 pins RE0/RE2 sont utilises dans un de leur mode spcial et portent de fait les dnominations RD/CS/WR. Ces pins sont actifs ltat bas. Ces pins sont sous contrle du microprocesseur matre, ce qui fait que vous devez les configurer en entre via les bits b0/b2 de TRISE. Mais il se fait, toujours si vous tes attentifs, que cest la valeur impose par une mise sous tension, donc inutile de vous en occuper. Vous notez galement que le PORTD passe sous contrle de ces pins, le registre TRISD 79 nest donc plus daucune utilit : inutile de le configurer. Notez que dans la plupart des cas, vous utiliserez les interruptions pour grez ce mode de fonctionnement, vous devez donc mettre en service linterruption PSP . En effet, les changes dinformation se font sur dcision du microprocesseur matre, et donc de faon asynchrone avec le programme de votre PIC. Les interruptions restent la meilleure faon de traiter rapidement les vnements asynchrones.
4.6.3. Connexion des PORTD et PORTE en mode PSP : Si nous reprenons nos 3 pins du PORTE, avec les noms utiliss pour cette fonction, cest dire RD, CS, et WR, nous pourrons dire : La pin CS est la pin Chip Select , que tous les lectroniciens spcialiss dans les microprocesseurs connaissent. Pour les autres, on peut dire que le Chip Select permet de valider la slection du circuit concern, en loccurrence notre PIC. Sur la carte microprocesseur, un dtecteur dadresse, plac sur le bus dadresse permet de slectionner ladresse laquelle va rpondre notre PIC. Comme dans la plupart des systmes, ce CS sera actif ltat bas. Ensuite, nous trouvons les signaux RD pour ReaD et WR pour WRite . De nouveau ces signaux sont actifs ltat bas. Notez que sur certains microprocesseurs, il nexiste quune seule pin RD/WR. A vous donc dans ce cas de gnrer lectroniquement les 2 signaux, ce qui nest pas compliqu. Maintenant, concernant le PORD, il sera connect au bus de data de la carte microprocesseur. Notez, une fois de plus, que sur certains microprocesseurs, les bus de data et dadresse peuvent tre multiplexs, ou dune largeur diffrente de 8 bits. Il vous incombe une fois de plus de rendre les signaux et les messages compatibles lectroniquement.
4.7. liaison I2C :
4.7.1 Introduction On passe directement ltude du module MSSP en mode IC, et par consquent on doit commencer par expliquer en quoi consiste ce bus. En effet, bien que le module prenne en charge tous les aspects de gestion de ce bus, il ma sembl important de comprendre ce qui se passait effectivement au niveau des lignes qui le constituent. De plus, labsence de ces informations vous poserait problme au moment dtablir une communication avec un composant IC. En effet, lorsque vous rencontrerez un nouveau composant, tout ce dont vous disposerez son sujet sera, en gnral, son datasheet. Sans une connaissance assez prcise du bus IC, vous vous retrouveriez confront quelque chose qui risquerait bien de vous paratre incomprhensible. Et puis, mieux vaut avoir une information quon nutilisera ventuellement pas quune absence dinformation au moment o on en a besoin. 4.7.2 Caractristiques fondamentales : Le bus IC permet dtablir une liaison srie synchrone entre 2 ou plusieurs composants. Il a t cr dans le but dtablir des changes dinformations entre circuits intgrs se trouvant sur une mme carte. Son nom, dailleurs, traduit son origine : Inter Integrate Circuit, ou I.I.C., ou plus communment IC (I carr C). Ce bus est le descendant du CBUS, qui est de moins en moins utilis. Son domaine dapplication actuel est cependant bien plus vaste, il est mme, par exemple, utilis en domotique. Il comporte des tas de similitudes avec le SMBUS dIntel (System Management BUS), 80 mais on ne parlera pas de ce bus ici. Si cela vous intresse, vous trouverez des informations sur Internet. Sachez simplement que nos 16F87x peuvent crer des signaux compatibles avec cette norme. L IC permettait, ses dbuts, de travailler des frquences maximales de 100 Kbits/seconde, vitesses assez rapidement portes 400 Kbits/seconde. Il existe maintenant des familles de circuits pouvant atteindre des vitesses de 3.4 Mbits/seconde. Le fonctionnement thorique reste identique. Le bus IC est constitu de 2 uniques lignes bidirectionnelles : - La ligne SCL (Serial Clock Line), qui, comme son nom lindique, vhicule lhorloge de synchronisation - La ligne SDA (Serial DAta line), qui vhicule les bits transmis. Il est important de vous souvenir que : - la ligne SCL est gre par le matre (nous verrons que par moment, lesclave peut prendre provisoirement le contrle de la ligne). - la ligne SDA, un moment donn, est pilote par celui qui envoie une information (matre ou esclave). Tous les circuits sont connects sur ces 2 lignes. Il existe 2 sortes de circuits pouvant tre connects : - Les circuits matres, qui dirigent le transfert et pilotent lhorloge SCL. - Les circuits esclaves, qui subissent lhorloge et rpondent aux ordres du matre. Chacun de ces 2 types peut mettre et recevoir des informations. Une particularit est quon peut placer plusieurs matres sur le mme bus IC. Ceci implique que, sans prcautions, si 2 matres dsirent prendre le contrle du bus en mme temps, on encourrait, sans prcautions particulires, 2 risques : - La destruction de llectronique des circuits, pour le cas o lun dentre eux impose un niveau haut et lautre un niveau bas (court-circuit). - La corruption des donnes destines ou en provenance de lesclave. Fort heureusement, vous vous doutez bien que Philips (linventeur de lIC) a trouv des solutions pour parer ces ventualits.On commence par les contraintes lectroniques. Pour la partie lectronique, la parade est simple. On travaille avec des tages de sortie qui ne peuvent imposer quun niveau 0, ou relcher la ligne, qui remonte delle-mme au niveau 1 via des rsistances de rappel. De cette faon, on naura jamais de court-circuit, puisque personne ne peut placer la tension dalimentation sur la ligne. Ces tages sont des montages que vous trouverez dans la littrature sous la dnomination de collecteur ouvert ou de drain ouvert suivant la technologie utilise. Le pin RA4 de votre PIC utilise dailleurs la mme technique. Le schma dinterconnexion des circuits sur un bus IC est donc le suivant : 81
Fig15. Connexion de plusieurs composants sur le bus I2C
4.7.3 Les diffrents types de signaux : Nous allons voir que cette norme joue intelligemment avec les niveaux prsents sur les 2 lignes, afin de raliser diverses oprations. Plutt que de vous donner directement un chronogramme de transmission, on va scinder les diffrentes tapes. De cette faon ca sera beaucoup plus simple comprendre. 4.7.3.1 Le bit ordinaire : Tout dabord, la mthode utilise pour crire et recevoir des bits est diffrente de celle utilise dans ltude de notre module SPI. En effet, pour ce dernier, un bit tait mis sur un flanc de lhorloge, et tait lu sur le flanc oppos suivant de la dite horloge. Au niveau du bus IC, le bit est dabord plac sur la ligne SDA, puis la ligne SCL est place 1 (donc libre) durant un moment puis force de nouveau 0. Lmission du bit seffectue donc sans aucune correspondance dun flanc dhorloge. Il est lu lors du flanc montant de cette horloge. Notez quil est interdit de modifier la ligne SDA durant un niveau haut de SCL. La drogation cette rgle nest valable que pour les squences dites de condition .Voici quoi ressemble lmission et la lecture dun bit :
82 Vous constatez que le bit prsent sur la ligne SDA doit tre prsent avant la monte du signal SCL, et continuer un certain temps avant sa redescente. 4.7.3.2 Le start-condition : Comme pour tout signal synchrone, le protocole ne dfinit pas de start et de stop-bit. Mais il intgre toutefois les notions de start-condition et de stop-condition . Ces squences particulires, obtenues en modifiant la ligne SDA alors que la ligne SCL est positionne ltat haut permettent de dfinir dbut et fin des messages. Nous verrons que ceci est indispensable pour reprer le premier octet du message, qui a un rle particulier. Si on se souvient quau repos, SCL et SDA se trouvent relchs, et donc ltat haut, le start-condition (symbole conventionnel : S) est ralis simplement en forant la ligne SDA 0, tout en laissant la ligne SCL 1.
Il existe un driv de cette condition, appel repeated start condition , qui est utilis lorsquun message en suit directement un autre. Il sagit donc en fait dun second startcondition au sein dun mme message. Sachez ce niveau quun repeated start- condition peut tre considr comme identique un startcondition . 4.7.3.3 Le stop-condition : Nous venons dy faire allusion. Cette condition indique la fin du message en cours. Elle remet les lignes SDA et SCL au repos, mais en respectant la chronologie suivante : La ligne SDA est ramene 1, alors que la ligne SCL se trouve dj 1. Voici ce que cela donne :
4.7.3.4 Lacknowledge : Lacknowledge (ACK) est en fait laccus de rception de loctet envoy. Cest donc le rcepteur qui met ce bit pour signaler quil a bien lu loctet envoy par lmetteur. Cet accus de rception est lu comme un bit classique. Il vaudra 0 si laccus de rception signifie OK , et 1 pour toute autre raison (rcepteur dans limpossibilit de rpondre, par exemple). Voici un ACK (OK) : 83
Et voici une absence daccus de rception, encore dnomme NOACK. En effet, un NOACK quivaut une absence de raction, puisque seul le niveau bas est impos, le niveau haut tant li la libration de la ligne (ou sa non appropriation).
4.7.3.5 Le bit read/write: Il nous faut encore voir un bit particulier. Le bit R/W indique lesclave si les bits de donnes contenus dans la trame sont destins tre cris (R/W =0) ou lus (R/W =1) par le matre. Dans le cas dune criture, le matre enverra les donnes lesclave, dans le cas dune lecture, cest lesclave qui enverra ses donnes au matre. Etant donn que ce bit ne prsente aucune particularit, on ne donne pas le chronogramme (identique celui dcrit pour le bit ordinaire ).
4.7.4 Structure dune trame IC :
Nous avons vu tous les signaux possibles, il nous faut maintenant tudier le protocole de communication des intervenants en IC. Nous savons dj que la transmission commence par un start-condition (S). Vient ensuite ladresse, code sur 7 ou 10 bits, complte par loctet R/W qui prcise si les donnes qui vont suivre seront crites ou lues par le matre. Chaque octet envoy est toujours accompagn dun accus de rception de la part de celui qui reoit. Un octet ncessite donc 8 +1 =9 impulsions dhorloge sur la pin SCL. On distingue ds lors 2 cas : soit ladresse est code sur 7, soit sur 10 bits. Voici comment se prsente le dbut dune trame ( partir ce cet instant, dans les chronogrammes concernant lIC. Notez donc, et cest logique, que cest toujours le matre qui envoie ladresse, quil soit rcepteur ou metteur pour le reste du message.
Pour coder une adresse sur 10 bits, on utilisera comme premier octet ladresse rserve 84 B11110xy0 qui prcise quun second octet est ncessaire. Voici ce que donne lenvoi dune adresse sur 10 bits :
5- Les Interruptions du 16F877 :
Le 16F877 possde de nombreuses sources dinterruptions. Environ plus de 14 sources diffrentes dinterruption. Les plus importantes sont :
5.1. Interruption du Timer 0 : Le dbordement (le passage de 255 0) du timer 0 provoque une interruption.
5.2. Interruption du Timer 1 : Le dbordement (le passage de 65535 0) du timer 0 provoque une interruption.
5.3. Interruption externe sur RB0 : La broche RB0 peut tre configure pour dclencher une interruption lapparition dun flanc Montant ou Descendant sur cette broche. Cette interruption peut tre utile pour rendre le microprocesseur sensible une action sur un module externe (un clavier ou un bouton poussoir par exemple).
5.4. Interruption un changement sur RB4-7 : Une modification sur une ou plusieurs broches des 4 broches RB4, 5, 6 et 7 (demi port B) provoque une interruption.
5.5. Linterruption de fin de conversion du module CAN. Le module CAN peut gnrer une interruption lorsquune conversion analogique numrique est termine.
5.6. Les autres interruptions disponibles sont : - interruption du port parallle PSP - interruption du port srie USART (rception et mission) - interruption du module CCP1 - interruption du timer2