A.OUMNAD
Etude dtaille du
PIC 16F887
Abdelmajid OUMNAD
Microcontrleur PIC16F887
A.OUMNAD
INTRODUCTION
Un microcontrleur est un composant lectronique Autonome dot : dune unit de traitement capable de dcoder et d'excuter des instructions, de la mmoire RAM, de la mmoire permanente, des interfaces dE/S parallle et srie (RS232, I2C, SPI ) des interfaces dE/S analogique Des Timer pour grer le temps Dautres modules plus au moins sophistiqus selon la taille du microcontrleur Un microcontrleur est gnralement moins puissant quun microprocesseur en terme de rapidit ou de taille mmoire, il se contente le plus souvent dun bus 8 ou 16 bits. Ceci en fait un composant trs bon march parfaitement Adapt pour piloter les applications embarques dans de nombreux domaines dapplication. Je pense quon ne se tromperait pas beaucoup si on affirme quaujourdhui il ya un microcontrleur ( grand) dans chaque quipement lectronique : Informatique (souris, modem ) Vido (Appareil photos numrique, camra numrique ) Contrle des processus industriels (rgulation, pilotage) Appareil de mesure (affichage, calcul statistique, mmorisation) Automobile (ABS, injection, GPS, airbag) Multimdia (tlviseur, carte audio, carte vido, MP 3, magntoscope) Tlphones (fax, portable, modem)
Electromnager (lave-vaisselle, lave-linge, four micro-onde)
Un microcontrleur peut tre programm une fois pour toutes pour effectuer une ou des tches prcises au sein d'un appareil lectronique. Les microcontrleurs rcents peuvent tre reprogramms et ceci grce leur mmoire permanente de type FLASH (do le terme flasher un quipement) Plusieurs Constructeurs se partagent le march des microcontrleurs, citons INTEL, MOTOROLA, ATMEL, ZILOG, PHILIPS et MICROCHIP avec ses PIC trs populaires auxquels nous allons nous intresser dans cet ouvrage.
Microcontrleur PIC16F887
A.OUMNAD
Les microcontrleurs, quelque soit leurs constructeurs, ont des architecture trs similaires et sont constitus de modules fondamentaux assurant les mmes fonctions : UAL, Ports dE/S, interfaces de communications srie, Interfaces dE/S analogiques, Timers et horloge temps rels On peut dire que seul le langage de programmation (Assembleurs) constitue la diffrence majeure en deux microcontrleur (similaires) venant de deux constructeurs diffrents. Nous avons choisit dans ce document d'tudier les microcontrleurs PIC mid-range fabriqus par Microchip. Ce sont des microcontrleurs architecture RISC (Reduce Instructions Set Computer), ou encore composant { jeu dinstructions rduit. L'avantage est que plus on rduit le nombre dinstructions, plus leur dcodage sera rapide ce qui augmente la vitesse de fonctionnement du microcontrleur. La famille des PIC est subdivise en 3 grandes familles : La famille Base-Line, qui utilise des mots dinstructions de 12 bits, elle constitue l'entre de gamme des microcontrleurs fabriqus par Microchip la famille Mid-Range, qui utilise des mots de 14 bits. C'est la famille des microcontrleurs moyenne puissance la famille High-End, qui utilise des mots de 16 bits. C'est la famille haut de gamme. Au lieu de nous lancer dans l'tude gnrale sur les microcontrleurs, qui de notre avis, apporte peu d'aide aux lecteurs cibls par cet ouvrage, nous avons opt pour une tude dtaille du microcontrleur 16F887 qui est le remplaant dsign du trs populaire 16F877. C'est un lment trs reprsentatif de la famille mid-range puisqu'il est dot de la plupart des modules qui quipent les circuits de cette famille. Cet ouvrage est organis d'une faon telle que le lecteur peur passer rapidement la pratique. Tous les aspects ncessaires l'criture, la compilation et l'implantation d'un programme sur le PIC sont regroup dans les cinq premiers chapitres, volontairement courts pour viter au lecteur de s'garer. Ensuite l'ouvrage peut servir comme document de rfrence, le lecteur n'est pas oblig d'tudier le reste des chapitres dans l'ordre prsent.
Microcontrleur PIC16F887
A.OUMNAD
I.3 L'Horloge.................................................................................................................................................................... 9 I.3.1 Oscillateur quartz ...................................................................................................................................... 9 I.3.2 Oscillateur RC. ..............................................................................................................................................10 I.3.3 Horloge externe. ..........................................................................................................................................10 I.3.4 Oscillateur interne. .....................................................................................................................................10 I.4 Les Registres de configuration CONFIG1 et CONFIG2 ...............................................................................11 I.4.1 Exemple de Configuration gnrique ...................................................................................................14 I.5 L'unit de traitement centrale (CPU) .............................................................................................................14 I.6 Organisation de la mmoire RAM ....................................................................................................................15 I.6.1 Accs la RAM par adressage DIRECT .................................................................................................15 I.7 I.8 Accs la RAM par ladressage INDIRECT ....................................................................................................17 Quelques registres de configuration et leurs bits ......................................................................................19
Chapitre II............................................................................................................................................................ 20 LE JEUX D'INSTRUCTIONS DU PIC16F887 ................................................................................................... 20 II.1 Les instructions orientes Registre ...............................................................................................................20 II.2 Les instructions orientes bits .........................................................................................................................20 II.3 Les instructions oprant sur une valeur .......................................................................................................21 II.4 Les instructions de saut et appel de procdures ........................................................................................21 II.5 Le jeu d'instructions.............................................................................................................................................21 II.5.1 Les instructions movwf et movf ..............................................................................................................22 II.5.2 Les instructions btfss et btfsc .................................................................................................................22 II.5.3 Les instructions incfsz et decfsz .............................................................................................................22 II.5.4 Linstruction goto ........................................................................................................................................23 II.5.5 Linstruction call..........................................................................................................................................23 II.6 Les indicateur dtat (drapeaux) .....................................................................................................................24 II.6.1 Les indicateurs, la soustraction et la comparaison..........................................................................24 II.7 Les directives de l'assembleur MPASM ..........................................................................................................24 II.7.1 La directive LIST ..........................................................................................................................................25 II.7.2 La directive INCLUDE.................................................................................................................................25 II.7.3 La directive EQU ..........................................................................................................................................25 II.7.4 Les directives CBLOCK/ENDC .................................................................................................................25 II.7.5 La directive ORG ..........................................................................................................................................25 II.7.6 La directive #DEFINE ................................................................................................................................26 II.7.7 Les directives LOW et HIGH .....................................................................................................................26 II.7.8 La directive DE .............................................................................................................................................26 II.7.9 La directive DT .............................................................................................................................................27 II.7.10 La directive END :........................................................................................................................................27 II.7.11 La directive __CONFIG ................................................................................................................................27 II.8 Les oprateurs arithmtique et logique de l'assembleur ........................................................................27 II.9 Les macros...............................................................................................................................................................28
Microcontrleur PIC16F887
A.OUMNAD
Chapitre III .......................................................................................................................................................... 29 LES OUTILS DE DEVELOPPEMENT ................................................................................................................ 29 III.1 Procdure de travail.............................................................................................................................................29 III.1.1 Programmeur simple .................................................................................................................................29 III.1.2 PIC en mode excution .........................................................................................................................30 III.2 Lenvironnement de dveloppement MPLAB ..........................................................................................30 III.3 Programme type : adressage direct ................................................................................................................32 III.3.1 Des macros pour slectionner les banks .............................................................................................34 III.4 Boucles de temporisation...................................................................................................................................35 III.4.1 Temporisation avec une boucle .............................................................................................................35 III.4.2 Temporisation avec 2 boucles imbriques.........................................................................................36 III.4.1 Temporisation avec 3 boucles imbriques.........................................................................................36 Chapitre IV .......................................................................................................................................................... 38 LES PORTS dENTRE SORTIES ...................................................................................................................... 38 IV.1 Le port d' E/S PORTA ...........................................................................................................................................38 IV.2 Le port d'E/S PORTB ............................................................................................................................................39 IV.3 Le port d' E/S PORTC............................................................................................................................................39 IV.4 Le port d' E/S PORTD ...........................................................................................................................................39 IV.5 Le port d'E/S PORTE ............................................................................................................................................40 IV.6 Situation au dmarrage.......................................................................................................................................40 IV.7 Programmes types ................................................................................................................................................40 IV.7.1 Faire clignoter une LED.............................................................................................................................40 IV.7.2 Commande d'un relai .................................................................................................................................42 IV.8 Commande d'un afficheur sept segments .....................................................................................................44 IV.9 Commande d'un afficheur LCD .........................................................................................................................46 IV.9.1 Initialisation de l'afficheur en mode 8 bits .........................................................................................47 IV.9.2 Initialisation de l'afficheur en mode 4 bits .........................................................................................47 IV.9.3 Exemple de branchement.........................................................................................................................49 Chapitre V ............................................................................................................................................................ 50 LES MMOIRES PERMANENTES ..................................................................................................................... 50 V.1 La mmoire EEPROM de donnes ....................................................................................................................50 V.2 Procdure de lecture dans la EEPROM...........................................................................................................51 V.3 Procdure d'criture dans la EEPROM ...........................................................................................................51 V.4 La mmoire EEPROM Programme ou mmoire flash ...............................................................................52 V.5 Procdure de lecture dans la mmoire programme .................................................................................52 V.6 Procdure d'criture dan la mmoire programme....................................................................................53 V.7 Mcanisme d'criture dan la mmoire programme ..................................................................................53 Chapitre VI .......................................................................................................................................................... 55 LES INTERRUPTIONS ........................................................................................................................................ 55 VI.1 Droulement d'une interruption .....................................................................................................................55 VI.2 Les sources d'interruption .................................................................................................................................56 VI.3 L'interruption INT (Entre RB0 de PORTB) .................................................................................................56
Microcontrleur PIC16F887
A.OUMNAD
VI.4 L'interruption IOCB ..............................................................................................................................................56 VI.5 Les autres interruptions .....................................................................................................................................57 Chapitre VII ......................................................................................................................................................... 58 LES TIMERS ......................................................................................................................................................... 58 VII.1 Le Timer TMR0.......................................................................................................................................................58 VII.1.1 Programmes types: Clignoter LED, scrutation du drapeau T0IF ................................................59 VII.1.2 Programme type: Clignoter LED, interruption de TMR0 ...............................................................60 VII.2 Le Timer TMR2.......................................................................................................................................................61 VII.2.1 Cycle de comptage ......................................................................................................................................61 VII.2.2 Le registre T2CON: ......................................................................................................................................62 VII.2.3 Programme type : Clignoter une LED, Interruption de TMR2......................................................62 VII.2.4 Programme type : Signal asymtrique.................................................................................................64 Chapitre VIII ....................................................................................................................................................... 65 LE MODULE DE CONVERSION ANALOGIQUE NUMRIQUE...................................................................... 65 VIII.1 VIII.2 VIII.3 VIII.4 VIII.5 VIII.6 VIII.7 Les registres ADCON0 et ADCON1..........................................................................................................66 Droulement dune Conversion .............................................................................................................67 Temps de conversion .................................................................................................................................67 Temps d'acquisition ...................................................................................................................................68 Frquence d'chantillonnage ..................................................................................................................68 Valeur numrique obtenue ......................................................................................................................69 Programmation en bref.............................................................................................................................69
VIII.8 Programmes types ......................................................................................................................................69 VIII.8.1 Prendre une seule mesure .......................................................................................................................69 VIII.8.2 Relever 40 chantillons ............................................................................................................................70 VIII.8.3 Relever 40 chantillons, fe=8000 Hz ....................................................................................................71 Chapitre IX .......................................................................................................................................................... 73 L'USART................................................................................................................................................................ 73 IX.1 Mode Asynchrone .................................................................................................................................................73 IX.1.1 Mode 8 bits ....................................................................................................................................................73 IX.1.2 Mode 9 bits ....................................................................................................................................................74 IX.2 Le port en transmission ......................................................................................................................................74 IX.2.1 Le registre de contrle TXSTA ................................................................................................................74 IX.3 Le port en rception .............................................................................................................................................75 IX.3.1 Lecture du 9me bit ......................................................................................................................................76 IX.3.2 Le registre de contrle RCSTA ................................................................................................................76 IX.3.3 Mode dtection d'adresse ........................................................................................................................77 IX.4 La vitesse de communication ............................................................................................................................78 IX.4.1 Le registre BAUDCTL..................................................................................................................................79 IX.5 La transmission en bref (sans interruption)................................................................................................79 IX.6 La rception en bref (sans interruption) ......................................................................................................80 IX.7 Registres utiliss par l'USART ...........................................................................................................................80
Microcontrleur PIC16F887
A.OUMNAD
Microcontrleur PIC16F887
A.OUMNAD
PORTE
PORTD
PORTC
PORTA
14 bits : config
DAC 10 bits
Chien de garde
WDT
CCP1 CCP2
Capture/Comparaison
Horloge systme
256 octets
EEPROM
I.2
Brochage du 16F887
Microcontrleur PIC16F887
A.OUMNAD
I.3
L'Horloge
Figure I-2 : possibilits dhorloge sur un PIC 16F887 (source : document Microchip DS41291F)
Le PIC16F887 dispose dun gnrateur interne qui dlivre une horloge de frquence Fosc. Cette horloge est utilise par pratiquement tous les modules. L'horloge utilise par l'unit de traitement pour cadencer l'excution du programme est obtenu par division par quatre. On l'appelle horloge instruction car le PIC excute une instruction par priode de cette horloge. Sa priode sera appele Tcy en rfrence au cycle machine. Le gnrateur d'horloge est constitu de deux oscillateurs. Un oscillateur externe et un double oscillateur interne. Le premier oscillateur est dit externe car le quartz ou le rseau RC permettant de fixer la frquence sont externes. Le choix de l'oscillateur est de la frquence Fosc se fait l'aide de deux registres: o Le registre de configuration permanent CONFIG1 de type EEPROM qui est flach au moment de l'implantation du programme sur le PIC, o Le registre OSCCON qui est situ dans la RAM et qui peut tre chang tout moment lors de l'excution du programme.
I.3.1
Oscillateur quartz
La frquence Fosc peut aller jusqu{ 20 MHz. Le quartz (externe) doit tre reli aux entres OSC1 et OSC2. Le rseau de filtrage Rs, C1 et C2 n'est pas obligatoire pour les basses frquences.
Microcontrleur PIC16F887
A.OUMNAD
10
Le registre CONFIG1 doit tre configur par la directive __CONFIG dans lun des modes suivants : o LP : FOSC<2:1:0>= 000. Pour les quartz de frquence infrieure 200 kHz. Ce mode est bien adapt pour le quartz d'horlogerie 32.768 kHz qui permet d'obtenir une horloge d'une seconde par division de frquence. o XT : FOSC<2:1:0>= 001. Pour les quartz de frquence infrieure 8 MHz o HS : FOSC<2:1:0>= 010 : Pour les quartz de 8 MHz 20 MHz. Dans ce cas, il est conseill dutiliser C1 et C2 avec des valeurs de 10pF 30pF . o
I.3.2
Oscillateur RC.
La frquence de l'oscillation est fixe par Vdd, Rext et Cext. Elle peut varier lgrement d'un circuit l'autre. Le registre CONFIG1 doit tre configur dans lun des modes suivants : o RC : FOSC<2:1:0>= 111. Le rseau RC est connect sur la broche OSC1. L'horloge instruction Fosc/4 est accessible sur la broche OSC2. Lhorloge systme de frquence Fosc/ 4 est disponible sur la sortie OSC2. On peut ainsi mesurer sa frquence et ajuster les valeurs de Rext et Cext. o RCIO : FOSC<2:1:0>= 110. Dans ce cas, l'horloge fosc/4 n'est pas accessible. La broche OSC2 fonctionne comme E/S normale RA6 accessible par le bit 6 du port PORTA o
I.3.3
Horloge externe.
Lhorloge externe est applique sur lentre OSC1. La broche OSC2 fonctionne en E/S normale RA6. Le registre CONFIG1 doit tre configur dans le mode EC : FOSC<2:1:0>= 011
I.3.4
Oscillateur interne.
Dans ce mode, on na pas besoin de composant externes. Lhorloge est issue de lun des deux oscillateurs internes HFINTOSC et LFINTOSC.
Microcontrleur PIC16F887
A.OUMNAD
11
Le registre CONFIG1 doit tre configur dans lun des deux modes : INTOSC : FOSC :<2:1:0>= 101: l'horloge Fosc/4 est disponible sur la broche OSC2 qui fonctionne en CLKOUT alors que la broche OSC1 fonctionne en E/S normale RA7 INTOSCIO : FOSC<2:1:0>= 100: Les deux broches OSC1 et OSC2 fonctionnent en E/S normales Il faut configurer le registre OSCCON (bank1) pour choisir la frquence dsire entre 31kHz et 8MHz
I.3.4.1
OSCCON
Le registre OSCCON
U(0) R/W(1) R/W(1) R/W(0) R(1) R(0) R(0) R/W(1)
SCS
IRCF<2:0>: slection de frquence 111 8 MHz 110 4 MHz (default) 101 2 MHz 100 1 MHz 011 500 kHz 010 250 kHz 001 125 kHz 000 31 kHz (LFINTOSC) OSTS: indicateur sur l'tat de l'horloge en mode Internal External Switchover (voir registre CONFIG1) 1 le systme fonctionne avec l'horloge dfinie par les bits FOSC<2:0> du registre CONFIG1 0 le systme fonctionne avec l'horloge interne (HFINTOSC ou LFINTOSC) HTS: Indicateur sur l'tat de l'oscillateur interne HFINTOSC (aprs le dmarrage) 1 HFINTOSC s'est stabilis 0 HFINTOSC ne s'est pas encore stabilis LTS: Indicateur sur l'tat de l'oscillateur interne LFINTOSC (aprs le dmarrage) 1 LFINTOSC s'est stabilis 0 LFINTOSC ne s'est pas encore stabilis SCS: Choix de l'horloge systme (ce bit est important) 1 Le systme utilise l'horloge issue des oscillateurs interne 0 Le systme utilise l'horloge issue de l'oscillateurs externe ( RC, XT , HS )
I.4
Pour le PIC16F887, les switchs de configuration sont regroups dans deux registres CONFIG1 et CONFIG2 situs dans la EEPROM de configuration aux positions 2007h et2008h. Attention, ces registres ne sont pas des SFR que lon peut modifier durant lexcution du programme. Ce sont des registres permanents flashs au mme moment que le programme. Les bits de ces registres sont aussi appels fusibles ou switchs de configuration.
Microcontrleur PIC16F887
A.OUMNAD
12
Ces deux registres doivent tre configurs l'aide de la directive __CONFIG. Les logiciels de flachage du PIC permettent aussi de les positionner. CONFIG1 : 2007
DEBUG LVP FCMEN IESO BOREN1 BOREN0 CPD CP MCLRE PWRTE WDTE FOSC2 FOSC1 FOSC0
DEBUG: In-Circuit Debugger Mode bit Si on active ce mode, on peut brancher un quipement (dbuggeur) sur les broches RB6 et RB7 et interagir avec le PIC alors quil est dj{ plac dans son environnement rel. On peut ainsi, par exemple suivre un programme la trace, consulter les valeurs des registres pour trouver les erreurs. 1 In-Circuit Debugger dsactiv 0 In-Circuit Debugger active LVP: Low Voltage Programming Enable bit Lors du flashage du PIC, il faut le placer en mode programmation en forant la broche MCLR soit 12V (mode HVP) soit 5V (mode LVP) 0 Low Voltage programming dsactiv (mode HVP) 1 Low Voltage programming activ FCMEN: Fail-Safe Clock Monitor Enable bit Le fail safe clock monitor permet au PIC de continuer fonctionner en cas dfaillance des lments externes de lhorloge en basculant automatiquement sur lhorloge interne 0 Fail-Safe Clock Monitor dsactiv 1 Fail-Safe Clock Monitor est activ IESO: Internal External Switchover bit Les oscillateurs quartz sont connus pour mettre du temps dmarrer. Si on active le mode Internal External Switchover, Le PIC commence { excuter le programme { laide de lhorloge interne en attendant que lhorloge externe se stabilise pour basculer dessus automatiquement 0 Internal/External Switchover dsactiv 1 Internal/External Switchover activ BOREN<1:0>: Brown-out Reset Selection bits Si ce mode est activ, le PIC se rinitialise automatiquement chaque fois que Vdd chute en dessous de La valeur VBOR fixe par le bit BOR4V du registre CONFIG2 11 BOR activ 10 BOR activ en fonctionnement normal, dsactiv en mode sleep 01 BOR contrl durant lexcution du programme { laide du bit SBOREN du registre PCON 00 BOR dsactiv CPD: Data Code Protection bit Protection en lecture de la EEPROM de donnes 1 dsactiv 0 activ CP: Code Protection bit Protection en lecture de la mmoire programme
Microcontrleur PIC16F887 1 dsactiv 0 activ MCLRE: RE3/MCLR pin select bit Choix de la fonction de la broche RE3/MCLR
A.OUMNAD
13
1 RE3/MCLR fonctionne en MCLR = entre RESET ( Initialisation) 0 RE3/MCLR fonctionne comme entre numrique. Elle ne peut pas fonctionner en sortie PWRTE: Power-up Timer Enable bit Si on active cette option, au dmarrage, le PIC attend 64 ms avant de dmarrer le programme. 1 PWRT dsactiv 0 PWRT activ WDTE: Watchdog Timer Enable bit 1 Chien de garde WDT activ 0 le chien de garde WDT est dsactiv mail il peut tre activ durant lexcution du programme { laide du bit SWDTEN du registre WDTCON FOSC<2:0>: Oscillator Selection bits (voir paragraphe sur lhorloge) 111 RC oscillator: RA6=CLKOUT, RA7=pour connecter R et C 110 RCIO oscillator: RA6=E/S normale, RA7=pour connecter R et C 101 INTOSC oscillator: RA6=CLKOUT, RA7=E/S normale 100 INTOSCIO oscillator: RA6=E/S normale, RA7=E/S normale 011 EC (External Clock): RA6=E/S normale, RA7= entre horloge 010 HS oscillator: High-speed crystal/resonator, Quartz reli sur RA6 et RA7 001 XT oscillator: Crystal/resonator, Quartz reli sur RA6 et RA7 000 LP oscillator: Low-power crystal, Quartz reli sur RA6 et RA7 CONFIG2 : 2008 -
WRT1
WRT0
BOR4V
WRT<1:0>: Flash Program Memory Self Write Enable bits, Pour protger la mmoire programme contre des critures intempestives (par le programme) 00 zone 0000h 0FFFh protge, le reste contrl par le bit WREN du registre EECON1 00 zone 0000h 07FFh protge, le reste contrl par le bit WREN du registre EECON1 00 zone 0000h 00FFh protge, le reste contrl par le bit WREN du registre EECON1 11 protection dsactive. La totalit de la mmoire dpend du bit WREN du registre EECON1 BOR4V: Brown-out Reset Selection bit, Permet de dfinir la valeur de VBOR, valeur de Vdd en dessous de laquelle le PIC se rinitialise automatiquement (dans le cas ou le BOREN est activ) 0 VBOR = 2.1V 1 VBOR = 4V
Microcontrleur PIC16F887
A.OUMNAD
14
Les bits non utiliss nont pas dimportance. On peut les placer { 0 ou 1.
I.4.1
CONFIG1 : DEBUG : OFF(1) LVP : OFF(0) BOREN : ON(11) DCP : OFF(1) PWRTE : ON(0) WDTE : OFF(0), 10 0011 1110 0100 = 0x23E4 CONFIG2 : WRT:OFF(11), BOR4V : 4V(0) __CONFIG 0x2007 , 0x23E4 __CONFIG 0x2008 , 0x3EFF
I.5
Le PIC16F887 dispose d'une unit de traitement 8 bits d'architecture RISC (Reduced Instruction Set Computer). Elle reconnait un jeu de 35 instructions simples. Les instructions complexes comme la multiplication et la division ne sont pas implantes. La diffrence avec les processeurs d'architecture CISC (Complex Instruction Set Computer), qui peuvent dcoder jusqu' 200 instructions dont certaines peuvent tre trs sophistiques, est que toutes les instructions sont codes sur un nombre fixe et rduit de bits. Ceci en facilite le dcodage et l'excution. En effet, toutes les instruction sont codes sur 14 bits et sont excutes en un cycle Tcy de l'horloge instruction Fosc/4. La mmoire programme et la mmoire de donnes sont distinctes ce qui facilite la gestion des bus. La mmoire programme est une mmoire de type EEPROM flash de capacit 8 1024 mots de 14 bits. Chaque position contient le code d'une instruction. Cette mmoire garde son contenu quand le PIC est teint et peut tre reprogramme souhait. Elle joue un peu le rle d'un disque dur. La mmoire de donnes est une RAM appele fichier des registres. Elle est constitue de 96 registres de configuration appels SFR (Special Function Registers) et de 368 registre usage gnral GPR (General Propose Registers) qui jouent le rle de RAM proprement dit. Tous les registres SFR ou GPR sont des registres 8 bits. Toutes les oprations excutes dessus sont des oprations 8 bits. Le processeur dispose d'un seul accumulateur nomm W (Working register). C'est un registre de travail 8 bits intgr avec lUnit Arithmtique et Logique. Il ne peut donc pas tre adress de la mme faon que les registres SFR ou GPR puisqu'il n'est pas situ dans la RAM. Toutes les oprations deux oprandes passent par lui. On peut avoir : - Une opration entre W et une valeur (prcise dans l'instruction) avec rsultat dans W - Une opration entre W et un registre ( RAM). Le rsultat peut tre rcupr soit dans W soit dans le registre. Le processeur dispose d'une pile de 8 positions non accessible par programme. Elle est utilise pour sauvegarder le compteur programme lors de l'appel de sous-programmes et au branchement aux interruptions. Le programmeur fera donc attention ne pas avoir plus de 8 appels de fonctions imbrique.
A.OUMNAD
15
368 GPR
UAL
Horloge systme
Figure I-6 : structure trs simplifie de l'unit de traitement
I.6
Lespace mmoire RAM adressable est de 512 positions de 1 octet chacune : 96 positions sont rserves au SFR (Special Function Registers) qui sont les registres de configuration du PIC. Les 416 positions restantes constituent les registres GPR (General Propose Registers) ou RAM utilisateur. Sur le 16F887, 3 blocs de 16 octets chacun ne sont pas implants physiquement do une capacit de RAM utilisateur de 368 GPR. Pour accder la RAM, on dispose de deux modes dadressage :
I.6.1
Avec ce mode dadressage, on prcise dans linstruction la valeur de ladresse { laquelle on veut accder. Par exemple, pour additionner le contenu de l'accumulateur W avec le contenu de la case mmoire d'adresse 50h avec rsultat dans Won utilise l'instruction ADDWF 50h,0 ADDWF est l'instruction qui ajoute W au contenu d'une case mmoire. 50h est l'adresse de notre case mmoire. 0 est un bit qui prcise que le rsultat doit tre rang dans W, si on avait pris 1, le rsultat aurait t rang dans la case mmoire 50h. Cette instruction sera code sur 14 bits, comme le montre la figure ci-dessous :
6 1 7
CO
adresse
CO est le code opration de l'instruction ADDWF. Il est cod sur 6 bits car on a 35 instructions diffrentes, d prcise la destination du rsultat. Comme il n'y a que deux possibilits W ou F, un seul bit suffit, adresse est l'adresse la case mmoire. On est oblig de la coder sur 7 bits pour complter les 14 bits de l'instruction Problme, 7 bits permettent dadresser seulement 128 positions. Pour pouvoir adresser les 512 positions accessibles, il faut 9 bits dadresse. Pour avoir ces 9 bits, le PIC complte les 7 bits venant de linstruction par deux bits situs dans le registre de configuration STATUS. Ces bits sont appels RP0
Microcontrleur PIC16F887
A.OUMNAD
16
et RP1 et doivent tre positionns correctement avant toute instruction qui accde la RAM par ladressage direct. RP1 RP0 7 bits venant de l'instruction 9 bits
Figure I-8 : constitution de l'adresse pour l'adressage physique
Mme si on prcise une adresse suprieure 127 (+ de 7 bits) dans une instruction, elle est tronque 7 bits puis complte par les bits RP0 et RP1 pour former une adresse 9 bis. Par exemple, pour copier laccumulateur W dans la case mmoire dadresse 1EFh, il faut dabord placer les bits RP0 et RP1 1 , ensuite on utilise soit linstruction MOVWF 6Fh soit linstruction MOVWF 1EFh, qui donne le mme rsultat. En effet, que lon crive 6Fh = 0110 1111 ou 1EFh = 0001 1110 1111, le PIC ne prend que 7 bits soit : 1101111 = 6Fh et complte avec les bits RP1 RP0 pour obtenir 11 1101111 = 1EFh. Pour positionner les bits RP0 et RP1 on utilise les instructions bcf et bsf. La RAM apparat alors organise en 4 pages appeles banks de 128 octets chacun. L'adresse instruction permet d'adresser l'intrieur d'un bank alors que les bits RP0 et RP1 du registre STATUS permettent de slectionner un bank. La Figure I-9 montre lorganisation de la RAM avec les zones alloue au SFR et aux GPR. Les zones hachures ne sont pas implantes physiquement. Si on essaye dy accder, on est aiguill automatiquement vers la zone [70h,7Fh] appele zone commune. Oublier de slectionner le bank est une cause frquente de disfonctionnement de programmes. Si par exemple RP1 RP0 = 01 (bank1 est le bank courant). Si on veut faire une opration sur la case 20h et on oublie de changer de bank. Le processeur prend 7 bits de l'adresse 20h=0010 0000 et complte avec 01 ce qui donne 01 0100000= A0h. Nous croyons travailler sur la case 20h alors que le processeur travaille sur la case A0h. De la mme faon, si le bank courant est 11=bank3 et on fait une opration sur le registre PORTA, le processeur travaille sur le registre SRCON. Les 16 cases de la zone commune sont intressantes car pour y accder, on n'est pas oblig de prciser le bank.
Microcontrleur PIC16F887
A.OUMNAD
17
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh 20h
Bank 0 (00) INDF TMR0 PCL STATUS FSR PORTA PORTB PORTC PORTD PORTE PCLATH INTCON PIR1 PIR2 TMR1L TMR1H T1CON TMR2 T2CON SSPBUF SSPCON CCPR1L CCPR1H CCP1CON RCSTA TXREG RCREG CCPR2L CCPR2H CCP2CON ADRESH ADCON0
80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch 8Dh 8Eh 8Fh 90h 91h 92h 93h 94h 95h 96h 97h 98h 99h 9Ah 9Bh 9Ch 9Dh 9Eh 9Fh A0h
Bank 1 (01) INDF OPTION_REG PCL STATUS FSR TRISA TRISB TRISC TRISD TRISE PCLATH INTCON PIE1 PIE2 PCON OSCCON OSCTUNE SSPCON2 PR2 SSPADD SSPSTAT WPUB IOCB VRCON TXSTA SPBRG SPBTGH PWM1CON ECCPAS PSTRCON ADRESL ADCON1
100h 101h 102h 103h 104h 105h 106h 107h 108h 109h 10Ah 10Bh 10Ch 10Dh 10Eh 10Fh 110h
Bank 2 (10) INDF TMR0 PCL STATUS FSR WDTCON PORTB CM1CON0 CM2CON0 CM2CON1 PCLATH INTCON EEDATA EEADR EEDATH EEADRH
180h 181h 182h 183h 184h 185h 186h 187h 188h 189h 18Ah 18Bh 18Ch 18Dh 18Eh 18Fh 190h
Bank 3 (11) INDF OPTION_REG PCL STATUS FSR SRCON TRISB BAUDCTL ANSEL ANSELH PCLATH INTCON EECON1 EECON2
120h
1A0h
EFh F0h
16Fh 170h
1EFh 1F0h
FFh
1FFh
I.7
Pour accder une position de la RAM en utilisant ladressage indirect, on passe toujours par une position fictive appele INDF (Indirect File). Exemple : linstruction CLRF INDF signifie : mettre { zro la case mmoire dadresse INDF. Mais quelle est ladresse de cette position appele INDF ? La rponse est : INDF est la case mmoire pointe par le pointeur IRP/FSR. IRP est un bit qui se trouve dans le registre STATUS et FSR est un registre accessible dans tous les bancs. On peut se demander pourquoi on ajoute le bit IRP. En effet, le registre de pointage FSR est un
Microcontrleur PIC16F887
A.OUMNAD
18
registre 8 bits, il peut donc adresser au maximum 256 positions mmoire (de 00h FFh), cest seulement la moiti de la RAM. Il nous manque un bit pour avoir les 9 bits ncessaires. On utilise le bit IRP qui se trouve dans le registre STATUS. Exemple : Si on place 74h dans le registre FSR et on positionne le bit IRP 1, alors, linstruction CLRF INDF signifie : remettre { zro la case mmoire dadresse 174h.
IRP
FSR
0 00 0 1F 0 20
1 00 1 0F 1 10
SFR (16)
GPR (96)
SFR (16)
1 6F 1 80 1 8F 1 90
0 7F 0 80 0 9F 0 A0 0 EF 0 FF
GPR (96)
1 EF 1 FF
page 0
page 1
En rsum, chaque fois que le PIC rencontre le mot INDF dans un programme, il sait quil sagit de la case mmoire dont ladresse (9 bits) se trouve dans le pointeur FSR complt par le bit IRP du registre STATUS INDF est la case mmoire pointe par le pointeur:
IRP
page 0 page 1
Microcontrleur PIC16F887
A.OUMNAD
19
I.8
Exercice 1) Dans quel bank se trouvent les cases mmoire d'adresse : 1A4h, B5h, 130h, 58h, 100, 200, 250, 300, 400 Exercice 2) Combien de cases mmoires libres (GPR) y a-t-il dans la zone mmoire qui commence la position A0h et se termine EAh. Exercice 3) Quelle est l'adresse de la dernire position d'une zone mmoire de 40 cases qui commence la position 190h. Exercice 4) Combien de cases mmoires libres (GPR) y a-t-il dans les bancs bank0, bank1, bank2 et bank3
Microcontrleur PIC16F887
A.OUMNAD
20
II.1
Ce sont des instructions qui manipulent un octet se trouvant dans la RAM. a peut tre un registre de configuration SFR ou une case mmoire quelconque (Registre GPR) Ces instruction se prsentent sous la forme : ADDWF F,d ADDWF est le nom de l'instruction. Le F dans le nom de l'instruction signifie que celle-ci agit sur une case mmoire (registre). Chez Microchip, la RAM est appele register File (Fichier des registres), d'o l'utilisation de la lettre F pour tout ce qui est registre. o F est l'adresse du registre (SFR ou GPR). a peut tre une adresse directe ou le mot INDF pour indiquer l'adressage indirect. o d est la destination du rsultat. Si d=0 ou d=w, le rsultat est rang dans l'accumulateur W. Si d=1 ou d=f, le rsultat est rang dans le registre F. Dans le tableau ci-dessous, on utilise l'abrviation {W,F ? d} pour dire que le rsultat va dans W ou dans F selon la valeur de d. ADDWF 70h,1 ou ADDWF 70h,f Additionner le contenu de W avec le contenu du GPR 70h et placer le rsultat dans le GPR 70h XORWF 35h,0 ou XORWF 35h,w Faire un ou exclusif entre W et le contenu du GPR 35h et placer le rsultat dans W
II.2
Ce sont des instructions destines { manipuler directement un bit dun registre que se soit un registre de configuration SFR ou une case mmoire quelconque (registre GPR). Tous les bits de la RAM peuvent tre manipuls individuellement. Ces instruction se prsentent sous la forme : BCF F,b o F est le registre qui contient le bit o b est le numro du bit dans le registre. On compte partir de la droite en commenant par 0 BSF STATUS,2 ; signifie : mettre 1 le bit 2 (3me bit partir de la droite) du registre STATUS
Microcontrleur PIC16F887
A.OUMNAD
21
II.3
Ce sont les instructions entre laccumulateur W est une valeur K prcise dans l'instruction. Le rsultat va dans W. Toutes ces instructions contiennent la lettre L dans leur nom. Ceci vient du fait que chez Microchip, ce type d'adressage est appel adressage Literal.
II.4
Ce sont les instructions qui permettent de sauter une autre position dans le programme et de continuer lexcution { partir de cette position. La position est dsigne par une tiquette qui peut tre n'importe quelle chane alphanumrique qui commence par caractre. L'tiquette peut tre termine par le caractre (:) mais ce n'est pas obligatoire. Elle peut tre seule sur une ligne ou au dbut d'une ligne contenant une instruction.
II.5
Le jeu d'instructions
{W,F ? d} signifie que le rsultat est rang soit dans W si d=0 ou w, soit dans F si d= 1 ou f
INSTRUCTIONS OPERANT SUR REGISTRE ADDWF F,d W+F {W,F ? d} ANDWF F,d W and F {W,F ? d} CLRF F Clear F COMF F,d Complmente F {W,F ? d} DECF F,d dcrmente F {W,F ? d} DECFSZ F,d dcrmente F {W,F ? d} skip if 0 INCF F,d incrmente F {W,F ? d} INCFSZ F,d incrmente F {W,F ? d} skip if 0 IORWF F,d W or F {W,F ? d} MOVF F,d F {W,F ? d} MOVWF F WF RLF F,d rotation gauche de F a travers C {W,F ? d} RRF F,d rotation droite de F a travers C {W,F ? d} SUBWF F,d F W {W,F ? d} SWAPF F,d permute les 2 quartets de F {W,F ? d} XORWF F,d W xor F {W,F ? d} INSTRUCTIONS OPERANT SUR BIT BCF F,b RAZ du bit b du registre F BSF F,b RAU du bit b du registre F BTFSC F,b teste le bit b de F, si 0 saute une instruction BTFSS F,b teste le bit b de F, si 1 saute une instruction INSTRUCTIONS OPERANT SUR CONSTANTE ADDLW K W+KW ANDLW K W and K W IORLW K W or K W MOVLW K KW SUBLW K KWW XORLW K W xor K W AUTRES INSTRUCTIONS CLRW Clear W CLRWDT Clear Watchdoc timer CALL etqt Branchement un sous programme de label etqt GOTO etqt branchement la ligne de label etqt NOP No operation RETURN retourne d'un sous programme RETFIE Retour d'interruption RETLW K retourne d'un sous programme avec K dans W SLEEP se met en mode standby C,DC,Z Z Z C,DC,Z Z Z TO', PD' indicateurs C,DC,Z Z Z Z Z Z Z Z C C,DC,Z Z Cycles 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 1 1 1(2) 1(2) 1 1 1 1 1 1 1 1 2 2 1 2 2 2 1
TO', PD'
Microcontrleur PIC16F887
A.OUMNAD RAM
22
MOVWF
RAM movf: permet de copier le contenu dun registre (SFR ou GPR) dans laccumulateur W, le paramtre d doit tre = 0(w)
movf movf STATUS,0 ; Copier le registre STATUS dans laccumulateur W 35h,w ; Copier le contenu du GPR 35h dans laccumulateur W
MOVF
Avec le paramtre d=1, linstruction movf semble inutile car elle permet de copier un registre sur lui-mme ce qui priori ne sert rien.
movf STATUS,1 ; Copier le contenu du registre STATUS dans lui mme
En ralit cette instruction peut savrer utile car elle positionne lindicateur Z. On peut s en servir pour tester si le contenu dun registre est gal { zro
Btfss
F,b
exemple :
sublw 100 btfss STATUS,Z clrf 70h cmpf 70h,f suite du programme suite du programme ; 100 W W ; tester le bit Z du registre STATUS et sauter une ligne si Z=1 ; le programme continue ici si Z=0 ; le programme continue ici si Z=1
deccfsz
F,f
Microcontrleur PIC16F887
A.OUMNAD
23
bonjour:
Pour faire un branchement relatif la ligne courante, on peut utiliser le caractre $ qui dsigne l'adresse de la ligne courante
Instruction Instruction Goto $-1 Instruction Goto $+3 Instruction Instruction Instruction Goto $ ; aller la ligne prcdente ; sauter 2 lignes
Microcontrleur PIC16F887
A.OUMNAD
24
II.6
Les bits Z, DC et C situs dans le registre STATUS sont des indicateurs qui permettent de savoir comment une instruction sest termine. Toutes les instructions nagissent pas sur les indicateurs, voir liste des instructions ci-dessous. Z : passe 1 quand le rsultat dune instruction est nul C : passe 1 quand lopration a gnr une retenue DC : Digital carry, passe 1 quand l'opration sur le bit 3 (4me bit) gnre une retenue vers le bit 4 Ces bits peuvent tre utiliss trs astucieusement par les instructions btfsc et btfss qui permettent de tester un bit et de raliser un saut conditionnel. Nous aurons loccasion den reparler dans la suite. STATUS IRP RP1 RP0 Z DC C
Pour raliser une comparaison entre F et W, on fait F W et on observe Z et C Z=1 ==> galit C=1 ==> F sup ou gal W C=0 ==> F infrieur W
F-W
Z=1?
oui
F=W
non
C=1?
oui
F>W
non
F<W Figure II-1 : organigramme de la comparaison
II.7
Les directives de l'assembleur sont des instructions qu'on ajoute dans le programme et qui seront interprtes par l'assembleur MPASM. Ce ne sont pas des instructions destines au PIC. On ne prsente ici que quelques directives. Pour le reste, on peut consulter la documentation de MPASM "MPASM User's Guide". L'aide du logiciel MPLAB contient aussi une rubrique sur l'assembleur MPASM. Remarque : dans la suite, les directives seront reprsentes en Majuscule. Ce n'est pas une obligation, le compilateur MPASM accepte les instructions et les directives en minuscule et en majuscule. Attention ce nest pas le cas pour les tiquettes et les noms de dclaration des constantes.
Microcontrleur PIC16F887
A.OUMNAD
25
Le nom du fichier peut tre place entre "" ou entre <> mais ce n'est pas obligatoire
Chaque fois que le compilateur rencontrera XX, il la remplacera par 0x20. a peut tre une constante s'il s'agit d'une instruction avec adressage Literal, ou d'une adresse s'il s'agit d'une instruction avec adressage direct.
MOVLW MOVF XX XX,w ; placer dans W la constante 0x20 ; placer dans W le contenu de la case dadresse 0x20
Microcontrleur PIC16F887
A.OUMNAD
26
II.7.7
LOW : retourne l'octet de poids faible d'un nombre (bit 0 7) HIGH : retourne l'octet de poids fort d'un nombre (bit 8 15) Le nombre dcimal 37500 est un nombre 16 bits (10010010 01111100). Il n'est pas ais de dterminer les valeurs de l'octet de poids faible et de poids fort sans passer par le binaire. C'est l qu'apparait l'intrt des directives LOW et HIGH.
Movlw Movlw LOW HIGH 37500 37500 ; place dans W la valeur 124 = 01111100 ; place dans W la valeur 146 = 10010010
On remarquera au passage que le poids dcimal de l'octet de poids faible est 1 et celui de l'octet de poids fort est 256. Ainsi, 37500 = 146 256 + 124
II.7.8 La directive DE
Sert dclarer des donns qui seront stocke dans l'EEPROM de donne au moment de l'implantation du programme sur le PIC. L'adresse de la premire position de la EEPROM de donnes est 0x2100
ORG 0x2104 DE "PIC", .70, 'Z',.23, 58h, .260, 3f6h ORG 0 Programme
Microcontrleur PIC16F887
A.OUMNAD
27
Lors du flashage du PIC, le programme sera flash partir de la premire position de la mmoire programme. Les donnes "PIC", .70, 'Z',.23, 58h, .260, 3F6h seront flash partir de la position 04 de la mmoire EEPROM de donnes. Chaque octet occupe une position. Pour les caractres, c'est le code ASCII qui est stock, cela va de soi. Si une donne dpasse 8 bits (255) elle est tronque. La figure ci-dessous montre comment les donnes seront places dans la mmoire EEPROM
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
.70
.23
58h
F6h
II.7.9 La directive DT
L'instruction RETLW k est une instruction qui permet de quitter un sous programme et retourner au programme appelant en ramenant la valeur k dans W. Cette instruction est souvent utilise pour raliser des transcodages de tableaux. Normalement cette opration ncessite l'criture d'un nombre ventuellement important de lignes RETLW k. Pour faciliter l'criture des programmes, la directive DT permet de gnrer une suite d'instruction RETLW.
DT .10,35h,Hello RETLW RETLW RETLW RETLW RETLW RETLW RETLW .10 35h 'H' 'e' 'l' 'l' 'o' ; le compilateur remplace cette ligne par lignes ci-dessous
II.8
L'assembleur MPASM dispose d'un prprocesseur qui peut interprter un ensemble important d'oprateurs. Ces oprateurs peuvent agir sur des valeurs de constante ou de variable de l'assembleur et en aucun cas sur le contenu des registres du PIC. Si on crit l'instruction movlw 25 + 7. L'assembleur reconnait l'oprateur + et fait l'addition notre place. Lors de la compilation, l'instruction sera remplace par movlw 32. En aucun cas, on n'a le droit d'crire une instruction du genre: movlw FSR + 5 o FSR est un registre du PIC. oprateur + * / ~ % dscription addition Soustraction ou ngation multiplication division complment modulo
exemple ALPHA EQU 12 BETA EQU 50 movlw -5 addlw ((ALPHA + 25)*3 BETA) / 2 movlw ~0x0F quivaut movlw 0xF0 movlw BETA % 16
A.OUMNAD
28
Movlw 3 2 (3 dcale gauche de 2 position =12) Dcalage gauche Movlw BETA 3 Dcalage droite ET bit par bit Movlw ((BETA & ALPHA) | 0x0F) ^ 25 OU bit par bit XOR bit par bit Movlw LOW 2011 Extrait l'octet bas movlw HIGH 2011 Extrait l'octet haut me ; W=33h Extrait le 3 octet Movlw UPPER 44332211h Movlw UPPER (44332211h 8) ; W=44h partir de la droite
Tableau II-1: quelques oprateurs de l'assembleur (liste trs incomplte)
II.9
Les macros
Les macros de l'assembleur MPASM constituent un moyen de programmation trs avanc. On va se contenter d'une dfinition simple. Une macro fonctionne un peut comme la directive #DEFINE ou EQU, elle permet d'affecter une abrviation un bloc d'instruction. La syntaxe de dclaration est la suivante
Nom_Macro macro Instruction 1 Instruction 2 Instruction 3 endm
Exemple:
BANK0 macro Bcf Bcf endm STATUS,RP0 STATUS,RP0
Chaque fois que l'on dsire se place dans le bank0, il suffira d'crire BANK0, le compilateur la remplacera par les deux instructions correspondantes. Attention, une macro n'est pas une fonction. Chaque fois que le compilateur rencontre une macro, il la remplace par les instructions correspondantes. Si on dclare une macro de 100 instructions, chaque fois qu'on l'invoque, le compilateur crit 100 lignes de programme. Si on l'invoque 100 fois dans un programme, la taille de celui-ci dpassera les 10000 lignes et ne pourra pas tre implant dans le 16f887. Avec une fonction, c'est diffrent. Chaque fois qu'on l'invoque l'aide de l'instruction call, le processeur va excuter la fonction son emplacement et revient continuer son travail. De ce fait, la fonction est crite une seule fois dans le programme. Une macro peut avoir des paramtres, exemple:
TEMPO1 macro movlw call endm Fosc,Tus ((Tus*Fosc)-.14)/.12 tempo1
Cette macro peut tre invoque en lui passant des paramtres, exemple :
TEMPO1 8, 50
Le langage des macros de l'assembleur MPASM est trs volu. Nous n'en parlerons pas ici car il ne fait pas partie des objectifs de cet ouvrage.
Microcontrleur PIC16F887
A.OUMNAD
29
III.1
Procdure de travail
Les tapes ncessaires permettant de voir un programme s'excuter sur un PIC sont : Ecrire un programme en langage assembleur dans un fichier texte et le sauvegarder avec l'extension .asm (les adeptes du C peuvent travailler en C, mais a, cest une autre histoire) Assembler (compiler) ce programme avec l'assembleur MPASM. Le rsultat est un fichier excutable avec l'extension .hex contenant une suite de codes machines comprhensible par le PIC. Implanter le fichier .hex dans la mmoire programme du PIC (mmoire flash) l'aide d'un programmateur adquat. On peut utiliser les programmateurs de Microchip ou tout autre programmateur achet ou ralis par soit mme. Mettre le PIC dans son montage final, mettre sous tension et admirer le travail.
PIC
Microcontrleur PIC16F887
A.OUMNAD
30
Vdd 1k MCLR 1k
PIC
Vss
Vss
Vss
Figure III-2 : PIC en mode RUN, oscillateur interne, oscillateur quartz, oscillateur RC
III.2
MPLAB-IDE peut tre tlcharg site web www.microchip.com Aprs l'installation, lancer MPLAB, faire la config ci-dessous : Slectionner le PIC sur lequel on travaille Configure Select Device PIC16F887 Pour faire apparatre la barre doutils du simulateur : Debugger Select tool MPLAB SIM Pour retrouver l'ancien espace de travail aprs un redmarrage: Configure settings Workspace automatically save workspace upon closing et reload last workspace at startup On va raliser un tout petit programme sans grand intrt pour voir la procdure de fonctionnement, Ouvrir une nouvelle fentre (de l'diteur) pour commencer crire un programme : file new ou cliquer sur l'icne feuille blanche Saisir le petit programme ci-dessous. Ce programme incrmente sans fin la position mmoire (RAM) 70H
loop incf goto END 70h,1 looop
Sauvegarder (file save ) ce programme dans le dossier de votre chois sous le nom bidon.asm Lancer la compilation du programme l'aide de la commande project Quikbuild Apparemment il y a un problme, le compilateur nous dit qu'il y une erreur la ligne 2
Error[113] C:\...\BIDON.ASM 2 : Symbol not previously defined (looop)
Microcontrleur PIC16F887
A.OUMNAD
31
Effectivement, il ya une erreur de frappe. Ltiquette sappelle loop et non looop. Double cliquez sur la ligne Error[113]... ce qui vous envoie directement { la ligne contenant lerreur. Corrigez et recommencez. Cette fois a a l'air d'aller. On peut vrifier que le compilateur a cr le fichier bidon.hex dans le mme dossier o se trouve bidon.asm. D'autres fichiers sont crs. Seul le fichier .hex nous intresse pour le moment. Les autres peuvent tre dtruits s'il le faut. On peut maintenant excuter le programme en simulation pour voir s'il ralise bien la tache demande. On remarque qu'aprs la compilation, une flche verte pointe sur la premire ligne du programme. Cette flche correspond la position du program Counter. Elle pointe sur la prochaine instruction qui sera excute. Si la flche n'est pas visible, c'est que le simulateur MPLAB SIM n'a pas t sectionn. Il faut le slectionner comme indiqu plus haut et recompiler le programme. Ouvrir la fentre qui visualise la mmoire RAM : view FileRegisters et reprer la case mmoire 70h Excuter le programme PAS PAS en cliquant chaque fois sur le bouton Step Into {} en observant la case mmoire 70h . (on dirait que a marche). On peut aussi excuter en continu en cliquant sur le bouton animate , pour arrter, il faut cliquer sur le bouton halt Dans le programme, remplacer 70h par 190h, compilez, simulez et tirer les conclusions. On dirait qu'il y a comme un petit problme de bank.
Microcontrleur PIC16F887
A.OUMNAD
32
III.3
On va crire un petit programme simple pour illustrer comment on dfinit les registres de configuration CONFIG1 et CONFIG2 essentiellement pour configurer l'horloge. On va aussi aborder le problme de changement de bank quand on accde la RAM par l'adressage direct. L'objectif du programme et de placer quatre octets dans la RAM : .35 dans la position 20h, 'A' dans la position A0h -5 dans la position 110h, 35h dans la position 190h Pour les switchs de configuration, on utilisera la configuration gnrique du paragraphe I.4.1. Les choix les plus importants sont WDT:OFF, LVP:OFF, horloge interne
__CONFIG 0x2007 , 0x23E4 __CONFIG 0x2008 , 0x3EFF
Pour la frquence, on choisira Fosc = 8 Mhz, l'aide du registre OSCCON (bank1) (I.3.4.1, page 11) : OSCCON = 0 111 000 1 = 0x71
Movlw movwf 0x71 OSCCON
Le PIC ne connait pas les noms des registres SFR comme STATUS dont nous allons avoir besoin pour changer de bank. Normalement, il faut y accder par leurs adresses. Ceci rend la programmation un peu rbarbative. Pour y remdier il suffit d'inclure dans notre programme le fichier p16f887.inc qui contient la dclaration EQU des tous les registres SFR et de tous les bits genre RP0, RP1 Attention, Tous les registres et les bits ont t dclars en MAJUSCULE
INCLUDE p16f887.inc
Bien que ce ne soit pas obligatoire, on va rajouter la directive LIST pour dfinir le processeur et dfinir le dcimal comme base par dfaut,
LIST p=16f887, r=dec
Le caractre (;) sert introduire un commentaire qui n'est pas interprt par le compilateur, Malgr le fait qu'on ait dfinit le dcimal comme base par dfaut. Il est conseiller de prendre l'habitude de prcder les nombres dcimaux par le prfix (.) A la fin, on peut mettre une instruction sleep pour placer le PIC en mode faible consommation. Il ne faut pas oublier de terminer le programme par la directive END On obtient le programme ci-dessous
Programme ram_direct.asm ;========================================================== ; Accs la RAM par l'adressage direct ;========================================================== INCLUDE p16f887.inc LIST p=16f887, r=dec __CONFIG 0x2007 , 0x23E4 __CONFIG 0x2008 , 0x3EFF ; ==== fin dclarations dbut programme ========== bsf STATUS,RP0 bcf STATUS,RP1 ; 01 : bank1 movlw 0x71 movwf OSCCON ; Oscillateur interne, Fosc=8MHz bcf bcf movlw movwf STATUS,RP0 STATUS,RP1 .35 20h ; 00 : Bank0
Microcontrleur PIC16F887
A.OUMNAD
33
bsf movlw movwf bcf bsf movlw movwf bsf movlw movwf sleep END
STATUS,RP0 'A' 0xA0 STATUS,RP0 STATUS,RP1 -.5 ;ou -D'5' 110h STATUS,RP0 35h 190h
; 01 : Bank 1
; 10 : bank 2
; 11 : Bank3
o Dmarrer MPLAB, commencer un nouveau fichier o Sauvegarder le sous le nom ram_direct.asm, Il est important de donner un nom au programme avant mme de le saisir car, en voyant l'extension (.asm), l'diteur de MPLAB sait que c'est un programme assembleur. Il reconnait les mots clef et les affiche avec des couleurs diffrentes ce qui permet une saisie plus agrable. o Saisir le programme o Le compiler : Project Quickbuild Nous disposons maintenant du programme excutable ram_direc.hex que nous pouvons implanter dans un PIC. Nous n'allons pas le faire car on ne pourra rien voir vu que ce programme ne fait aucune action externe. Par contre nous pouvons faire quelques investigations en simulation sous MPLAB. On peut visualiser la mmoire programme : View Program Memory
Figure III-4:
Sur la fentre qui s'affiche on peut tirer quelques enseignements : La colonne Opcode contient les codes machines 14 bits qui seront rellement implants dans la mmoire programme du PIC. La colonne Disassembly est l pour vrification.
Microcontrleur PIC16F887
A.OUMNAD
34
o On peut y voir que les directives ne font pas partie du programme excutable. C'est normal, les directives ne sont pas destines au PIC, elles sont interprtes par le compilateur, o L'instruction bcf STATUS,RP0 a t remplace par bcf 0x3, 0x5, c'est normal, l'unit de traitement du PIC ne reconnait pas les mots clef STATUS, RP0, RP1le compilateur les a remplacs par leur valeur qu'il a trouv dans le fichier p16f887.inc. On peut vrifier sur la Figure I-9 (page17) que 0x3 est l'adresse du registre STATUS et sur le Tableau I-1 (page19) que RP0 et le bit 5 de STATUS o Sur la ligne 10, on remarque que le compilateur a remplac le (-5) par (0xFB) qui est le complment 2 de 5. Ceci nous vite de le faire nous mme. o Les lignes 11 et 14 contiennent la mme instruction MOVWF 0x10. Alors que dans notre programme, la premire est : movwf 110h, et la deuxime est movwf 190h. C'est normal, avec l'adressage direct, le compilateur ne prend que 7 bits de l'adresse qu'on lui donne. Or 110h = 1 0001 0000 et 190h =1 1001 0000, si on prend 7 bits partir de la droite, on obtient 001 0000 = 10h dans les deux cas o Aprs la fin du programme toutes les positions de la mmoire programme contiennent le code machine 3FFFh = 11 1111 1111 1111. (Les positions de la mmoire programme qui n'on pas t flashs ont tous leurs bits gaux 1). Ce code machine correspond une instruction qui existe, addlw 0xFF. Quand le PIC a termin l'excution du programme que nous lui avons donn, il continue en excutant ces instruction. Ceci n'a aucune consquence grave. On peut l'viter en terminant le programme par l'instruction sleep qui arrte l'excution et place le PIC en mode faible consommation.. On peut maintenant simuler le programme pour voir s'il ralise les taches prvues. o Ouvrir la fentre qui visualise la mmoire RAM : view FileRegisters et reprer les cases mmoire 20h, A0h, 110h, 90h o Excuter le programme PAS PAS en cliquant chaque fois sur le bouton Step Into {}
A.OUMNAD
35
Changer le signe du contenu d'un registre F (F = -F) Soustraire la constante 33 de l'accumulateur W (W-33) (W Soustraire le contenu de la case mmoire 70h de l'accumulateur W avec rsultat dans W. [70h] W )
Exercice 8) (comp1.asm) Comparer les contenus des cases mmoire 6Fh et EFh, sil son gaux mettre { zro tous les bits de la case 16Fh sinon mettre 1 tous les bits de la case 1EFh Exercice 9) (comp2.asm) Comparer les contenus des cases mmoire 6Fh et EFh, si [6Fh] = [EFh] copier la lettre E dans la case mmoire 16Fh si [6Fh] > [EFh] copier la lettre S dans la case mmoire 16Fh si [6Fh] < [EFh] copier la lettre I dans la case mmoire 16Fh
III.4
Boucles de temporisation
On a souvent besoin d'introduire des temporisations pendant l'excution d'un programme. Le PIC dispose de 3 timers permettant de grer le temps avec prcision. On tudiera ces modules plus tard, pour l'instant, on va raliser des temporisations l'aide de simples boucles. L'ide est d'initialiser une variable une valeur donne et ensuite la dcrmenter en boucle jusqu' ce qu'elle atteigne 0. Connaissant le temps d'excution de chaque instruction, on peut calculer le temps que mettra le processeur pour terminer la boucle de dcrmentation
ici:
Les instructions movlw et movwf prennent 1 cycle chacune, L'instruction decfsz prend un cycle si elle ne saute pas et 2 cycles quand elle saute, L'instruction goto prend 2 cycles, chaque passage dans la boucle prend (1+2) cycle sauf le dernier qui prend 2 cycle T = 2 + (N1-1)3 + 2 = 3N1 + 1 cycles .
La valeur max de T est obtenue pour N1 = 0 (= 256). L'instruction decfsz dcrmente d'abords et teste ensuite. Dcrmenter 0 donne 255. Donc N1=0 quivaut N1=256, ce qui donne une temporisation max de Tmax= 769 cycles. Avec Fosc = 4 Mhz, 1 cycle = 4/Fosc = 1 s, ce qui donne une temporisation max de 769 s Pour faciliter l'utilisation de cette temporisation on va l'utiliser comme une fonction que l'on appellera tempo1. On note AN1 la case mmoire qui sert de compteur, il faut la dclarer au dbut avec la directive EQU. W sert de paramtre d'entre.
tempo1: t1: movwf decfsz goto AN1 AN1,f t1
Microcontrleur PIC16F887
return
A.OUMNAD
36
Cette fonction doit tre place aprs le programme principal. Chaque fois qu'on veut introduire une temporisation, on place une valeur dans W et appelle la fonction. W sert de paramtre la fonction.
movlw Call valeur tempo1
Pour le calcul il faut rajouter 2 cycles pour l'instruction call et 2 cycles pour l'instruction return. T1 = 3W + 5 cycle . 1 cycle = 4/Fosc
T2 = 2 + 2 + [W(t1+3)-1] + 2,
Microcontrleur PIC16F887
A.OUMNAD
37
Remarques : 1) La prcision de ces fonctions peut tre amliore en y insrant des instructions nop, dans ce cas il faut revoir les formules. 2) Si les Variables AN1, AN2 et AN3 sont place dans la zone commune, aucune prcaution particulire ne s'impose. Par contre, si on choisi de les placer ailleurs pour rserver la zone commune au programme principal, il faudra faire attention que le bank soit bien configur durant l'appel de ces fonctions. Si on choisit par exemple de les placer en bank0 aux positions 20h, 21h et 22h. Deux approches peuvent tre envisages: a. Une approche simple qui consiste se rappeler que les fonctions de temporisation utilisent le bank0. A chaque fois qu'on veut appeler une de ces fonctions, il faut se place dans ce bank avant de le faire. b. Une approche plus robuste consiste ajouter au dbut de chaque fonction, deux instructions bcf STATUS,RP0 et bcf STATUS,RP1 pour se placer dans le banko. Il faut aussi sauvegarder le registre STATUS au dbut de la fonction et le restituer la fin de sorte que, au retour de la fonction, on se retrouve dans le bank initial. Les instructions rajoutes doivent tre comptabilise dans les formules des temporisations.
Microcontrleur PIC16F887
A.OUMNAD
38
0 1
SORTIE ENTRE
TRISx
PORTx
Certains ports ont quelques particularits que nous allons dtailler ci-dessous,
IV.1
Le port A dsign par PORTA est un port bidirectionnel de 8 bits RA0 RA7. La direction de chaque bit est contrle par le bit correspondant du registre TRISA RA6 et RA7 peuvent tre configures en E/S numrique ou peuvent tre affectes au gnrateur dhorloge RA4 est une E/S numrique. En sortie, RA4 a une structure drain ouvert. Pour l'utiliser comme sortie, il faut ajouter une rsistance de pull-up externe. Le schma illustre (pour les non lectroniciens) le principe d'une sortie drain ouvert (ou collecteur ouvert) : si RA4 est positionne 0, l'interrupteur est ferm, la sortie est relie la masse, c'est un niveau bas. Si RA4 est place 1, l'interrupteur est ouvert, la sortie serait dconnecte s'il n'y avait pas la rsistance externe qui la place au niveau haut. RA0, RA1, RA2, RA3 et RA5 peuvent tre utilises soit comme E/S numriques soit comme entres analogiques. Quand elles sont configures en entre { laide de TRISA, le choix entre entre Analogique ou Numrique se fait laide des bits ANS0, ANS1, ANS2, ANS3 et ANS4 du registre ANSEL (bank3). o ANSi = 0 Lentre correspondante est configure en Numrique o ANSi = 1 Lentre correspondante est configure en Analogique
Vdd 1k RA4
A.OUMNAD
39
ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 RA5 N/A RA3 N/A RA2 N/A RA1 N/A RA0 N/A
Les broches configures en sortie fonctionnent toujours en numrique quelque soit l'tat des bits correspondant dans ANSELH. Il est toutefois fortement conseill de les configurer en numrique en mettant les bits ANSEL correspondant 0. En effet, toutes les instructions agissant sur registres, font une opration Lecture-Modification-Ecriture. Or une broche dont le bit ANSEL est gal 1 fonctionne en analogique dans le sens de l'entre, sa lecture retourne une valeur numrique mal dfinie. A part les instructions MOVWF et CLRF dont le rsultat est indpendant de l'tat actuel du registre, toutes les autres instructions donneront des rsultats errons
IV.2
Le port B dsign par PORTB est un port bidirectionnel de 8 bits RB0 RB7. La direction de chaque bit est contrle par le bit correspondant du registre TRISB. RB6 et RB7 fonctionnent toujours en E/S numriques RB0, RB1, RB2, RB3, RB4 et RB5 peuvent tre utilises soit comme E/S Numriques soit comme entres Analogiques. Quand elles sont configures en entre { laide de TRISB, le choix entre entre Analogique ou Numrique se fait { laide des bits ANS8, ANS9, ANS10, ANS11, ANS12 et ANS13 du registre ANSELH (bank3). o ANSi = 0 Lentre correspondante est configure en Numrique o ANSi = 1 Lentre correspondante est configure en Analogique ANSELH Entres de PORTB ANS13 ANS12 ANS11 ANS10 ANS9 0/1 0/1 0/1 0/1 0/1 RB5 N/A RB0 N/A RB4 N/A RB1 N/A RB3 N/A ANS8 0/1 RB2 N/A
Les broches configures en sortie fonctionnent toujours en numrique quelque soit l'tat des bits correspondant dans ANSELH. Il est toutefois fortement conseill de les configurer en numrique en mettant les bits ANSEL correspondant 0. Ceci pour les mmes raisons spcifies pour le registre ANSEL
IV.3
Le port C dsign par PORTC est un port bidirectionnel de 8 bits RC0 RC7. Ce port fonctionne toujours en numrique. La direction de chaque bit est contrle par le bit correspondant du registre TRISC
IV.4
Le port D dsign par PORTD est un port bidirectionnel de 8 bits RD0 RD7. Ce port fonctionne toujours en numrique. La direction de chaque bit est contrle par le bit correspondant du registre TRISD.
Microcontrleur PIC16F887
A.OUMNAD
40
IV.5
Le port E dsign par PORTE est un port bidirectionnel de 4 bits RE0 RE3. La direction de chaque bit est contrle par le bit correspondant du registre TRISE RE3 peut fonctionner soit en Entre numrique soit comme entre de Reset MCLR. Le choix se fait laide du switch MCLRE du registre de configuration CONFIG1 RE0, RE1, et RE2 peuvent tre utilises soit comme E/S numriques soit comme entres analogiques. Le contrle se fait { laide des bits ANS5, ANS6 et ANS7 du registre ANSEL (bank3). o ANSx = 0 Lentre correspondante est configure en Numrique o ANSx = 1 Lentre correspondante est configure en Analogique ANSEL ANS7 ANS6 ANS5 0/1 0/1 0/1 RE2 N/A RE1 N/A RE0 N/A
IV.6
Situation au dmarrage
Au dmarrage : Tous les ports sont configurs en entre Les entres Analogique/Numriques sont configurs en analogique
IV.7
Programmes types
IV.7.1.1
Prparation
Regardons laquelle des trois fonctions tempo1, tempo2 ou tempo3 convient pour obtenir T= 0.5 s = 500 000 s. Avec Fosc = 8 MHz, on a TCY = 4 / Fosc = 0.5 s
Avec tempo1 on obtiendrait au maximum 773 0.5s = 386.5 s, largement insuffisant Avec tempo2 on obtiendrait au maximum 773 0.5s = 98563 s, encore insuffisant Avec tempo3 on peut aller jusqu' 50463237 0.5s = 25.232 s , largement suffisant Le paramtre de tempo3 pour avoir 0.5s est dtermin par : (197122 W + 5 ) 0.5 s = 500000s. On obtient W = 5.073, on prend W=5 qui donne une temporisation de 0.493s Pour les switchs de configuration nous utiliseront la configuration gnrique, (I.4.1, page14)
Microcontrleur PIC16F887
__CONFIG 0x2007 , 0x23E4 __CONFIG 0x2008 , 0x3EFF
A.OUMNAD
41
Pour choisir Fosc = 8 Mhz, il faut configurer le registre OSCCON (bank1) (I.3.4.1, page 11) OSCCON = 0 111 000 1 = 0x71
movlw movwf 0x71 OSCCON
Il faut configurer la broche RA3 en Analogique l'aide du registre ANSEL (bank3) (IV.1,IV.1, page38) et en sortie l'aide du registre TRISA (bank1) Pour le corps du programme, rien de sorcier. On allume en plaant RA3 1, on attend 0.5s, on teint en plaant RA3 0, on attend 0.5s et on recommence indfinitivement. Voici ce que a donne :
LED-RA3.asm INCLUDE LIST __CONFIG __CONFIG INCLUDE AN1 EQU AN2 EQU AN3 EQU
p16f887.inc p=16f887, r=dec 0x2007 , 0x23E4 0x2008 , 0x3EFF mesmacros.asm 0x20 ; ces 3 positions mmoires 0x21 ; sont utilises par les 3 0x22 ; compteurs de tempo3
;============================= fin dclarations, dbut programme ========== BANK1 movlw 0x71 movwf OSCCON ; Oscillateur interne, Fosc=8MHz bcf TRISA,3 ; RA3 en sortie BANK3 bcf ANSEL,ANS3 ; RA3 numrique BANK0 ici: bsf PORTA,3 ; allumer movlw 6 call tempo3 ; attendre 0.6 s bcf PORTA,3 ; teindre movlw 6 call tempo3 goto ici ; recommencer ;================== fin programme, dbut dfinition fonctions ========== tempo3: movwf AN3 t3: decfsz AN1,f goto t3 decfsz AN2,f goto t3 decfsz AN3,f goto t3 return END
Saisir ce programme, le sauvegarder sous le nom clignoled.asm, le compiler, vrifier qu'il n'y a pas d'erreur, l'implanter sur un PIC. Brancher comme le montre la figure ci-dessous, vrifier.
Microcontrleur PIC16F887
5V
A.OUMNAD
42
1k
LED
Vous avez sans doute remarqu qu'il n'est pas trs commode de saisir la fonction tempo3 la fin du programme chaque fois qu'on en a besoin. Nous allons placer toutes les fonctions couramment utilises dans un fichier mesfonctions.inc qu'il suffira d'inclure aprs le programme principal juste avant la directive END Plus tard, chaque fois que nous crirons de nouvelles fonctions susceptibles d'tre rutilises, nous les ajouterons au fichier mesfonctions.inc. Un listing de ce fichier est prsent en fin de document. L'extension (.inc) choisie pour les fichiers inclure n'est pas obligatoire. Les extensions (.asm) ou (.txt) conviennent parfaitement Ce programme eut tre lgrement simplifi. Au lieu d'allumer la LED, attendre, teindre la LED, attendre, on peut faire: changer l'tat de la LED, attendre. Pour cela, on utilise la proprit d'inversion de l'oprateur XOR: X 1 Exercice 10) LED-xor.asm Donner la version du programme qui utilise l'oprateur XOR pour changer l'tat de la LED Exercice 11) Dans les deux programmes prcdents, supprimer l'instruction
bcf ANSEL,ANS3 ; RA3 numrique
Microcontrleur PIC16F887
A.OUMNAD
Vrelai Vdd=5V
43
1k
Relai
Lampe
2N2222
Exercice 12)(patern.asm) Avec Fosc = 8Mhz, donner le Programme qui utilise les instructions bsf, bcf et nop pour gnrer le signal suivant sur la sortie RB0. La largeur minimale d'une impulsion est 0.5s
Exercice 13) (scrutation.asm) Programme qui surveille l'tat de l'entre RA1 l'aide de l'instruction btfsc ou btfss : - Si RA1 = 0 faire RA3 = 1, PORTB = 00001111 - Si RA1 = 1 faire RA3 = 0, PORTB = 11110000 Exercice 14) (print.asm) Transfrer le contenu de la mmoire EEPROM de donnes sur PORTB. Pour chaque octet, on utilisera le protocole suivant: o Copier un octet sur PORTB o Gnrer une impulsion ngative (STROBE) de largeur 2s sur RA0 o Attendre une impulsion ngative (ACK) de largeur inconnue sur RA1 Exercice 15) Compteur dimpulsions 8 bits Programme qui : Allume la LED branche sur RB3 Compte 150 impulsions sur l'entre RA4 (la case mmoire 70h servira de compteur) Eteint la LED branche sur RB3
Microcontrleur PIC16F887
A.OUMNAD
44
IV.8
a b g e d c
Un afficheur 7 segments est constitu de 7 LEDs organises comme indiqu sur la figure ci-contre. Les segments sont appels a, b, c, d, e, f et g. Pour minimiser le nombre de broches de l'afficheur, les anodes ou les cathodes sont relies intrieure de l'afficheur. On parle alors d'afficheur anode commune ( AC) ou d'afficheur cathode commune (CC)
a b c
d e
AC
CC
a b c
d e
Cathode Commune
Anode commune
Pour piloter un afficheur sept segments, on a besoin d'un dcodeur bcd-sept segments pour convertir le code bcd du chiffre afficher en une combinaison de 7 bits pour piloter les sept entres a, b, c, d, e, f, et g de l'afficheur. Pour un afficheur cathode commune (figure ci-dessous), si on veut afficher le chiffre 4, le dcodeur doit convertir le code bcd de 4 (DCBA = 0100) en code 7 segment (gfedcba = 1100110) pour allumer les segments b, c, f et g
b A Dcodeur c B Bcd d C 7segments e D f a
CC
Figure IV-5 : pilotage d'un afficheur cathode commune
Pour un afficheur anode commune (figure ci-desso), la commande se fait par niveau bas, pour allumer un segment, il faut lui appliquer 0. Pour afficher le chiffre 4, le dcodeur doit convertir le code bcd de 4 (DCBA = 0100) en code 7 segment (gfedcba = 0011001) pour allumer les segments b, c, f et g
Microcontrleur PIC16F887
A.OUMNAD
Vcc
45
a b c d
A B C D
Avec le PIC, on n'a pas besoin de dcodeur bcd 7 segments. Le dcodage peut se faire par programme. On va crire un programme qui pilote un afficheur anode commune par l'intermdiaire du port C. Dec g f e d c b a 5V 0 1 0 0 0 0 0 0 40h AC 1 1 1 1 1 0 0 1 79h a 2 0 1 0 0 1 0 0 24h RC0 a b 3 0 1 1 0 0 0 0 30h RC1 b f 4 0 0 1 1 0 0 1 19h c RC2 5 0 0 1 0 0 1 0 12h d g PIC RC3 6 0 0 0 0 0 1 0 02h e 7 1 1 1 1 0 0 0 78h RC4 e c 8 0 0 0 0 0 0 0 00h f RC5 9 0 0 1 0 0 0 0 10h d g RC6 A 0 0 0 1 0 0 0 08h Figure IV-7: pilotage d'un afficheur AC par un PIC b 0 0 0 0 0 1 1 03h C 1 0 0 0 1 1 0 46h Le plus important est de raliser la fonction dcodage. Le tableau d 0 1 0 0 0 0 1 21h ci-dessous montre, pour chaque chiffre hexadcimal, le code 7 E 0 0 0 0 1 1 0 06h segments qu'il faut appliquer l'afficheur. Pour afficher le chiffre F 0 0 0 1 1 1 0 0Eh 2, il faut envoyer 00100100 = 24h sur PORTC. Le bit de plus fort poids de PORTC n'est pas utilis, on va le considrer toujours gal 0. On aurait pu l'utiliser pour commander le segment p (point) disponible sur certains afficheurs. La fonction ci-dessous permet de faire le transcodage entre le code bcd d'un chiffre et son code 7 segments. Son utilisation est simple, on place un chiffre dans W, on appelle la fonction qui retourne le code 7 segment dans W. La fonction utilise le principe du goto calcul qui consiste changer la valeur du compteur programme PCL. On va juste rappeler que quand le PIC est en train d'excuter une instruction, PCL contient (pointe) l'adresse de la ligne suivante. Quand le PIC termine une instruction, il va excuter l'instruction pointe par PCL et ce dernier s'incrmente automatiquement. D'o le nom de compteur programme. Si on appelle cette fonction avec W=4, Le PIC commence excuter l'instruction, addwf PCL,f et PCL pointe sur la ligne suivante retlw 40h. Or, l'instruction addwf PCL,f demande au PIC de rajouter le contenu de W celui de PCL. Comme W=4, cela revient dire au PCL d'aller pointer 4 lignes plus loin, c..d. sur l'instruction retlw 19h. Quand le PIC termine l'instruction en cours, il se branche
Microcontrleur PIC16F887
A.OUMNAD
46
directement l'instruction retlw 19h qui lui dit de retourner au programme appelant en ramenant la valeur 19h dans W. Il se trouve que 19h est le code 7 segments du chiffre 4
Bcd7seg: Addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw PCL,f 40h 79h 24h 30h 19h 12h 02h 78h 00h 10h 08h 03h 46h 21h 06h 0Eh ; ajouter le contenu de W au Compteur programme
Pour l'criture de la fonction, on peut utiliser la directive DT qui permet de gnrer une suite d'instructions retlw. La fonction devient:
Bcd7seg: Addwf DT PCL,f ; ajouter le contenu de W au Compteur programme 40h,79h,24h,30h,19h,12h,02h,78h,00h,10h,08h,03h,46h,21h,06h,0Eh
Exercice 16)aff7seg.asm Programme qui affiche un compteur modulo 16 (de 0 F) sur l'afficheur 7 segments avec une temporisation voisine d'une seconde Exercice 17)(aff7seg-dec.asm) Modifier le programme aff7seg.asm pour obtenir un compteur modulo 10
LM016L
IV.9
RS RW E 4 5 6
Le mode 8 bits utilise tous les bits du port. Les donnes sont changes avec l'afficheur octet par octet.
1 2 3
Le mode 4 bits utilise seulement les 4 bits de poids fort D7 D6 D5 D4, les autres ne sont pas branchs. Les donnes sont changes octet par octet, en commenant par le plus fort poids. Une donne envoye vers l'afficheur peut tre soit un caractre afficher soit une commande interprter (effacer cran, changer de ligne ). Pour faire la diffrence entre les deux, on utilise la broche RS: o RS = 0 => la donne envoye est une commande o RS = 1 => la donne envoye est un caractre afficher
7 8 9 10 11 12 13 14
D0 D1 D2 D3 D4 D5 D6 D7
L'afficheur LCD deux lignes le plus courant dispose d'un port de 8 bits D7 D6 D5 D4 D3 D2 D1 D0, Il a deux modes de fonctionnement:
Microcontrleur PIC16F887
A.OUMNAD
47
Pour envoyer un octet (ou octet) vers l'afficheur, il faut le placer sur le port de donnes, positionner la broche RS pour prciser s'il s'agit d'une commande ou d'un caractre afficher. Ensuite il faut envoyer une impulsion positive d'au moins 450 ns sur la broche E. A la mise sous tension, Le LCD dmarre en mode 8 bits. Mme si seulement 4 bits sont branchs, les premire commande sont envoy en mode 8 bits o seuls les 4 bits de poids fort comptent. Avant d'utiliser l'afficheur il faut l'initialiser en lui en voyant quelques commandes. C'est l'tape la plus dlicate. Ensuite l'utilisation est trs simple L'afficheur 2 lignes dispose d'une mmoire d'affichage (DD RAM) de 80 caractres organis en deus lignes. La fentre d'affichage ne peut afficher que 16 caractre de chaque ligne. On peut utiliser la commande Cursor or display shift pour dplacer l'affichage gauche ce qui revient dplacer la fentre droite. Les adresse du premier caractre de chaque lignes son respectivement 0 et 64. Pour les afficheurs quatre lignes les adresses du premier caractre de chaque ligne sont 0, 64, 20 et 84.
Microcontrleur PIC16F887
A.OUMNAD
48
Envoyer trois fois de suite la commande Function Set, pour demander le mode 8 bits en n'utilisant que les 4 bits de poids fort. Chaque commande sera suivie d'un dlai de 4.1 ms. 0011---- (3h) E= 4.1 ms 0011---- (3h) E= 4.1 ms 0011---- (3h) E= 4.1 ms Maintenant on va utiliser la commande Function Set, mais pour demander le mode 4 bits 0010 ----(2h) E= 40s A partir d'ici on est en mode 4 bits. Chaque commande doit tre envoye en deux phases. On envoie le octet de poids fort, on valide par une impulsion sur E, on envoie le octet de poids faible, on valide par une impulsion sur E, on attend le dlai ncessaire On envoie la commande Function Set : Mode 4bits, afficheur deux lignes, fonte 57: 0010 1000(38) 0010 E= 1000 E= 40s On envoie la commande Display ON/OFF. (Display: ON, Cursor: votre choix, Blink: votre choix) Soit la commande 0000 1100(0Ch) 0000 E= 1100 E= 40s Envoyer la commande Entry mode set : Ecriture de gauche droite, le curseur se dplace vers la droite aprs l'affichage d'un caractre : 0000 0110(06h) 0000 E= 0110 E= 40s Envoyer la commande Clear Screen : 0000 0001(01h) 0000 E= 0001 E= 1.64ms
Commande Clear Screen Return home Entry mode set D7 D6 D5 D4 D3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D2 D1 D0 0 0 1 0 1 I/D 1 X S Description Efface cran, curseur dbut premire ligne Curseur en dbut de premire ligne Sens de l'affichage I/D=1 gauche droite, I/D=0 droite { gauche S=0 curseur se dplace, S=1 texte se dplace D: affichage ON/OFF, C: curseur ON/OFF, B: clignotement ON/OFF Dcale le curseur ou tout l'affichage droite ou gauche S/C=0 dcaler curseur, S/C=1 dcaler affichage R/L=0 vers la gauche, R/L=1 vers la droite Dfinit taille de l'interface, de l'afficheur est des caractres DL=0 mode 4 bits, DL=1 mode 8 bits N=0 afficheur 1 ligne, N=1 afficheur 2 ou 4 lignes F=0 fonte 5x 7, F=1fonte 5x 10. Dlai 1,64ms 1,64ms 40 s
0 0
0 0
0 0
0 1
C X
B X
40 s 40 s
S/C R/L
Function set
DL
40 s
RAM RAM
0 1
A5 A4 A3
A2 A2 A2
A1 A0 A1 A0 A1 A0
Dfinit la position courante dans la CG RAM qui peut servir 40 s la cration de nouveaux caractres Dfinit la position courante dans la mmoire d'affichage DD 40 s RAM. L'adresse de premire position de la 2me ligne est 64 Lit le drapeau BF et l'dresse courante (position curseur) BF=0 afficheur prt, BF=1afficheur occup 1 s
A6 A5 A4 A3
Microcontrleur PIC16F887
A.OUMNAD
49
LCD
R/W
RS
D7
D6
D5
D4 D3 D2 D1 D0
PIC16F887
Figure IV-8 : Commande d'un afficheur LCD en mode 4 bits
Exercice 18) LCD.asm Programme qui affiche la chaine PIC16F877 sur la premire ligne et les nombres 200 et 2011 sur la 2me ligne
Microcontrleur PIC16F887
A.OUMNAD
50
V.1
Le PIC 16F887 dispose de 256 octets de mmoire EEPROM de donne. Son implantation physique commence ladresse absolue 2100h. Mais pour y accder partir d'un programme, on utilise ladressage relatif par rapport { la premire position. La premire position aura ladresse 0, la deuxime aura ladresse 1, et la dernire aura ladresse 255. Pour accder la EEPROM de donnes, on utilise 4 registres particuliers : EEADR : registre dadresse (relative) EEDAT : registre de donne EECON1 : registre de contrle EECON2 : 2me registre de contrle
r/w(x) U
Le registre EECON1 :
EEPGD
WRERR
WREN
WR
RD
EEPGD : Accs la mmoire EEPROM de donnes ou EEPROM Programme 0 : EEPROM de donnes 1 : EEPROM programme (flash) WRERR : Erreur d'criture 0 : Pas d'erreur, l'criture s'est termine normalement 1 : Une erreur s'est produite, l'criture s'est arrte prmaturment WREN : Validation de l'criture dans l'EEPROM 0 : Ecriture interdite 1 : Ecriture autorise WR : Write Enable. Ce bit doit tre mis 1 pour dmarrer l'criture d'un octet. Il est remis zro automatiquement la fin de l'criture. Ce bit ne peut pas tre mis zro par une instruction.
Microcontrleur PIC16F887
A.OUMNAD
51
RD : Read Enable. Ce bit doit tre mis 1 pour dmarrer la lecture d'un octet. Il est remis zro automatiquement la fin de la lecture. Ce bit ne peut pas tre mis zro par une instruction Remarque : Les bits WREN et WR ne peuvent tre positionns dans la mme instruction. Le bit WR ne peut tre positionn que si le bit WREN a t positionn avant.
V.2
Pour lire le contenu dune position de la mmoire EEPROM, on place ladresse dans le registre EEADR, on lance lopration de lecture { laide du bit RD du registre EECON1, la donne dsire est tout de suite disponible dans le registre EEDAT :
1) Mettre le bit EEPGD 0 pour pointer sur la EEPROM de donne, 2) Placer ladresse relative de la position { lire dans EEADR, 3) Mettre le bit RD 1 pour dmarrer la lecture. Ce bit revient 0 automatiquement tout de suite
aprs le transfert de la donne vers EEDAT, (moins d'un cycle),
4) Traiter la donne disponible dans EEDAT, 5) Recommencer au point 2 si on a d'autres donnes lire,
V.3
Pour crire une donne dans une position de la mmoire EEPROM, on place ladresse dans le registre EEADR, la donne dans le registre EEDAT, on lance lopration dcriture { laide du bit WR de EECON1 et du registre EECON2. La donne prsente dans EEDAT est alors copie dans la EEPROM. Cette opration dure 10 ms. A la fin de l'criture le bit WR revient zro automatiquement, le drapeau EEIF est lev ce qui peut dclencher l'interruption EEI si elle a t valide au pralable :
1) 2) 3) 4) 5)
Interdire les interruptions (si elles ont t valides avant : bit INTCON.GIE) Mettre le bit EEPGD 0 pour pointer sur la EEPROM de donne Positionner le bit WREN pour autoriser l'criture dans la EEPROM de donne Placer ladresse relative de la position crire dans EEADR Placer la donne crire dans le registre EEDAT
6) - Ecrire 55h dans EECON2 (commande de process hardwares) 7) - Ecrire AAh dans EECON2 (commandes de process hardwares) 8) - Positionner le bit WR pour dmarrer l'opration d'criture, 9) Attendre que WR revienne 0 ( 10ms) 10) Recommencer au point (4) si on a d'autres donnes crire,
Les tapes 6, 7 et 8 doivent obligatoirement tre excutes dans cet ordre. L'ordre des tapes 1 5 n'a pas d'importance. A la fin de l'criture de chaque octet, le drapeau d'interruption EEIF passe 1. L'interruption EEI est dclenche si elle a t valide au pralable par les bits GIE, PEIE et EEIE. Le drapeau EEIF doit tre remis 0 par programme. L'interruption EEI peut sortir le PIC du mode sleep. Voir Erreur ! Source du renvoi introuvable., page Erreur ! Signet non dfini. Exercice 19) Ecrire l'alphabet dans l'EEPROM de donne partir de la position 20h
Microcontrleur PIC16F887
A.OUMNAD
52
Exercice 20)EEPROM vers la RAM Programme qui utilise la directive DE pour crire la chane "BONJOUR CHER AMI" dans la EEPROM de donnes partir de la position 2140h. Le programme doit ensuite lire les caractres de cette chaine partir de la EEPROM et les copier dans la RAM partir de la position 110h. Exercice 21) Chercher minimum dans la EEPROM Programme qui cherche la valeur minimale des 10 premires cases mmoire de la EEPROM et l'affiche sur l'afficheur LCD
V.4
Cette mmoire de 8 1024 mots de 14 bits sert stocker le programme. Elle est aussi accessible par programme, elle peut donc tre utilise comme une extension de la mmoire EEPROM de donnes. Elle est non volatile et reprogrammable souhait. Chaque position de 14 bits contient une instruction. L'emplacement du programme peut se situer n'importe quel endroit de la mmoire. Cependant, il faut savoir que lors de la mise sous tension ou suite un RESET, le PIC commence l'excution l'adresse 0000H. De plus, lorsqu'il y a une interruption, le PIC va l'adresse 0004H. Il est donc ncessaire de bien organiser lemplacement du programme principal, des programmes dinterruption et des donnes affin dviter tout chevauchement qui serait de toute vidence fatal au bon droulement de lapplication. L'accs la mmoire flash durant la phase d'excution se fait de la mme faon que l'accs la EEPROM de donnes, l'exception des points suivant : Le bit EEPGD doit tre plac 1 Le registre EEADR (8 bits) seul ne suffit pas adresser les 8k de mmoire programme, on lui accole le registre EEADRH dans lequel il faut crire la partie haute de l'adresse. On obtient ainsi les 13 bits ncessaires pour adresser 8k. Le registre EEDAT (8 bits) seul ne suffit pas pour contenir les 14 bits contenus dans une position de la mmoire programme. On lui accole le registre EEDATH qui contiendra les 6 bits suprieurs.
Il faut insrer deux instructions NOP dans les cycles de lecture/criture. Pendant la phase d'criture, le processeur arrte l'excution des instructions. Il n'est donc pas ncessaire d'attendre la fin de l'criture pour continuer car ceci se fait automatiquement, la fin de l'criture, l'excution reprend l'instruction qui suit le 2me NOP,
V.5
1) 2) 3) 4) 5) 6)
Remarques: a) Les nomenclatures EEADRH:EEADR et EEDATH:EEDAT sont des critures papier, dans un programme, tous les registre font 8 bits et chaque registre doit tre trait part. Pour crire l'adresse 1856h dans le doublet EEADRH:EEADR, il faut placer 18h dans EEADRH et 56h dans EEADR. Si l'adresse est exprime en dcimal, le mieux est d'utiliser les directive LOW et HIGH
Microcontrleur PIC16F887
A.OUMNAD
53
pour isoler la partie basse et la partie haut. Par exemple, si on veut placer la valeur dcimale 3579 dans le doublet EEDATH:EEDAT, il faut crire:
movlw movwf movlw movwf LOW EEDAT HIGH EEDATH .3579 .3579
b) Quand on crit squentiellement dans la mmoire programme en incrmentant EEADR chaque fois. Il faut faire attention car, au dbordement de EEADR (255 0), EEADRH ne s'incrmente pas automatiquement. Il faut le faire soit mme:
incfsz EEADR,f goto $+2 incf EEADRH,f ~~~~~~~~
V.6
1) 2) 3) 4) 5) 6) 7) 8) 9)
V.7
La mmoire programme est organise par blocs de 16 mots constitu chacun de deux blocs de 8 mots. Si on observe les bits de poids faible du registre d'adressage EEADR, on remarque: Un bloc de 16 mots commence toujours 0000 et se termine 1111, Un bloc de 8 mots commence toujours 000 et se termine 111 Quand que nous crivons un mot EEDATH:EEDAT dans la mmoire programme avec la procdure cite ci-dessus, il n'est pas flash directement dans la mmoire permanente. Il est d'abord stock dans une mmoire tampon de type RAM (buffer) qui a une capacit de 8 mots dont les adresses de 0 7 correspondent aux 3 bits les plus faibles du registre EEADR. C'est quand on crit dans la 8me position du buffer (EEADR=xxxxx111), que la totalit du buffer est flashe dans la mmoire programme. Quand-il s'agit de la premire moiti du bloc de 16 mots, le processeur commence par effacer la totalit du bloc de 16 avant de flasher le contenu du buffer dans la premire moiti du bloc. Quand il s'agit de la deuxime moiti, le processeur se contente de flasher car le bloc de 16 a dj t effac lors du flashage de sa premire moiti.
EEADR
000 001 010 011 100 101 110 111 xxxx0000 xxxx0001 xxxx0010 xxxx0011 xxxx0100 xxxx0101 xxxx0110 xxxx0111 xxxx1000 xxxx1001 xxxx1010 xxxx1011 xxxx1100 xxxx1101 xxxx1110 xxxx1111 xxxx0000 xxxx0001 xxxx0010 xxxx0011 xxxx0100 xxxx0101 xxxx0110 xxxx0111 xxxx1000 xxxx1001 xxxx1010 xxxx1011 xxxx1100 xxxx1101 xxxx1110 xxxx1111
Buffer de 8 mots
Microcontrleur PIC16F887
A.OUMNAD
54
Effacer la mmoire programme revient mettre tout les bits 1. Flasher le buffer dans un bloc de 8 mot ne signifie pas le copier, en fait le processeur fait un ET bit par bit entre le buffer et le bloc de 8 mots. C'est pour cette raison que l'effacement pralable et obligatoire. Si on commence par crire dans la deuxime moiti d'un bloc de 16 qui n'a pas encore t effac, on obtient un ET entre ce qu'on a crit et ce qu'il y avait avant. Chaque fois que le buffer de 8 mots est flash dans la mmoire programme, le drapeau d'interruption EEIF passe 1. L'interruption EEI se dclenche si elle a t valide au pralable par les bits GIE, PEIE et EEIE. Le drapeau EEIF doit tre remis 0 par programme. L'interruption EEI peut sortir le PIC du mode sleep. Voir Erreur ! Source du renvoi introuvable., page Erreur ! Signet non dfini.. La tche d'effacement d'un bloc de 16 se prolonge pendant 4ms durant lesquelles le processeur arrte d'excuter le programme. A la fin, l'excution reprend normalement l'instruction qui suit le 2me NOP. Si on crit 8 mots M1, M2 M8 partir du dbut d'un bloc de 16, EEADR=xxxx0000. Au moment o l'on crit le mot M8 dans la position EEADR=xxxx 0111, tous le bloc de 16 est efface, ensuite les 8 mots seront flashs dans le premier bloc de 8. Le deuxime bloc de 8 reste vide. Si on commence crire dans la deuxime moiti d'un bloc de 16 sans toucher la premire moiti. Au moment de l'criture dans la dernire position EEADR=xxxx1111, le buffer est flash sans que bloc ne soit effac. Le rsultat obtenu correspond un ET entre ce qu'on a crit et ce qu'il y avait dans le bloc avant. Si on crit un ou plusieurs mots sans toucher la position EEADRH:EEADR=xxxxxxxx xxxxx111 correspondant au 8me mot du buffer, rien ne se passe, les mots resteront dans le buffer. La mmoire programme n'est pas modifie. Si on crit un seul mot M dans dernire position du premier bloc. EEADR=xxxx0111, le bloc de 16 mots sera efface et le buffer de 8 mots sera flash. On se retrouve avec un bloc de 16 qui contient 7 mots indtermins suivis du mot M suivi 8 mots 3FFFh (effacs) Si par exemple on crit l'alphabet (1 caractre par position) partir de la position 1020h. Les caractres de A H seront crits dans le bloc [ 1020h, 1027h]. Les caractres de I P seront crits dans le bloc [1028h, 102Fh]. Les caractres de Q X seront crits dans le bloc [ 1030h, 1037h]. les caractres Y et Z ne seront pas crit dans la mmoire programme, car le programme s'arrte aprs l'criture de Z dans la position 001 du buffer. Le buffer ne sera pas flash car il faut crire dans la position 7=111 pour dclencher le flashage. Pour y remdier, le plus simple et d'crire 32 caractres quiet ignorer les 6 caractres qui suivent le Z Exercice 22) alphabet_2memprog.asm Ecrire l'alphabet dans la mmoire programme partir de la position 1020h Exercice 23) memprog2ram.asm Programme qui lit 20 positions de la mmoire programme dbutant la position 12FAh et les copie dans la RAM partir de la position 110h. Attention : Le contenu dune position mmoire programme permet de remplir 2 positions de la RAM. Le dbordement de EEADR naffecte pas EEADRH
Microcontrleur PIC16F887
A.OUMNAD
55
Toutes les interruptions peuvent tre valides/interdites par le bit INTCON,GIE Toutes les interruptions priphriques peuvent tre valides/interdites par le bit INTCON,PEIE Chaque interruption peut tre valide/interdite par son bit de validation individuel En rsum, pour valider une interruption priphrique (par exemple), il faut positionner 3 bits, GIE, PEIE et le bit individuel de linterruption.
VI.1
Lorsque l'vnement dclencheur d'une interruption intervient, alors son drapeau passe 1 (lev). Si l'interruption a t valide au pralable (bits de validations = 1), elle est alors dclenche: Le programme arrte ce qu'il est en train de faire et va excuter la procdure d'interruption qui se trouve l'adresse 4. Le droulement se fait comme suit: Le processeur termine l'instruction qu'il est en train d'excuter, Le bit GIE est plac "0" pour inhiber toutes les interruptions (afin que le PIC ne soit pas drang pendant l'excution de la procdure d'interruption). l'adresse contenue dans le PC (Program Counter) est sauvegarde dans la pile, puis remplace par la valeur 0004 (adresse de la routine d'interruption). Le processeur excute la routine d'interruption. A la fin de la procdure d'interruption (instruction RETFIE), le bit GIE est remis 1 (autorisant ainsi un autre vnement). Le contenu du PC est recharg partir de la pile ce qui permet au programme de reprendre l o il s'est arrt Deux remarques importantes sont faire :
Microcontrleur PIC16F887
A.OUMNAD
56
Le drapeau reste { ltat haut mme aprs le traitement de linterruption. Par consquent, il faut toujours le remettre "0" la fin de la routine d'interruption sinon l'interruption sera dclenche de nouveau juste aprs l'instruction RETFIE Seul le PC est empil automatiquement. Si cela est ncessaire, les registres W et STATUS doivent tre sauvegards en RAM puis restaurs la fin de la routine pour que le microcontrleur puisse reprendre le programme principal dans les mmes conditions o il l'a laiss.
VI.2
VI.3
Cette interruption est provoque par un changement d'tat sur l'entre RB0 de PORTB. Celle-ci doit tre programme en entre. En plus de son bit de validation INTE et son drapeau INTF, elle est gre aussi par le bit INTEDG (OPTION_REG) qui dtermine le front sur lequel l'interruption se dclenche, 1=montant, 0=descendant. Cette interruption peut sortir le PIC du mode sleep si le bit INTE a t positionn au pralable.
VI.4
L'interruption IOCB
Cette interruption est provoque par un changement d'tat sur nimporte laquelle des entres de PORTB. Le front n'a pas d'importance. Elle doit tre valide (globalement) par les bits GIE et RBIE, et individuellement (pour chaque entre de PORTB) par les bits du registre IOCB (bank1) : IOCBx = 0 interruption IOCB inhibe sur lentre RBx IOCBx = 1 interruption IOCB valide sur lentre RBx
Microcontrleur PIC16F887
A.OUMNAD
57
Attension: Le drapeau RBIF ne peut tre remis zro sans la lecture pralable de PORTB (MOVF PORTB,w). Si on ne veut pas modifier le contenu de W, on peut copier PORTB sur lui-mme (MOVF PORTB,f).
VI.5
Les autres interruptions seront abordes au moment de l'tude des modules qui les dclenchent. Exercice 24) Int.asm Chaque fois qu'une transition 10 apparait sur l'entre RB0, la LED branche sur la sortie RB1 clignote 5 fois au rythme de la seconde. PIC
RB0 RB1 1k
LED
Figure VI-1:
Exercice 25) Div-freq.asm Programme qui ralise une division de frquence par une valeur DIV qui sera lue sur PORTD. Le signal d'entre est appliqu sur l'entre RB0. Le signal de sortie est gnr sur la sortie RB1. On utilisera l'interruption IOCB pour dtecter les transitions du signal d'entre.
PIC
RB0 PORTD RB1
L'algorithme est simple. On compte les transitions du signal d'entre. Chaque fois qu'on a compt DIV transitions, on change l'tat du signal de sortie.
Exercice 26) Diviseur de frquence 16 bits Refaire le programme mais cette fois avec la possibilit d'avoir DIV suprieur 255. Le compteur 16 bits sera lu sur les ports PORTC et PORTD PIC
RB0 PORTD RB1 PORTC
DIV
Microcontrleur PIC16F887
A.OUMNAD
58
RBPU
T0CS
1 0
INTEDG
T0CS
T0SE
PSA
PS2
PS1
PS0
TH
PSA
1 Prdiviseur programmable 0
Fosc/4
PS2 PS1 PS0
Microcontrleur PIC16F887
A.OUMNAD
59
En rsum, chaque fois que le compteur complte un tour, le drapeau T0IF se lve. Si on note TH la priode de l'horloge source, T0 l'horloge de TMR0 et TF0 le temps qui spare 2 levs de drapeau successifs : Sans prdiviseur : TF0 = 256 T0 = 256 TH Avec prdiviseur : TF0 = 256 T0 = 256 (DIV TH) Si on rajoute une variable de comptage CTR dans le programme les levs de drapeau on obtient : T = CTR TF0 = CTR 256 (DIV TH)
; Oscillateur interne, Fosc=8MHz ; RB0 en sortie ; interdire les interruption ; TOCS=0, PSA=0, div=32
debut: 122 CTR INTCON,T0IF $-1 INTCON,T0IF CTR,f ici B'00000001' PORTB,f debut ; CTR = 122 ; attendre drapeau de dbordement de TMR0 ; baisser le drapeau ; compter le nombre de dbordement ; le compte n'y est pas ; masque de RB0 ; inverser RB0 ; recommencer
ici:
Microcontrleur PIC16F887
A.OUMNAD
60
LED-TMR0-int.asm ;======================================================================= ; Programme qui fait clignoter une LED branche sur RB0 avec une temporisation voisine ; de 0.5s obtenue par l'interruption de TMR0. Fosc = 8 MHz => Tcy = 0.5s ; 500 000 s = CTR DIV 256 0.5s => CTR = 61, DIV = 64 ;====================================================================== ERRORLEVEL -302 ; pour masquer les messages de compilation INCLUDE p16f887.inc INCLUDE mesmacros.inc LIST p=16f887, r=dec __CONFIG 0x2007 , 0x23E4 __CONFIG 0x2008 , 0x3EFF CTR equ 0x70 org goto 0 main ; la mise sous tension, ou au RESET ; aller au programme principal
; ============= sous programme d'interruption ======================= org 4 bcf INTCON,T0IF ; baisser le drapeau decfsz CTR,f ; compter le nombre de dbordement retfie ; le compte n'y est pas movlw 1 ; masque de RB0 xorwf PORTB,f ; inverser RB0 movlw 61 ; CTR = 61 movwf CTR retfie ;==== Programma principal ============ main: BANK1 movlw 0x71 movwf OSCCON ; Oscillateur interne, Fosc=8MHz bcf TRISB,0 ; RB0=LED en sortie movlw B'00000101' movwf OPTION_REG ; TOCS=0, PSA=0, div=64 BANK0 bcf PORTB,0 ; LED teinte au dpart movlw 61 movwf CTR ; CTR = 61 bsf INTCON,GIE ; valider interruptions bsf INTCON,T0IE ; valider interruption T0I goto $ ; rester plant ici attendre l'interruption END
Microcontrleur PIC16F887
A.OUMNAD
61
TMR2 est un timer 8 bits accessible en lecture criture par l'intermdiaire du registre qui porte le mme nom. Il est constitu de : Un compteur 8 bits TMR2, Un registre de contrle T2CON (bank0), Un diviseur de frquence programmable PRESCALER dont le rapport de division PREDIV peut prendre une des valeurs 1, 4 ou 16 un registre de priode PR2 (bank1) accessible en lecture/criture un comparateur qui compare le contenu de TMR2 avec celui de PR2 un deuxime diviseur de frquence POSTSCALER dont le rapport de division POSTDIV peut prendre toutes les valeurs comprises entre 1 et 16. Fonctionnement: TMR2 est incrment par l'horloge interne Fosc/4 ventuellement prdivise par le PRESCALER. Quant il atteint la valeur du registre PR2, au coup d'horloge suivant, le comparateur gnre un signal qui : o Remet TMR2 0, o incrmente le diviseur de frquence POSTSCALER, Le comptage commence 0 et se termine PR2. Le comparateur annonce une galit tous les PR2+1 coups dhorloge, Au dbordement du POSTSCALER, le drapeau TMR2IF est positionn, l'interruption correspondante et dclenche si elle est valide, TMR2 est remis zro chaque RESET, Le PRESCALER et le POSTSCALER qui sont aussi des compteurs sont rinitialiss chaque criture dans TMR2 ou dans T2CON et au RESET du processeur La configuration de TMR2 se fait l'aide du registre de contrle T2CON :
Microcontrleur PIC16F887
A.OUMNAD
62
TOUTPS3:TOUTPS0 : rapport du POSTSCALER 0000 : division par 1 0001 : division par 2 ... 1111 : division par 16 TMR2ON : dmarrer arrter TMR2 0 : TMR2 off 1 : TMR2 on T2CKPS1,T2CKPS0 : rapport du PRESCALER 00 : division par 1 01 : division par 4 1x : division par 16 Remarque : Dans le cas de la scrutation du drapeau TMR2IF par les 2 instructions suivantes : ici btfss PIR1,TMR2IF ; attendre drapeau goto ici Les temporisations obtenues peuvent tre errones { cause de linstruction goto qui prend deux cycles pour sexcuter ce qui peut retarder la dtection du drapeau. La solution est dutiliser linterruption lie au drapeau TMR2IF, dans ce cas, les temporisations obtenues sont exactes Exercice 27) TMR2 a) Si le PIC est cadenc par Fosc = 8 MHz, quelle la temporisation maximale que l'on peut obtenir l'aide du timer TMR2 b) Que devient cette valeur si on ajoute un compteur CTR (1 seul registre) dans le programme
Microcontrleur PIC16F887
disp(' CTR PREDIV PR2+1 POSTDIV'); disp('---------------------------------'); for ctr=256:-1:1 for div1=[1 4 16] for pr2=0:255 for div2=1:16 t2=ctr*div1*(pr2+1)*div2*4/fosc_mhz; if t2 == Tus disp([ctr div1 pr2+1 div2]); end end end end end
A.OUMNAD
63
; ========= sous programme d'interruption ======= org 4 bcf PIR1,TMR2IF ; baisser le drapeau decfsz CTR,f ; compter les dbordement de TMR2 retfie ; le compte n'y est pas movlw B'00010000' ; masque de RD4 xorwf PORTD,f ; inverser RD4 movlw 200 ; rinitialiser le compteur movwf CTR retfie ; ===== Programma principal ============= main: BANK1 movlw 0x71 movwf OSCCON ; Oscillateur interne, Fosc=8MHz bcf TRISD,4 ; RD4 en sortie movlw 249 movwf PR2 bsf PIE1,TMR2IE ;valider l'interruption TMR2I BANK0 movlw B'00100101' ; PREDIV=4, PR2+1 = 250, POSTDIV = 5 movwf T2CON movlw 200 ; initialiser compteur (premier passage uniquement) movwf CTR bsf INTCON,GIE ; valider les interruptions bsf INTCON,PEIE ; valider les interruptions priphriques goto $ END
Microcontrleur PIC16F887
A.OUMNAD
64
On va utiliser le timer TMR2 pour ajuster les temps. Avec Fosc = 8 MHz, on a Tcy = 0.5 s. Pour obtient un temps T s, il suffit de prendre PREDIV=1, POSDIV=2 et PR2 = T-1. On va laisser le (-1) de cot pour faciliter l'explication qui suit. Pour obtenir le signal asymtrique reprsent ci-dessus, on commence par PR2=T1, ensuite il faut basculer PR2=T2 et continuer basculer ainsi d'une valeur l'autre. Pour raliser l'opration de basculement d'une faon simple, on va utiliser cette proprit de l'oprateur XOR : A A = 0. On commence par dfinir un masque M = T1 T2. Au dbut il faut obligatoirement que PR2 soit initialis l'une des deux valeurs T1 ou T2 Si PR2 = T1, si on fait l'opration PR2 = PR2 M, on obtient PR2 = T1 T1 T2 = T2 Si PR2 = T2, si on fait l'opration PR2 = PR2 M, on obtient PR2 = T2 T1 T2 = T1 On remarque que la mme opration permet de basculer entre les deux valeurs T1 et T2
Exercice 28) Ecrire le programme qui permet de gnrer le signal de la figure ci-dessus
Microcontrleur PIC16F887
A.OUMNAD
65
Ce module est constitu d'un convertisseur Analogique Numrique 10 bits de type approximations successives. L'entre est issue d'un multiplexeur analogique permettant de choisir un canal analogique parmi 16. 14 de ces canaux viennent de l'extrieur sur les E/S AN0 AN13. Les 2 canaux restants sont issus du gnrateur de tension de rfrence utilis avec les comparateurs analogiques. Le choix d'un canal se fait l'aide des 4 bits CHS<3:0> situs dans le registre de contrle ADCON0.
CHS<3:0> AN0/RA0 AN1/RA1 AN2/RA2 AN3/RA3 AN4/RA5 AN5/RE0 AN6/RE1 AN7/RE2 AN8/RB2 AN9/RB3 AN10/RB1 AN11/RB4 AN12/RB0 AN13/RB5 CVREF FVREF 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 RA2/VREFVss Tosc VCFG1 1 0 GO/DONE DIV VrefCLK Tad S CAN ADRESL ADRESH 1 0 VCFG0 Vref+ RA3/VREF+ Vdd ADCON0 ADCON1
ADCS0 ADCS1
Les E/S utilises doivent tre configures en entre l'aide des registres TRISA, TRISE et TRISB. Elles doivent aussi tre configures en analogiques grce aux registres ANSEL et ANSELH
Microcontrleur PIC16F887
A.OUMNAD
66
ANSEL
ANS0 0/ 1 RA0 N/ A
ANSELH
ANS13 ANS12 ANS11 ANS10 ANS9 0/ 1 0/1 0/1 0/1 0/1 RB5 N/ A RB0 N/ A RB4 N/ A RB1 N/ A RB3 N/ A
Lchantillonneur bloqueur est intgr, il est constitu dun interrupteur dchantillonnage et dune capacit de blocage de 10 pF. Les tensions de rfrences permettant de fixer la dynamique du convertisseur. Elles peuvent tre choisies parmi Vdd, Vss, VREF+ et VREFLe rsultat numrique est accessible dans les deux registres ADRESL et ADRESH. Le contrle se fait par les deux registres ADCON0 et ADCON1
ADCS1:ADCS0 : Choix de l'horloge de conversion, Tad = Tosc div doit tre 1.6s 00 : div = 2 01 : div = 8 10 : div = 32 11 : Oscillateur RC ddi au CAN, Tad est de l'ordre de 4 s <CHS3:CHS0> : Choix du canal analogique convertir (Voir Figure VIII-1) GO/DONE : En plaant ce bit 1, on dmarre une Conversion. A la fin de la conversion, ce bit revient automatiquement 0 ADON : Ce bit permet d'activer/dsactiver le CAN 0 : CAN dsactiv 1 : CAN activ ADCON1 ADFM VCFG1 VCFG0 -
ADFM : justification droite ou gauche du rsultat dans les registre ADRESH et ADRESL ADRESH ADRESL 1 : justifi droite 000000xx xxxxxxxx 0 : justifi gauche xxxxxxxx xx000000 VCFG1 : Choix de la tension de rfrence infrieure 0 : Vref- = Vss 1 : Vref- = AN2 = RA2
Microcontrleur PIC16F887 VCFG+ : Choix de la tension de rfrence suprieure 0 : Vref+ = Vdd 1 : Vref+ = AN3 = RA3
A.OUMNAD
67
Va Va S 10 pF Ve CAN
2Tad
12Tad
Tacq
automatique
TAD est la priode de l'horloge applique au convertisseur A/N. Sa valeur dpend de l'horloge de base Tosc et du prdiviseur Div :
Microcontrleur PIC16F887
68
Div peut prendre 4 valeurs possibles. Le choix se fait l'aide des bits ADCS0 et ADCS1 du registre ADCON0. Des limitations dues la technologie CMOS du PIC font que Div doit tre ajust de sorte que TAD soit { 1,6 s. Le tableau ci-dessous donne la valeur de TAD pour quelques valeurs de Fosc. ADCS1 ADCS0 Div 00 2 01 8 10 32 11 RC 20Mhz 0,1 s 0,4 s 1,6 s Fosc 5Mhz 8MHz 4Mhz 0,4 s 0,25 s 0,5 s 1,6 s 1 s 2 s 6,4 s 4 s 8 s Non utilisable 2Mhz 1 s 4 s 16 s 1Mhz 2 s 8 s 32 s 4 s
Tableau VIII-1 : TAD (les cases grises sont hors plage dutilisation)
Avec un quartz de 4 MHz, on peut choisir Div = 8 ou Div 32. Il est prfrable de prendre Div=8 ce qui donne un temps de conversion plus court. TAD = 2 s, soit un temps de conversion : TCONV = 24 s. Avec Fosc = 20MHz, on est oblig de prendre Div=32, d'o TAD = 1.6 s et TCONV = 19.2 s
Tc : temps de charge du condenseur = (Ric+Rss+Rs) C Ln(2047) Ric = Rsistance dinterconnexions, elle est infrieure 1k Rss = Rsistance du linterrupteur S (Sampling switch), elle dpend de la tension dalimentation Vdd. Elle est gale 7k pour Vdd=5V Rs : Rsistance interne de la source du signal analogique. Il est recommand de ne pas dpasser une valeur de 10k C : Capacit de blocage = 10 pF CT : Coefficient de temprature = (Tp -25C) 0.05 s/C Tp = Temprature Processeur, voisine de 50C en temps normal Valeur nominale : Ric = 1k, Rss = 7k, Rs = 10k, Tp = 50 C : Tc = 18k x 10pF x Ln(2047) = 1.37 s CT = 25 x 0.05 s = 1.25 s TACQ = 1.37 + 1.25 +2 s = 4.62 s 5 s
Microcontrleur PIC16F887
A.OUMNAD
69
Si on tient compte de la rgle de Shannon (Fe 2 fmax), on constate que lon peut chantillonner des signaux dont la frquence peut atteindre 18 KHz ce qui est tout fait respectable. On peut donc utiliser le PIC pour numriser la voix et mme la musique.
Microcontrleur PIC16F887
movwf bsf clrf clrf movlw movwf BANK3 movlw movwf clrf BANK0 movlw movwf nop nop nop nop nop bsf btfsc goto movf movwf BANK1 movf BANK0 movwf sleep END OSCCON TRISA,0 TRISC TRISD 80h ADCON1 B'00000001' ANSEL ANSELH 0x41 ADCON0
A.OUMNAD
; horloge interne 4 Mhz, Tosc=0.25s, Tcy=1s ; RA0 entre ; PORTC en sortie ; PORTD en sortie ; rsultat justifi droite, Vr+=Vdd, Vr-=Vss
70
VIII.8.2
Relever 40 chantillons
Programme qui fait l'acquisition de 40 chantillons du signal appliqu sur RA0, et recopie les rsultats dans la RAM partir de la position 190h. L'chantillonnage se fera la vitesse la plus rapide possible.
ADC-40ech.asm ;===================================================================== ; Relever 40 chantillons et stocker les rsultats dans la RAM partir de la position 190h ; le rythme d'chantillonnage le plus rapide possible (avec Fosc = 4MHz) ====================================================================== LIST p=16f887,r=dec INCLUDE <p16f887.inc> INCLUDE <mesmacros.inc> __CONFIG 0x2007 , 0x23E4 ; INTOSCIO __CONFIG 0x2008 , 0x3FFF ERRORLEVEL -302 CTR EQU 70h ;============================================================= BANK1 movlw 61h movwf OSCCON ; horloge interne 4 Mhz, Tosc=0.25s, Tcy=1s bsf TRISA,0 ; RA0 entre movlw 80h ; rsultat justifi droite, Vr+=Vdd, Vr-=Vss movwf ADCON1 BANK3 movlw B'00000001' ; RA0 analogique movwf ANSEL ; tout le reste numrique clrf ANSELH BANK0 movlw 0x41 ; 01 0000 0 1 movwf ADCON0 ; DIV=8,Tad=2ms, canal 0, AD:en service
Microcontrleur PIC16F887
A.OUMNAD
71
; partir d'ici, il faut attendre au moins 5 s avant de lancer la conversion ; les 5 instructions suivantes font l'affaire movlw .40 movwf CTR ; compteur d'chantillons bsf STATUS,IRP ; adressage indirect , page 2 movlw 90h ; pointeur d'adressage indirect movwf FSR ici: bsf btfsc goto BANK1 movf movwf incf BANK0 movf movwf incf decfsz goto sleep END ADCON0,GO ADCON0,GO $-1 ADRESL,W INDF FSR,f ADRESH,w INDF FSR,f CTR,f ici ; lancer la conversion ; attendre fin conversion
Aprs la fin dune conversion, le temps de traitement pour copier le rsultat dans la RAM dpasse la dure d'acquisition. Aucune attente supplmentaire n'est ncessaire avant de lancer une nouvelle conversion.
VIII.8.3
On refait le travail prcdent avec une frquence dchantillonnage fe = 8000Hz, soit Te=125s. On utilise TMR2 pour dclencher une interruption toutes 125 s
ADC-40ech-8000Hz ;============================================================== ; Relever 40 chantillons avec fe=8000Hz ( Te=125s), et stocker les rsultat ; dans la RAM partir de la position 190h ; le rythme d'chantillonnage est cadenc par l'interruption de TMR2 ============================================================== LIST p=16f887, r=dec INCLUDE <p16f887.inc> INCLUDE <mesmacros.inc> __CONFIG 0x2007 , 0x23E4 ; INTOSCIO __CONFIG 0x2008 , 0x3FFF ERRORLEVEL -302 CTR EQU 70h ;============================================================= ORG 0 goto main ; ========= procdure d'interruption ============= ORG 4 bsf ADCON0,GO ; lancer la conversion btfsc ADCON0,GO ; attendre fin conversion goto $-1 BANK1 movf ADRESL,w movwf INDF incf FSR,f BANK0 movf ADRESH,w movwf INDF incf FSR,f bcf PIR1,TMR2IF ; baisser le drapeau decf CTR,f ; dcrmenter le compteur, Z est positionn retfie
Microcontrleur PIC16F887
A.OUMNAD
72
; ========= Programme principal ============= main: BANK1 movlw 61h movwf OSCCON ; horloge interne 4 Mhz, Tosc=0.25s, Tcy=1s bsf TRISA,0 ; RA0 entre movlw 80h ; rsultat justifi droite, Vr+=Vdd, Vr-=Vss movwf ADCON1 movlw .124 ; avec PREDIV et POSTDIV=1, on obtient 125s movwf PR2 bsf PIE1,TMR2IE ; validation interruption TMR2I BANK3 movlw B'00000001' ; RA0 analogique movwf ANSEL ; tout le reste numrique clrf ANSELH BANK0 movlw B'00000100' ; configuration TMR2, postdiv=1, prediv=1 movwf T2CON movlw 0x41 ; 01 0000 0 1 movwf ADCON0 ; DIV=8,Tad=2ms, canal 0, AD:en service movlw .40 movwf CTR ; 40 chantillons bsf STATUS,IRP ; adressage indirect Pointeur = 190h movlw 90h movwf FSR bsf INTCON,GIE ; valider les interruptions bsf INTCON,PEIE ; valider les interruptions priphriques bcf STATUS,Z btfss goto clrf sleep END STATUS,Z $-1 INTCON
Tourner ici tant que le drapeau Z=0. A chaque interruption de TMR2, la procdure d'interruption prend un chantillon et dcrmente le compteur. Au retour de l'interruption aprs le dernier chantillon, on aura CTR=0 donc Z=1. On quitte la boucle qui teste Z et on rentre dans mode sleep
Microcontrleur PIC16F887
A.OUMNAD
73
Chapitre IX L'USART
L'USART (Universal Synchronous Asynchronous Receiver Transmitter) est l'un des deux modules de communication srie dont dispose le PIC16F887. L'USART peut tre configur comme systme de communication asynchrone full duplex ou comme systme synchrone half duplex (non tudi). La communication se fait sur les deux broches RC6/TX et RC7/RX qui doivent tre configurs toutes les deux en ENTREE par TRISC. Les signaux sont compatible TTL, il faut utiliser un circuit d'interface du genre MAX232 pour gnrer un signal conforme au standard RS232. La vitesse de communication est fixe par un gnrateur de rythme programmable BRG (Baud rate generator). L'accs au module en lecture et en criture se fait par les registres RCREG et TXREG. Le contrle du module se fait par les registres TXSTA, RCSTA, SPBRG, SPBRGH et BAUDCTRL
IX.1
Mode Asynchrone
Si on place le bit SYNC du registre TXSTAT 0, l'USART fonctionne dans le mode asynchrone. Deux modes sont disponibles, le mode 8 bits standard et un mode 9 bits qui peut s'avrer intressant dans le cas de communication point multipoints. La transmission se fait sur la broche RC6/TX et la rception sur la broche RC7/RX La configuration et le contrle du port se fait par les registres TXSTA, RCSTA et BAUDCTL La vitesse de communication est fixe par les registre SPBRG, SPBRGH et les bits BRGH et BRG16 La parit n'est pas gre d'une faon matrielle, elle peut tre gre par soft si son utilisation est ncessaire. L'accs au port en lecture ou criture se fait par les registres d'accs RCREG et TXREG. La transmission et la rception se font par deux registres dcalage, un pour la transmission ( TSR) et un pour la rception (RSR). L'accs au registres d'accs peut se faire alors que les registres dcalage sont en train de transmettre/recevoir une donne. L'USART peut dclencher deux interruptions diffrente par le biais des drapeaux PIR1.RCIF et PIR1.TXIF. Ces drapeaux sont trs utiles pour grer la lecture/criture dans le port. o RCIF est positionn quand le port a termin la rception d'un octet, RCREG plein. o TXIF est positionn quand le registre d'accs TXREG est vide.
Microcontrleur PIC16F887
A.OUMNAD
74
IX.2
Le port en transmission
TXREG
BRG
TSR
RC6/TX
Pour transmettre un octet D, il faut s'assurer que le registre d'accs TXREG est libre en vrifiant que le drapeau TXIF est gal 1. Ensuite, il suffit de copier l'octet D dans le registre TXREG, le drapeau TXIF passe 0 pour indiquer que le registre TXREG est occup. Ensuite, deux situations sont possibles : Le registre de transmission TSR nest pas occup, alors la donne D est transfre immdiatement dans le registre dcalage TSR qui commence sa transmission bit bar bit. Le drapeau TXIF repasse 1 pour indiquer que le registre d'accs TXREG est de nouveau libre. Le registre de transmission TSR est occup transmettre un octet. La donne D attend dans TXREG, et le drapeau TXIF reste 0 jusqu{ ce que TSR termine de transmettre loctet prcdent. La donne D est alors transfre dans TSR qui commence sa transmission bit bar bit. Le drapeau TXIF repasse 1 pour indiquer que le registre TXREG est libre. En mode 9 bits, le 9me bit (MSB) doit tre plac dans le bit TX9D du registre TXSTA et ceci avant de placer les 8 autres bits dans TXREG. criture D0 criture D1 dans TXREG dans TXREG
TXIF
Transmission D0
Transmission D1
chargement TXREGTSR
chargement TXREGTSR
Comme on vient de le voir, le drapeau TXIF est gr automatiquement, on ne peut pas le modifier directement par programme.
CSRC
TX9
TXEN
SYNC
TX9D
Microcontrleur PIC16F887
A.OUMNAD
75
CSRC : non utilis en mode asynchrone TX9 : Validation du mode 9 bits 0 : mode 8 bit 1 : mode 9 bits TXEN : permet d'activer/dsactiver la transmission, 0 : dsactive 1 : active SYNC : Choix entre mode synchrone ou asynchrone 0 : mode asynchrone, 1 : mode synchrone SENDB : permet de transmettre un break. Revient 0 aprs la transmission du Break BRGH : utilis par le gnrateur de rythme BRG. Multiplie la vitesse par 4 TRMT : Indicateur de lactivit du registre { dcalage de transmission TSR 0 : registre dcalage TSR en activit 1 : registre dcalage TSR libre, TX9D : en mode 9 bits, Le 9me bit de doit tre plac ici
IX.3
Le port en rception
RCREG
BRG
RSR
RC7/RX
La rception est valide par le bit CREN La rception d'un octet dmarre la rception du START bit qui commence toujours par une transition 10 A la rception du stop bit, le contenu du registre dcalage de rception RSR est recopi dans le registre tampon de rception RCREG. Le drapeau RCIF (PIR1.5) est positionn, l'interruption associe est dclenche si elle est valide. Le drapeau RCIF est remis 0 automatiquement au moment o le registre RCREG est vid. Le registre RCREG est un registre double (pile FIFO 2 positions). On peut donc avoir 2 octets en attente dans ce registre et tre en train de recevoir un 3me dans le registre dcalage RSR. A la fin de la rception du 3me octet, si RCREG est toujours plein, alors le dernier octet reu est perdu et le bit OERR (Overrun ERRor bit) est positionn ce qui provoque l'arrt des transferts du registre dcalage RSR vers le buffer RCREG. Pour reprendre la rception il faut rinitialiser le module de rception en mettant 0 puis 1 le bit CREN (). Le drapeau PIR1.RCIF ne passe 0 que quand la pile RCREG est vide Si on reoit un 0 la position du STOP bit qui doit tre toujours 1, alors le bit FERR (Framing ERRor) du registre RCSTA est positionn. Comme la pile FIFO de rception peut contenir deux octets, chaque octet a son propre bit framing error. Les deux bits sont aussi empils. Le bit FERR du registre RCSTA permet accder au bit d'erreur correspondant l'octet qui est au sommet de la pile RCREG. Chaque fois qu'on lit un octet dans RCREG, FERR est remplac bar le bit d'erreur de l'octet lire prochainement.
Microcontrleur PIC16F887
A.OUMNAD
76
FERR
RCREG
RCIF
FERR
RCREG
RCIF
FERR
RCREG
RCIF
0 F0
(1) Pile vide RCIF
1 D0 F0 F1 D0 D1
FERR
RCREG
1 F1 D1
(5) Aprs lecture de l'octet D1
La figure ci-dessus illustre le fonctionnement de la pile de rception, Au dbut la pile est vide donc drapeau RCIF=0 Le module reoit l'octet D0, il le copie dans la pile RCREG. Son bit d'erreur F0 est copi dans la pile FERR. Le drapeau RCIF passe 1 pour indiquer qu'au moins un octet nous attend dans la pile. Le module reoit un deuxime octet D1, il le copie dans la pile RCREG. Son bit d'erreur F1 est copi dans la pile FERR. Le drapeau RCIF reste 1 pour indiquer qu'au moins un octet nous attend dans la pile. Nous lisons le registre RCREG. C'est l'octet D0 qui est lu. L'octet D1 ainsi que sont bits d'erreur F1 sont dcal vers le haut dans la pile. Le drapeau RCIF reste 1 car il reste un octet dans la pile. On remarque que le bit F0 a t cras par le bit F1. Donc si on dsire contrler les bits framing error, il faut toujours lire le bit FERR avant de lire le registre RCREG, car la lecture de ce dernier provoque le dcalage des piles vers le haut. Nous lisons le registre RCREG. C'est l'octet D1 qui est lu. La pile est vide, le drapeau RCIF passe 0.
9b0 9b1
Octet 0 Octet 1
SPEN
RX9
SREN
CREN
ADDEN
FERR
OERR
RX9D
Microcontrleur PIC16F887 SPEN : Validation du port srie 0 = Inhib 1 = valid RX9 : Validation du mode 9 bits, 0 = mode 8 bits 1 = mode 9 bits
A.OUMNAD
77
SREN : validation de rception d'u seul octet (non utilis en mode asynchrone) CREN : Validation du mode rception continue, 0 = Inhib 1 = valid ADDEN : dtection d'adresse, en mode 9 bits FERR : Erreur de synchronisation, lecture seule. (Voir ci-dessus) OERR : Erreur dbordement du buffer de rception, lecture seule. (Voir ci-dessus) RX9D : en mode 9 bits, le 9me bit (MSB) doit tre lu ici.
Maitre
Esclave 1
Esclave 2
Esclave 3
Interface RS-485
Interface RS-485
Interface RS-485
Interface RS-485
Dans un tel systme, le maitre envoie des messages sous formes de trames. Chaque trame commence par l'adresse du slave auquel elle est destine, suivie d'un champ de donnes. Selon le protocole utilis, la trame peut tre de longueur fixe ou peut se terminer par un caractre particulier faisant office de fanion fin de message. Pour distinguer entre l'octet adresse et les octets de donnes, l'octet adresse est envoy avec le 9me bit gal 1, les octets de donnes sont envoys avec le 9me bit gal 0. Les esclaves fonctionnent en mode dtection d'adresse qu'ils peuvent activer dsactiver l'aide du bit ADDEN du registre RCSTA. Quand ce mode est activ, seul les octets reus avec le 9me bit gal 1 sont accepts et transfrs dans le buffer RCREG, les autres sont ignors. Quand ce mode est dsactiv, la rception se fait normalement. Au dpart, tous les esclaves sont en mode coute. Ils ont activ la dtection d'adresse et plac leur interface de transmission en haute impdance. Ils recevent l'octet adresse envoy par le maitre. Chacun le compare avec sa propre adresse. Un seul se reconnaitra et continuera l'change. Les autres restent en mode coute. L'esclave concern doit dsactiver le mode de dtection d'adresse affin de recevoir le reste des donnes. Il peut aussi activer son interface de transmission pour envoyer des donns vers le maitre. Selon le protocole utilis, le slave dtecte la fin du message et repasse en mode coute.
Microcontrleur PIC16F887
A.OUMNAD
78
IX.4
La vitesse de communication
La vitesse de communication est dtermine par le gnrateur de rythme BRG (Baud Rate Generator). Elle est drive de la frquence Fosc selon la valeur des registres de contrle SPBRG et SPBRGH ainsi que celle des bits BRGH (TXSTA,2) et BRG16 (BAUDCTL,3).
vitesse
M Fosc baud 64 (R 1)
M Fosc -1 64 vitesse
M est un multiplicateur qui peut prendre une des valeurs 1, 4 ou 16. R est soit le contenu du registre SPBRG seul (prcision 8 bits) soit le contenu du registre double SBRGH:SPBRG (prcision 16 bits). Le choix se fait par les deux bits BRGH et BRG8 conformment au tableau ci-dessous.
BRG16 0 0 1 1 BRGH 0 1 0 1 M 1 4 4 16 R SPBRG SPBRG SPBRGH:SPBRG SPBRGH:SPBRG
On remarque que BRGH a un rle de multiplicateur par 4, BRG16 a un rle de multiplicateur par 4, en plus, il permet de fonctionner en prcision 16 bits.
Fosc 1MHz 4MHz 8MHz 20MHz Vitesse dsire SPBRG Obtenue Err% SPBRG Obtenue Err% SPBRG Obtenue Err% SPBRG Obtenue Err% 300 51 300 0,00 207 300 0,00 255 1221 1,75 1200 12 1202 0,17 51 1202 0,17 103 1202 0,17 2400 25 2404 0,17 51 2404 0,17 129 2404 0,17 9600 12 9615 0,16 32 9470 -1,35 19200 15 19531 1,72 57600 115200 Tableau IX-2 : quelques exemples avec BRG16 = 0, BRGH = 0 Fosc 1MHz 4MHz 8MHz 20MHz Vitesse dsire SPBRG Obtenue err % SPBRG Obtenue err % SPBRG Obtenue err % SPBRG Obtenue err % 300 207 300 0,00 1200 51 1202 0,17 207 1202 0,17 2400 25 2404 0,17 103 2404 0,17 207 2404 0,17 9600 6 8929 -6,99 25 9615 0,16 51 9615 0,16 129 9615 0,16 19200 2 20833 8,51 12 19231 0,16 25 19231 0,16 64 19231 0,16 57600 8 55556 -3,55 21 56818 -1,36 115200 10 113636 -1,36 Tableau IX-3 : quelques exemples avec BRG16 = 0, BRGH = 1 Fosc Vitesse dsire 300 1200 2400 4800 9600 19200 57600 115200 8MHz 20MHz SPBRGH Err SPBRGH Err SPBRGH Err SPBRGH Err SPBRG Obtenue % SPBRG Obtenue % SPBRG Obtenue % SPBRG Obtenue % 0 207 300 0 3 64 300 0 6 130 300 0 16 70 300 0 0 51 1202 0,17 0 207 1202 0,17 1 160 1199 -0,08 4 17 1200 0 0 25 2404 0,17 0 103 2404 0,17 0 207 2404 0,17 2 8 2399 -0,04 0 12 4808 0,17 0 51 4808 0,17 0 103 4808 0,17 1 3 4808 0,17 0 25 9615 0,16 0 51 9615 0,16 0 129 9615 0,16 0 12 19231 0,16 0 25 19231 0,16 0 64 19231 0,16 0 8 55556 -3,55 0 21 56818 -1,36 0 10 113636 -1,36 Figure IX-7 : quelques exemples avec BRG16 = 1, BRGH = 0 1MHz 4MHz
Microcontrleur PIC16F887
A.OUMNAD
79
Fosc 8MHz 20MHz Vitesse SPBRGH Err SPBRGH Err SPBRGH Err SPBRGH Err dsire SPBRG Obtenue % SPBRG Obtenue % SPBRG Obtenue % SPBRG Obtenue % 300 3 64 300 0 13 4 300 0 26 10 300 0 65 26 300 0 1200 0 207 1202 0,17 3 64 1200 0 6 130 1200 0 16 70 1200 0 2400 0 103 2404 0,17 1 160 2398 -0,1 3 64 2401 0,04 8 34 2400 0 4800 0 51 4808 0,17 0 207 4808 0,17 1 160 4796 -0,08 4 17 4798 -0,04 9600 0 25 9615 0,16 0 103 9615 0,16 0 207 9615 0,16 2 8 9597 -0,03 19200 0 12 19231 0,16 0 51 19231 0,16 0 103 19231 0,16 1 3 19231 0,16 57600 0 16 58824 2,13 0 34 57143 -0,79 0 86 57471 -0,22 115200 0 8 111111 -3,6 0 16 117647 2,12 0 42 116279 0,94 Figure IX-8 : quelques exemples avec BRG16 = 1, BRGH = 1 1MHz 4MHz
ABDOVF
RCIDL
SCKP
BRG16
WUE
ABDEN
ABDOV : indicateur de dbordement du timer du dtecteur de vitesse ABDOV : indicateur de l'activit du module de rception 0 : le module de rception est prt 1 : le module de rception est en train de recevoir un caractre SCKP : pour fixer la polarit du signal de donnes sur la sortie RC6/TX 0 : signal non invers ( utiliser avec un max232) 1 : signal invers (conforme la polarit de la norme RS232) BRG16 : dtermine si le BRG utilise un registre 8 bits ou 16 bits pour dterminer la vitesse 0 : seul SPBRG est utilis dans le calcul de la vitesse 1 : les deux registres SPBRGH et SPBRG sont utiliss dans le calcul de la vitesse WUE : validation du mode Wake up 0 : le module de rception fonctionne normalement 1 : le module de rception attend un front montant sur l'entre RC7/RX pour sortir du mode sleep ABDEN : validation du mode dtection automatique de vitesse (auto-baud). 0 : le mode auto-baud est dsactiv 1 : dmarre la squence de dtection de la vitesse. Revient 0 une fois la dtection termine
IX.5
Sassurer que linterruption TXI nest pas valide Configurer la broche TX/RC6 en entre Configurer le registre TXSTA (mode 8 bits, valider transmission, asynchrone, BRGH) Configurer la vitesse par le registre SPBRG et ventuellement le registre SPBRGH et le bit BR16 Configurer le registre BAUDCTL Valider le port avec le bit RCSTA.SPEN Vrifier que le drapeau PIR1.TXIF=1 c..d TXREG est vide Placer la donne transmettre dans le registre TXREG Recommencer au point pour transmettre d'autres donnes
Microcontrleur PIC16F887
A.OUMNAD
80
IX.6
Sassurer que linterruption RCI nest pas valide Configurer la broche RX/RC7 en entre Configurer le registre TXSTA (mode 8 bits, asynchrone, BRGH) Configurer la vitesse par le registre SPBRG et ventuellement le registre SPBRGH et le bit BR16 Configurer le registre BAUDCTL Configurer le registre RCSTA (validation port, mode 8 bits, rception continue) Attendre que drapeau RCIF passe 1 ce qui annonce la prsence d'au moins un octet dans le buffer de rception, Lire loctet reu dans le registre RCREG recommencer au point tant quon a des donnes { recevoir
IX.7
TRISC0 ABDEN
Exercice 29) Programme qui transmet l'alphabet A Z sur le port srie 9600 baud, avec une temporisation voisine de 1/2 seconde entre chaque caractre Exercice 30) Programme qui coute le port srie. Quand il reoit un caractre, il ajoute 1 son code ASCII pour avoir le caractre suivant puis le retransmet sur le port srie. Programme essayer ave le PIC d'un cot et un PC avec le logiciel Tera-Term de l'autre. Placer le curseur dans la fentre du terminal, taper A, on voit B car le terminal affiche le caractre reu. On peut configurer le terminal pour voir les caractres taps localement. Dans ce cas on verra le caractre envoy et le caractre reu