Vous êtes sur la page 1sur 80

Microcontrleur PIC16F887

A.OUMNAD

LES MICROCONTROLEURS Par la pratique

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

Table des matires


INTRODUCTION ................................................................................................................................................... 2 Chapitre I ............................................................................................................................................................... 7 LES ELEMENTS DE BASE DU PIC16F887 ........................................................................................................ 7 I.1 I.2 Elments essentiels du PIC 16F887 ................................................................................................................... 7 Brochage du 16F887............................................................................................................................................... 8

I.3 L'Horloge.................................................................................................................................................................... 8 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

Chapitre I LES ELEMENTS DE BASE DU PIC16F887


I.1 Elments essentiels du PIC 16F887
Parmi les lments essentiels du PIC16F887, on peut citer: Mmoire programme de type EEPROM flash de 8K mots de 14 bits, Mmoire EEPROM de 256 octets, RAM donne de 368 octets, 5 ports d'entre sortie (8bits), PORTA, PORTB, PORTC, PORTD, PORTE(4 bits), Convertisseur Analogiques numriques 10 bits 14 canaux, USART, Port srie universel, mode asynchrone (RS232) et mode synchrone, MSSP, Port srie synchrone supportant I2C, Trois TIMERS TMR0, TMR1 et TMR2, Deux modules de comparaison et Capture CCP1 et CCP2, Un chien de garde, 13 sources d'interruption, Gnrateur d'horloge, { quartz (jusqu { 20 MHz) ou Oscillateur RC, Protection de code, Fonctionnement en mode sleep pour rduction de la consommation, Programmation in-situ ICSP (In Circuit Serial Programming) 12V ou 5V, Possibilit aux applications utilisateur daccder { la mmoire programme, Tension de fonctionnement de 2 5V, Jeux de 35 instructions

Microcontrleur PIC16F887

A.OUMNAD

PORTE

PORTD

PORTC

PORTB 96 registres systme SFR 368 registres utilisateur GPR W ALU

PORTA

14 bits : config

DAC 10 bits
Chien de garde

timer 0 TMR0 timer 2 TMR2 timer 1 TMR1


Capture/Comparaison

Mmoire programme de type Flash Unit De contrle 8 x 1024 mots de 14 bits

WDT

MSSP (I2C/SPI) USART (RS232)

CCP1 CCP2

Capture/Comparaison

Horloge systme

256 octets

EEPROM

Fig. I.1 : Les lments constitutifs du PIC 16F887

I.2

Brochage du 16F887

I-1 : brochage du 16F887 (source : document Microchip DS41291F)

I.3

L'Horloge

Microcontrleur PIC16F887

A.OUMNAD

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

Figure I-3 : 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. Le registre CONFIG1 doit tre configur par la directive __CONFIG dans lun des modes suivants :

Microcontrleur PIC16F887

A.OUMNAD

10

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.

Figure I-4 : 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.

Figure I-5: 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. Le registre CONFIG1 doit tre configur dans lun des deux modes :

Microcontrleur PIC16F887

A.OUMNAD

11

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)

IRCF2 IRCF1 IRCF0 OSTS HTS LTS

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

Les Registres de configuration CONFIG1 et CONFIG2

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. Ces deux registres doivent tre configurs l'aide de la directive __CONFIG. Les logiciels de flachage du PIC permettent aussi de les positionner.

Microcontrleur PIC16F887

A.OUMNAD

12

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 1 dsactiv 0 activ

Microcontrleur PIC16F887

A.OUMNAD

13

MCLRE: RE3/MCLR pin select bit Choix de la fonction de la broche RE3/MCLR 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 Les bits non utiliss nont pas dimportance. On peut les placer { 0 ou 1.

Microcontrleur PIC16F887

A.OUMNAD

14

I.4.1

Exemple de Configuration gnrique


FCMEN :OFF(0) IESO : OFF(0) CP : OFF(1), MCLRE : ON(1) FOSC : INTOSCIO(100)

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 :2.1V(0) __CONFIG 0x2007 , 0x23E4 __CONFIG 0x2008 , 0x3EFF

11 1110 1111 1111 = 0x3FFF

I.5

L'unit de traitement centrale (CPU)

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.

Microcontrleur PIC16F887 RAM 96 SFR


W

A.OUMNAD

15

CPU Unit de control et de dcodage

Mmoire programme Flash 8 x 1024 x 14 bits

368 GPR

UAL

Horloge systme
Figure I-6 : structure trs simplifie de l'unit de traitement

I.6

Organisation de la mmoire RAM

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

Accs la RAM par adressage DIRECT

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

Figure I-7: code machine d'une instruction avec adressage direct

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

6Fh 70h Zone commune 7Fh

EFh F0h

16Fh 170h

1EFh 1F0h

FFh

17Fh Figure I-9 : organisation de la RAM du 16F876/877

1FFh

I.7

Accs la RAM par ladressage INDIRECT

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

SFR (32) GPR (96) SFR (32) GPR (80)

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

Figure I-10 : organisation de la RAM pour l'adressage indirect

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

FSR pointeur 9 bits

IRP = 0 000h 0FFh IRP = 1 100h 1FFh

page 0 page 1

Microcontrleur PIC16F887

A.OUMNAD

19

I.8

Quelques registres de configuration et leurs bits


STATUS OPTION_REG INTCON PIE1 PIR1 PIE2 PIR2 PCON OSCCON OSCTUNE EECON1 TXSTA RCSTA CCP1CON CCP2CON T1CON T2CON SSPCON SSPCON2 SSPSTAT CM1CON0 CM2CON0 CM2CON1 SRCON PWM1CON ECCPAS PSTRCON VRCON TXSTA RCSTA BAUDCTL ADCON0 ADCON1 WDTCON TRISx Bank all 1/3 all 1 0 1 0 1 1 1 3 1 0 0 0 0 0 0 1 1 2 2 2 3 1 1 1 1 1 0 3 0 1 2 1 IRP RBPU GIE OSIE OSIF EEPGD CSRC SPEN P1M1 T1GINV WCOL GCEN SMP C1ON C2ON MC1OUT SR1 PRSEN ECCPASE VREN CSRC SPEN ABDOVF ADCS1 ADFM RP1 INTEDG PEIE ADIE ADIF C2IE C2IF IRCF2 TX9 RX9 P1M0 TMR1GE TOUTPS3 SSPOV ACKSTAT CKE C1OUT C2OUT MC2OUT SR0 PDC6 ECCPAS2 VROE TX9 RX9 RCIDL ADCS0 RP0 T0CS T0IE RCIE RCIF C1IE C1IF ULPWUE IRCF1 TXEN SREN DC1B1 DC2B1 T1CKPS1 TOUTPS2 SSPEN ACKDT D/A C1OE C2OE C1RSEL C1SEN PDC5 ECCPAS1 VRR TXEN SREN CHS3 VCFG1 TO PD T0SE PSA INTE RBIE TXIE SSPIE TXIF SSPIF EEIE BCLIE EEIF BCLIF SBOREN IRCF0 OSTS TUN4 TUN3 WRERR SYNC CREN ADDEN DC1B0 CCP1M3 DC2B0 CCP2M3 T1CKPS0 T1OSCEN TOUTPS1 TOUTPS0 CKP SSPM3 ACKEN RCEN P S C1POL C2POL C2RSEL C2REN PULSS PDC4 PDC3 ECCPAS0 PSSAC1 STRSYNC STRD VRSS VR3 SYNC CREN ADDEN SCKP BRG16 CHS2 CHS1 VCFG0 WDTPS3 WDTPS2 Z PS2 T0IF CCP1IE CCP1IF ULPWUIE ULPWUIF HTS TUN2 WREN BRGH FERR CCP1M2 CCP2M2 T1SYNC TMR2ON SSPM2 PEN R/W C1R C2R PULSR PDC2 PSSAC0 STRC VR2 BRGH FERR CHS0 WDTPS1 DC PS1 INTF TMR2IE TMR2IF POR LTS TUN1 WR TRMT OERR CCP1M1 CCP2M1 TMR1CS T2CKPS1 SSPM1 RSEN UA C1CH1 C2CH1 T1GSS PDC1 PSSBD1 STRB VR1 TRMT OERR WUE GO/DONE WDTPS0 C PS0 RBIF TMR1IE TMR1IF CCP2IE CCP2IF BOR SCS TUN0 RD TX9D RX9D CCP1M0 CCP2M0 TMR1ON T2CKPS0 SSPM0 SEN BF C1CH0 C2CH0 C2SYNC FVREN PDC0 PSSBD0 STRA VR0 TX9D RX9D ABDEN ADON SWDTEN RESET 0001 1xxx 1111 1111 0000 000x 0000 0000 0000 0000 -r-0 0--0 -r-0 0--0 --01 --qq -110 q000 -110 q000 x--- x000 0000 -010 0000 000x 0000 0000 --00 0000 --00 0000 -000 0000 0000 0000 0000 0000 0000 0000 0000 -000 0000 -000 0000 --10 0000 00-0 0000 0000 0000 0000 ---0 0001 0000 0000 0000 -010 0000 000x 01-0 0-00 0000 00-0 0-00 ------0 1000 1111 1111

Tableau I-1 : dtail des registres SFR et leurs tats au dmarrage

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

Chapitre II LE JEUX D'INSTRUCTIONS DU PIC16F887


Tous les PIC Mid-Range ont un jeu de 35 instructions, Chaque instruction est code sur un mot de 14 bits qui contient le code opration ( OC) ainsi que l'oprande, Toutes les instructions sont excutes en un cycle d'horloge, part les instructions de saut qui sont excutes en 2 cycles dhorloge. Sachant que lhorloge systme est gale { Fosc/4, si on utilise un quartz de 20MHz, on obtient une horloge Fosc/4 = 5000000 cycles/seconde, cela nous donne une puissance de lordre de 5MIPS (5 Million d Instructions Par Seconde

II.1

Les instructions orientes Registre

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

Les instructions orientes bits

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

Les instructions oprant sur une valeur

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

Les instructions de saut et appel de procdures

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

II.5.1 Les instructions movwf et movf


Ce sont les instructions les plus utilises, movwf: permet de copier laccumulateur W dans un registre (SFR ou GPR):
movwf movwf STATUS 55h ; Copier le contenu de W dans le registre STATUS ; Copier W dans la case mmoire dadresse 55h

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

II.5.2 Les instructions btfss et btfsc


Ces instructions permettent de tester un bit et de sauter ou non une ligne de programme en fonction du rsultat,
Btfsc F,b ; bit test skip if clear : teste le bit b du registre F et saute linstruction suivante si le bit test est nul ; bit test skip if set : teste le bit b du registre F et saute linstruction suivante si le bi t test est gal 1

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

II.5.3 Les instructions incfsz et decfsz


Ces instructions permettent dincrmenter ou de dcrmenter un registre et de sauter si le rsultat est nul
incfsz F,1 ; increment skip if Z : incrmente le registre F et sauter une ligne si le rsultat = 0. Le paramtre 1 indique que le rsultat de lincrmentation doit aller dans F. ; decrement skip if Z : dcrmente le registre F et sauter une ligne si le rsultat = 0. Le paramtre f indique que le rsultat de la dcrmentation doit aller dans F.

deccfsz

F,f

Microcontrleur PIC16F887

A.OUMNAD

23

II.5.4 Linstruction goto


Permet de transfrer lexcution (label)
Instruction 1 Instruction 2 Goto bonjour instruction 3 instruction 4 instruction 5 instruction 6 instruction 7

une autre position du programme repre par une tiquette

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

; rester plant ici

II.5.5 Linstruction call


Linstruction call permet dappeler une fonction. Une fonction est un sous programme qui peut tre crit avant ou aprs le programme principal. Sa premire ligne doit comporter une tiquette et elle doit se terminer par return. La diffrence en call et goto est que, quant le processeur rencontre linstruction call, il sauvegarde (dans la pile) ladresse de la ligne suivante avant de se brancher { la fonction. Comme a, quand il rencontre linstruction return, il sait o il doit retourner pour continuer lexcution du programm e principal
Programme principal Debut: Instruction Instruction Instruction Instruction Call afficher Instruction Instruction Instruction goto debut Fonction Afficher:

Instruction Instruction Instruction Instruction Instruction Instruction Instruction return

Microcontrleur PIC16F887

A.OUMNAD

24

II.6

Les indicateur dtat (drapeaux)

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

II.6.1 Les indicateurs, la soustraction et la comparaison


Les instructions SUBWF et SUBLW positionne les drapeaux Z et C. C correspond a la retenue de la soustraction que l 'on dsignera par B (Borrow) F - W = 0 ==> F - W > 0 ==> F - W < 0 ==> Z=1 , C=1 , B=0 => pas de retenue de soustraction Z=0 , C=1 , B=0 => pas de retenue de soustraction Z=0 , C=0 , B=1 => il ya retenue de soustraction

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 MPASM

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

II.7.1 La directive LIST


Cette directive permet de dfinir un certain nombre de paramtres comme le processeur utilis (p), la base par dfaut pour les nombres (r) ainsi que d'autres paramtres. Exemple : LIST p=16F887, r=dec Avec r=dec, les nombres sans prfix ni suffixe seront considrs par l'assembleur comme des nombre dcimaux, sinon voir tableau ci-contre
Base Dcimal Hexadcimal Binaire Octal Prfixe D'nnn' .nnn H'nn' 0xnn nnh B'.' O'nnn' Exemple (36) D'36' .36 H'24' 0x24 24h B'00100100' O'44'

II.7.2 La directive INCLUDE


Cette directive permet d'insrer un fichier source. Par exemple le fichier p16f887.inc contient la dfinition d'un certain nombre de constante comme les noms des registres ainsi que les noms de certains bits;
INCLUDE p16f887.inc ; insre le fichier p16f887.inc cet endroit avant de compiler

Le nom du fichier peut tre place entre "" ou entre <> mais ce n'est pas obligatoire

II.7.3 La directive EQU


Cette directive permet de dfinir une constante ou une variable :
XX EQU 0x20

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

II.7.4 Les directives CBLOCK/ENDC


Ces directives permettent de dfinir un bloc C dont le rle est de simplifier la dclaration des constantes Exemple : L'ensemble des dclarations suivantes :
XX1 XX2 XX3 XX4 EQU EQU EQU EQU 0x20 0x21 0x22 0x23

Peut tre remplac par


CBLOCK 0x20 XX1, XX2, XX3, XX4 ENDC

II.7.5 La directive ORG


Cette directive permet de dfinir la position dans la mmoire programme partir de laquelle seront inscrites les instructions qui la suivent. On peut ainsi faire en sorte que le programme ou un bloc de programme soit situ un endroit particulier de la mmoire programme.

Microcontrleur PIC16F887

A.OUMNAD

26

Fig. II.1 : Illustration de la directive ORG

II.7.6 La directive #DEFINE


Fonctionne un peu comme la directive EQU tout en tant un peu plus gnrale. Elle permet daffecter toute une chane une abrviation
#DEFINE #DEFINE BCF XX LED LED 0x20 ; dans ce cas cest quivalent XX EQU 0x20 PORTB,3 ; chaque fois que le compilateur rencontrera le mot LED, il le remplacera par PORTB,3 ; sera remplac par BCF PORTB,3 => teindre la LED branche sur la broche 3 de PORTB

II.7.7

Les directives LOW et HIGH

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.7.10 La directive END :


Cette directive doit tre place tout la fin du programme, aprs le programme principal et les fonctions.

II.7.11 La directive __CONFIG


Cette directive (qui commence par 2 underscore) permet de dfinir les registres de configuration CONFIG1 et CONFIG2. Exemple :
__CONFIG 0x2007 , 0x23E4 __CONFIG 0x2008 , 0x3EFF

II.8

Les oprateurs arithmtique et logique de l'assembleur

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

Microcontrleur PIC16F887 & | ^ LOW HIGH UPPER

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

Chapitre III LES OUTILS DE DEVELOPPEMENT


Loutil de dveloppement principal est lenvironnement de dveloppement intgr MPLAB IDE fournit gratuitement par Microchip. Cet outil intgre l'diteur, l'assembleur Microchip MPASM, le simulateur MPLAB SIM, le programme de flashage condition d'utiliser un flasheur Microchip qui lui, n'est pas gratuit.

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.

III.1.1 Programmeur simple


Le programmeur le plus simple que l'on puisse raliser est celui reprsent sur la figure ci-dessous. Nous l'avons essay avec succs sur un ordinateur de bureau avec le logiciel ICPROG. Le port srie des ordinateurs portables ne dlivre pas le 12V ncessaire l'entre MCLR pour placer le PIC en mode programmation. Par ailleurs, les ordinateurs portables rcents ne sont pas quips de port srie. Des programmeurs qui se branchent sur le port USB sont dsormais disponibles des prix abordables.
5V Port srie Vdd TxD(3) RTS(7) DTR(4) CTS(8) GND(5)
Figure III-1 : programmeur deux rsistances

MCLR 22k 2.2k RB6 RB7 Vss

PIC

Microcontrleur PIC16F887

A.OUMNAD

30

III.1.2 PIC en mode excution


Aprs sa programmation, le PIC doit tre plac en mode excution (mode RUN) pour qu'il commence excuter le programme. Pour cela, il faut placer la broche MCLR au niveau haut. Il est prfrable de le faire travers une rsistance 1k ou plus. Si le PIC est configur pour fonctionner avec l'horloge quartz ou l'horloge RC, il ne faut pas oublier de brancher le quartz ou le rseau RC
5V 5V 5V

Vdd 1k MCLR 1k

Vdd OSC1 MCLR OSC2

Vdd 1k MCLR OSC1

PIC
Vss

Vss

Vss

Figure III-2 : PIC en mode RUN, oscillateur interne, oscillateur quartz, oscillateur RC

III.2

Lenvironnement de dveloppement MPLAB

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.

Figure III-3 : capture d'cran MPLAB

Microcontrleur PIC16F887

A.OUMNAD

32

III.3

Programme type : adressage direct

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 {}

III.3.1 Des macros pour slectionner les banks


Vous avez sans doute remarqu que l'utilisation des bits RP0 et RP1 pour changer de bank n'est pas trs commode. Nous allons introduire dans le programme quatre macros que nous appellerons BANK0, BANK1, BANK2 et BANK3. Ces macros nous permettrons de slectionner un bank D'une faon plus souple. Exercice 5) macros Ecrire les 4 macros. Les placer dans un fichier appel mesmacros.inc et donner la version du programme prcdent en utilisant ces macros Exercice 6) adressage indirect Programme qui copie l'alphabet majuscule dans la RAM partir de la position 190h La position 70h est utilise comme compteur. Ce programme illustre l'utilisation de l'adressage indirect et la ralisation d'une boucle avec un compteur et l'instruction decfsz.

Exercice 7) Soustraction Donner les instructions qui permettent de :

Microcontrleur PIC16F887 Changer le signe de l'accumulateur W (W = -W)

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

III.4.1 Temporisation avec une boucle


Examinons l'exemple ci-dessous. On met une valeur N1 dans la case mmoire 70h et on la dcrmente jusqu' 0
movlw movwf decfsz goto 4 70h 70h,f ici

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

Le maximum est obtenu pour W =256, soit T1max = 773 cycles.

III.4.2 Temporisation avec 2 boucles imbriques


Avec deux boucles imbriques, on a deux paramtre N1 pour la boucle intrieure te N2 pour la boucle extrieure. Pour faciliter l'utilisation, nous allons fixer le paramtre N1 0 ce qui nous le savons, correspond N1=256. Cest N2 qui constituera le paramtre de la fonction, Il faut le placer dans W avant de lappeler.
tempo2: t2: movwf decfsz goto decfsz goto return AN2 AN1,f t2 AN2,f t2

T2 = 2 + 2 + [W(t1+3)-1] + 2,

avec t1 = 2563 1 = 767 on obtient : T2 = 770 W +5 cycles . 1 cycle = 4/Fosc

Le maximum est obtenu pour N2 =256, soit T2max = 197125 cycles

III.4.1 Temporisation avec 3 boucles imbriques


Les boucles intrieures (N1 et N2) se font toujours 256 fois. La boucle extrieure se fait N3 fois. Cest N3 qui constituera le paramtre de la fonction, Il faut le placer dans W avant de lappeler.
tempo3: t3: movwf decfsz goto decfsz goto decfsz goto return AN3 AN1,f t3 AN2,f t3 AN3,f t3

T3 = 2 + 2 + W(t2+3)-1 + 2 avec t2=256*(767+3)-1 on obtient : T3 = 197122 W +5 cycles . 1 cycle = 4/Fosc

Le maximum est obtenu pour N3 =256, soit T3max = 50463237 cycles

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

Chapitre IV LES PORTS dENTRE SORTIES


Le PIC 16F887 dispose de 36 broches dentre sortie regroups dans 5 ports PORTA, PORTB, PORTC, PORTD et PORTE. Chaque broche dun port peut tre configure soit en entre soit en sortie { laide des registres de direction TRISA, TRISB, TRISC et TRISD et TRISE:

Bit k de TRISx = Bit k de TRISx =

0 1

broche k de PORTx = broche k de PORTx =

SORTIE ENTRE

TRISx

0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1

PORTx

S/E S/E S/E S/E S/E S/E S/E S/E

Certains ports ont quelques particularits que nous allons dtailler ci-dessous,

IV.1

Le port d' E/S PORTA

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

IV-1: drain ouvert

Microcontrleur PIC16F887 ANSEL

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 d'E/S PORTB

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 d' E/S PORTC

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' E/S PORTD

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 d'E/S PORTE

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 Faire clignoter une LED


Nous y sommes, avec ce que nous avons appris jusqu'ici, nous somme en mesure d'crire un premier programme qui peut tre vrifi soit sur un vrai PIC, soit en simulation sur un logiciel qui dispose d'un modle pour le PIC16F887. C'est le cas de Proteus-Isis. Nous allons raliser un petit programme qui fait clignoter une LED branche sur la broche RA3 avec une temporisation voisine de 0.5 secondes. Pour l'horloge du PIC, nous travaillerons avec Fosc = 8 MHz qui sera dlivre par l'oscillateur interne.

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

PIC Vdd MCLR Vss RA3 1k

LED

Figure IV-2 : PIC commandant une 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

Le premier programme continue fonctionner mais pas le deuxime. Expliquer pourquoi

IV.7.2 Commande d'un relai


Le programme qui nous a permis de faire clignoter la LED peut trs bien servir faire clignoter une lampe alimente par le secteur ou tout autre type de charge. Ce qui doit changer c'est l'lectronique qui contrle la charge. Le schma ci-dessous illustre un exemple de commande par l'intermdiaire d'un relai. Il est utiliser avec les charges qui ncessitent une tension ou un courant d'alimentation important. La tension Vrelai dpend du relai, a peut tre 5V, 12V ou 24V. La diode de rcupration est obligatoire, sans elle, le transistor serait dtruit au premier fonctionnement. La valeur de la rsistance R dpend de la tension d'alimentation du relai, de sa rsistance statique et du gain du transistor. On peut utiliser la formule ci-dessous ou faire quelques essais. Il ne faut pas qu'elle soit trop faible pour viter que la sortie du PIC ne fournisse un courant trop important. Une sortie du PIC peut fournir jusqu' 25 mA et le courant fournit par toutes les sorties runies ne doit pas dpasser 90mA.

Microcontrleur PIC16F887

A.OUMNAD
Vrelai Vdd=5V

43

1k

PIC Vdd MCLR Vss RA3 R=4.7k

Relai

Lampe

2N2222

Figure IV-3 : commande d'un relai

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

Commande d'un afficheur sept segments


f

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

Figure IV-4 : organisation interne des afficheurs sept segments

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

a b Dcodeur c Bcd d 7segments e f g


Figure IV-6: pilotage d'un afficheur anode commune

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

Commande d'un afficheur LCD

VSS VDD VEE

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.

IV.9.1 Initialisation de l'afficheur en mode 8 bits


Toutes les commandes doivent tre envoyes avec RS=1 Mise sous tension Mettre le port 00000000 et attendre un dlai de 15ms pour donner le temps l'afficheur de booter 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. 0011xxxx (30h) E= 4.1 ms 0011xxxx (30h) E= 4.1 ms 0011xxxx (30h) E= 4.1 ms Maintenant on est en mode 8 bits, en va utiliser de nouveau la commande Function Set, mais cette fois sur 8 bits pour demander : Mode 8bits, afficheur deux lignes, fonte 57 0011 1000(38) E= 40s On envoie la commande Display ON/OFF. On va mettre Display:ON, vous avez le choix pour le Curseur et le clignotement 0000 1100(0Ch) 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) E= 40s Envoyer la commande Clear Screen. 0000 0001(01h) E= 1.64ms

IV.9.2 Initialisation de l'afficheur en mode 4 bits


Mme si 4 bits seulement sont connects, l'afficheur dmarre en mode 8 bits. Donc l aussi on va envoyer trois fois la commande 3h sur les 4 bits suprieurs pour s'assurer qu'il est en mode 8 bits. Mise sous tension Mettre le port 0000---- et attendre un dlai de 15ms pour donner le temps l'afficheur de booter

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

Display on/off Cursor or display shift

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

Set CG address Set DD address

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

Read Busy Flag & BF A6 A5 A4 A3 address

Tableau IV-1: Commandes de l'afficheur LCD

Microcontrleur PIC16F887

A.OUMNAD

49

IV.9.3 Exemple de branchement


Nous avons l'embarras du choix pour commander un afficheur LCD au PIC16F887. L'exemple cidessous est celui adopt sur les cartes de dveloppement EasyPIC5 et EasyPIC6. L'intrt est que les programmes de test que nous allons crire fonctionneront sur ces cartes. Le lecteur pourra aisment les adapter pour un autre branchement. La librairie mesfonctions.inc prsente en annexe contient quelques fonctions pour utiliser l'afficheur LCD : lcd_init: lcd_char: lcd_cmd: lcd_locate: lcd_clrscr : lcd_byte_d : lcd_word_d: Initialisation de l'afficheur. Doit tre invoque avant tout accs l'afficheur Affiche le caractre prsent dans W la position du curseur Envoie l'octet de commande prsent dans W Positionne le curseur la position prsente dans W Efface l'cran affiche l'octet prsent dans W en dcimal Affiche le word prsent dans les variables AH, AL en dcimal

LCD

R/W

RS

D7

D6

D5

D4 D3 D2 D1 D0

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

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

Chapitre V LES MMOIRES PERMANENTES


Le PIC 16F887 dispose de 2 mmoires permanentes. La mmoire EEPROM PROGRAMME de capacit 8k mots de 14 bits et la mmoire EEPROM DE DONNES de capacit 256 octets. On dispose de deux mthodes pour crire dans ces mmoires. La premire consiste flasher le PIC avec l'excutable (.hex). Les instructions sont flashs dans la EEPROM programme et les donne sont flashs dans la EEPROM de donnes. Le flashage se fait { laide dun programmeur et le soft qui va avec. Voir les directive DE et ORG (II.7.8, page 26) et dautres directives comme DA, DW dans le manuel dutilisation de MPASM. La deuxime mthode consiste accder aux mmoires EEPROM partir du programme durant la phase d'excution. Cest cette qui est dtaille dans les paragraphes suivants.

V.1

La mmoire EEPROM de donnes

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

(bank 2) (bank 2) (appel aussi EEDATA) (bank 3) (bank 3)


U U r/w(x) r/w(0) r/s(0) r/s(0)

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

Procdure de lecture dans la EEPROM

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

Procdure d'criture dans la EEPROM

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

La mmoire EEPROM Programme ou mmoire flash

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)

Procdure de lecture dans la mmoire programme


Mettre le bit EEPGD 1 pour pointer sur la mmoire programme Placer ladresse de la position lire dans EEADRH:EEADR Mettre le bit RD 1 pour dmarrer la lecture Excuter deux instructions NOP Lire le contenu des registres EEDATH:EEDAT Recommencer au point 2) si on a d'autres donnes lire

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)

Procdure d'criture dan la mmoire programme


Interdire les interruptions (si elles ont t valides auparavant), Mettre le bit EEPGD 1 pour pointer sur la mmoire programme, Positionner le bit WREN pour valider l'criture dans la mmoire programme, Placer ladresse de la position { crire dans EEADRH:EEADR, Placer la donne crire dans le registre EEDATH:EEDAT, Ecrire 55h dans EECON2 (commande de process hardwares), Ecrire AAh dans EECON2 (commandes de process hardwares), Positionner le bit WR pour dmarrer l'opration d'criture, Excuter 2 instructions NOP,

10) Recommencer au point 4 si on a d'autres donnes crire,

V.7

Mcanisme d'criture dan la mmoire programme

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

Bloc de 8 mots Bloc de 8 mots

Bloc de 8 mots Bloc 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

Chapitre VI LES INTERRUPTIONS


Une interruption est un vnement qui provoque larrt du programme principal pour aller excuter une procdure d'interruption. A la fin de cette procdure, le microcontrleur reprend le programme principal { lendroit o il la laiss. A chaque interruption sont associs deux bits, un bit de validation et un drapeau. Le premier permet d'autoriser ou non l'interruption, le second permet au programme de savoir de quelle interruption il s'agit. Sur le 16F887, l'es interruptions sont classes en deux catgories, les interruptions primaires et les interruptions priphriques. Elles sont gres par les registres :
INTCON PIE1 (bank1) PIR1 (bank0) PIE2 (bank1) PIR2 (bank0) IOCB (bank1) OPTION_REG(bk1) GIE OSFIE OSFIF IOCB7 PEIE ADIE ADIF C2IE C2IF IOCB6 INTEDG T0IE RCIE RCIF C1IE C1IF IOCB5 INTE TXIE TXIF EEIE EEIF IOCB4 RBIE SSPIE SSPIF BCLIE BCLIF IOCB3 T0IF CCP1IE CCP1IF ULPWUIE ULPWUIF IOCB2 INTF TMR2IE TMR2IF IOCB1 RBIF TMR1IE TMR1IF CCP2IE CCP2IF IOCB0

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

Droulement d'une interruption

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

Les sources d'interruption


Sources dinterruption Transition sur lentre RB0/INT Transition sur une entre du PORTB. (Interrupt On change on PORTB) Dbordement du Timer TMR0 Fin de conversion A/N Changement la sortie des comparateurs analogiques Dtection dune dfaillance sur un lment externe de lhorloge (Fail-Safe Clock Monitor Interrupt) Un Octet est reu sur l'USART Fin transmission d'un octet sur l'USART Dbordement de Timer TMR1 Timer TMR2 a atteint la valeur programme Capture/comparaison de TMR1 avec module CCP1 Capture/comparaison de TMR1 avec module CCP2 Fin d'criture en EEPROM Collision sur bus SSP en mode I2C Sorties priodiques du mode sleep (Ultra Low-Power Wake-up interrupt) Validation individuelle INTE IOCBx T0IE ADIE CxIE OSFIE RCIE TXIE TMR1IE TMR2IE CCP1IE CCP2IE EEIE BCLIE ULPWUIE Validation Globale GIE GIE RBIE GIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE GIE PEIE Drapeau INTF RBIF T0IF ADIF CxIF OSFIF RCIF TXIF TMR1IF TMR2IF CCP1IF CCP2IF EEIF BCLIF ULPWUIF

VI.3

L'interruption INT (Entre RB0 de PORTB)

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

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

DIV Figure VI-2: diviseur de frquence

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.

Figure VI-3: division de frquence par 3

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

Chapitre VII LES TIMERS


VII.1 Le Timer TMR0
Cest un compteur 8 bits ayant les caractristiques suivantes : Il est incrment en permanence soit par lhorloge interne Fosc/ 4 (mode timer) soit par une horloge externe applique la broche RA4 du port A (mode compteur). Le choix de l'horloge se fait l'aide du bit T0CS du registre OPTION_REG o T0CS = 0 horloge interne o T0CS = 1 horloge externe applique RA4 Dans le cas de l'horloge externe, Le bit T0SE du registre OPTION_REG permet de choisir le front sur lequel le TIMER s'incrmente. PS2 PS1 PS0 Div o T0SE = 0 incrmentation sur fronts montants 0 0 0 2 o T0SE = 1 incrmentation sur fronts descendants 0 0 1 4 0 1 0 8 Quelque soit l'horloge choisie, on peut la passer dans un diviseur de 0 1 1 16 frquence programmable (prescaler) dont le rapport DIV est fixs par les bits PS0, PS1 et PS2 du registre OPTION_REG (tableau ci-contre). 1 0 0 32 L'affectation ou non du prdiviseur se fait l'aide du bit PSA du registre 1 0 1 64 OPTION_REG 1 1 0 128 1 1 1 256 o PSA = 0 on utilise le prdiviseur o PSA = 1 pas de prdiviseur (affect au chien de garde) Le contenu du timer TMR0 est accessible par le registre qui porte le mme nom. Il peut tre lu ou crit n'importe quel moment. Aprs une criture, le timer ne sincrmente pas pendant deux cycles machine. Au dbordement de TMR0 (FFh 00h), le drapeau INTCON,T0IF passe 1. Ceci peut dclencher l'interruption T0I si celle-ci a t valide par les bits INTCON,GIE et INTCON,T0IE OPTION_REG
T0SE RA4
0 1

RBPU
T0CS
1 0

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

TH

PSA
1 Prdiviseur programmable 0

TF0 T0 TMR0 T0IF

Gnrateur Dhorloge Fosc

Fosc/4
PS2 PS1 PS0

TF0 = 256 x (DIV x TH)

Figure VII-1 : Schma bloc du timer TMR0

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)

VII.1.1 Programmes types: Clignoter LED, scrutation du drapeau T0IF


Le programme ci-dessous fait clignoter une LED branche sur la broche RB0. Le temps d'allumage/extinction de l'ordre de 0,5 secondes est obtenu grce au timer TMR0. Avec Fosc = 8 MHz, TH = Tosc = 0,5s. Il faut chercher un couple (CTR, DIV) qui vrifie: CTR 256 DIV 0,5 s = 500 000s. CTR peu prendre toutes les valeurs entre 1 et 256. DIV peut prendre les valeurs 2, 4, 8, 16, 32, 64, 128 ou 256. Il n'y a pas de solutions exactes. Les couple (CTR, DIV) qui donne le meilleur rsultat sont ( 244, 16) (122, 32) et (61, 64). Avec ses valeurs on obtient une temporisation de 0,4997 s Dans cette premire version du programme, on dtecte le dbordement de TMR0 en scrutant le drapeau T0IF l'aide de l'instruction btffs.
LED-TMR0-scrut.asm ;======================================================================= ; Programme qui fait clignoter une LED branche sur RB0 avec une temporisation voisine ; de 0.5s obtenue par scrutation du drapeau T0IF. Fosc = 8 MHz => Tcy = 0.5s ; 500 000 s = CTR DIV 256 0.5s => CTR = 122, DIV = 32 ;====================================================================== 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 BANK1 movlw movwf bcf bcf movlw movwf BANK0 movlw movwf btfss goto bcf decfsz goto movlw xorwf goto END 70h 0x71 OSCCON TRISB,0 INTCON,GIE B'00000100' OPTION_REG

; 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

VII.1.2 Programme type: Clignoter LED, interruption de TMR0


Dans cette deuxime version du programme, on dtecte le dbordement de TMR0 grce l'interruption T0I

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

VII.2 Le Timer TMR2

Figure VII-2 : fonctionnement du timer TMR2 (source : Microchip DS41291F)

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 :

VII.2.1 Cycle de comptage


La priodicit du drapeau TMR2IF est donne par : TF2 = PREDIV (PR2+1) POSTDIV Tcy .

Microcontrleur PIC16F887

A.OUMNAD

62

VII.2.2 Le registre T2CON:


TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

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

VII.2.3 Programme type : Clignoter une LED, Interruption de TMR2


On dsire faire clignoter une LED branche sur RD4 au rythme de la seconde. Le PIC est cadenc par l'horloge interne Fosc=8MHz. Il faut raliser CTR PREDIV (PR2+1) POSTDIV x Tcy = 500 000 s o Le compteur CTR peut prendre toutes les valeurs entre 1 et 256 (256=0) o PREDIV peut prendre une des valeurs 1, 4 ou 16 o PR2 peut prendre toutes les valeurs entre 0 et 255 o POSTDIV peut prendre toutes les valeurs entre 1 et 16 o Fosc = 8 MHz => Tcy = 0.5 s Plusieurs combinaisons sont possibles. Les utilisateurs de MATLAB peuvent utiliser la fonction cidessous pour afficher toutes les combinaisons possibles. Il suffit de l'invoquer par la ligne de commande : tmr2(8, 500000)
function tmr2(fosc_mhz,Tus) % tmr2(fosc_mhz,Tus)

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

Prenons CTR=200, PREDIV=4, PR2=249, POSTIV=5. On obtient le programme ci-dessous,


LED-RD4-TMR2-int.asm ;======================================================================= ; Clignoter la LED branche sur RD4 au rythme de la seconde ; Fosc = 8 MHz, TMR2: CTR=200, PREDIV=4, PR2+1 = 250, POSTDIV = 5 ;====================================================================== 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 70h org goto 0 main

; ========= 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

VII.2.4 Programme type : Signal asymtrique


On dsire gnrer un signal de rapport cyclique quelconque sur la sortie RD3.
T1 20 s T2 50 s T1 T2

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

Chapitre VIII LE MODULE DE CONVERSION ANALOGIQUE NUMRIQUE

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

Figure VIII-1 : Convertisseur Analogique Numrique

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

ANS7 0/1 RE2 N/ A

ANS6 0/1 RE1 N/ A

ANS5 0/1 RE0 N/ A

ANS4 0/1 RA5 N/ A

ANS3 0/1 RA3 N/ A

ANS2 0/1 RA2 N/ A

ANS1 0/1 RA1 N/ A

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

ANS8 0/1 RB2 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

VIII.1 Les registres ADCON0 et ADCON1


ADCON0 ADCS1 ADCS0 CHS3 CHS2 CHS1 CHS0 GO/DONE ADON

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

VIII.2 Droulement dune Conversion


Pendant la conversion, la tension Ve l'entre du convertisseur A/N doit tre maintenue constante. Pour cette raison, le PIC dispose dun chantillonneur bloqueur intgr constitu d'un interrupteur S et d'une capacit de maintien C=10 pF. Au dpart, l'interrupteur S est ferm pour permettre la capacit de se charger jusqu' la valeur du signal d'entre. C'est la phase d'acquisition. Aprs la fin de lacquisition, on peut dmarrer une conversion en positionnant le bit GO/DONE. L'interrupteur S souvre pour assurer le blocage de la tension d'entre par la capacit. La conversion commence, elle est ralise en 12 coups d'horloge (12 TAD). A la fin, le bit GO/DONE repasse 0, le drapeau ADIF passe 1 et le rsultat est charg dans les registres ADRESL et ADRESH. Le module met 2 TAD supplmentaires pour fermer l'interrupteur S ce qui dmarre une nouvelle phase dacquisition pendant laquelle la tension Ve rejoint la tension analogique d'entre Va. Aprs la fin de lacquisition, on peut dmarrer une nouvelle conversion et ainsi de suite. Le temps d'acquisition dpend de la constante de temps RC, R tant la somme des rsistances entre le module de conversion et la source de la tension analogique. A la fin de chaque conversion, le drapeau ADIF peut dclencher l'interruption ADI si elle a t valide au pralable par les bits GIE, PEIE et ADIE. L'interruption peut tre utilise pour sortir le PIC du mode sleep. Ve

Va Va S 10 pF Ve CAN

2Tad

12Tad

Tacq

GO/DONE nous ADIF


Figure VIII-2 : droulement d'une conversion

automatique

VIII.3 Temps de conversion


Le temps de conversion est : TCONV = 12 TAD

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

A.OUMNAD TAD = Div Tosc

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

VIII.4 Temps d'acquisition


Le temps d'acquisition est : TACQ = Tc + CT +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

VIII.5 Frquence d'chantillonnage


Si on veut chantillonner un signal variable, on peut constater sur la Figure VIII-2 que la priode d'chantillonnage Te doit tre suprieure ou gale : Temin = TCONV + 2 TAD + TACQ = 14 TAD + TACQ Avec Fosc = 20MHz, la priode dchantillonnage minimum est: Temin = 14 x 1.6 s + 4.62 s 27 s La frquence dchantillonnage maximale est de l'ordre: Femax = 1/Temin = 37 kHz

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.

VIII.6 Valeur numrique obtenue


Quelle est la relation entre la tension analogique convertie et le nombre N recueilli dans le double registre ADRESH:ADRESL ? Si on note : Q = pas de quantification = (Vref+ - Vref-)/1024 Va = tension analogique convertir N = valeur numrique obtenue, N = (Va Vref-) \ Q Avec Vref- = Vss = masse, on obtient N = (Va \ Q) exemple : Vref+ = Vdd = 5V, Vref- = 0, Va = 4 V Q = 5V/1024 = 0,0048828125 V N = 4V \ 0,0048828125V = 819 (\ : division entire)

VIII.7 Programmation en bref


Configurer les entres analogiques l'aide des registres ANSEL et ANSELH Configurer les entres analogiques en entres l'aide des registres TRISA, TRISB et TRISE Configurer le registre ADCON1 pour dfinir les tensions de rfrence et la justification du rsultat Configurer le registre ADCON0 pour choisir le diviseur, le canal analogique et valider le module Attendre le temps dacquisition ( 5 s ) Lancer la conversion en positionnant le bit GO_DONE, Attendre fin de conversion en scrutant le bit GO_DONE Traiter le rsultat

VIII.8 Programmes types


VIII.8.1 Prendre une seule mesure
Programme qui converti la tension applique RA0 et recopie ADRESL dans PORTC et ADRESH dans PORTD. On travaille ave Fosc = 4MHz, on obtient un temps de conversion meilleur qu'avec 8 MHz.
ADC-1ech.asm ;=================================================================== ; Prendre une mesure sur l'entre RA0 et et envoyer le rsultat sur PORTC et PORTD ;=================================================================== LIST p=16f887,r=dec INCLUDE <p16f887.inc> INCLUDE <mesmacros.inc> __CONFIG 0x2007 , 0x23E4 ; INTOSCIO __CONFIG 0x2008 , 0x3FFF EERORLEVEL -302 ;============================================================= BANK1 movlw 61h

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

; RA0 analogique ; tout le reste numrique

; 01 0000 0 1 ; DIV=8,Tad=2ms, canal 0, AD:en service ; attendre temps d'acquisition

ADCON0,GO ADCON0,GO $-1 ADRESH,w PORTD ADRESL,W PORTC

; lancer la conversion ; attendre fin conversion

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

Relever 40 chantillons, fe=8000 Hz

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.

IX.1.1 Mode 8 bits


Dans ce mode, 10 bits sont transmis ou reus dans l'ordre ci-dessous : o 1 bit de START (toujours 0) o 8 bits de donne (LSB d'abord) o 1 bits de STOP (toujours 1)

Microcontrleur PIC16F887

A.OUMNAD

74

IX.1.2 Mode 9 bits


Dans ce mode, 10 bits sont transmis ou reus dans l'ordre ci-dessous : o 1 bit de START (toujours 0) o 9 bits de donne (LSB d'abord) o 1 bits de STOP (toujours 1)

IX.2

Le port en transmission
TXREG

BRG

TSR

RC6/TX

Figure IX-1 : schma trs simplifi du module de transmission

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

Figure IX-2 : illustration de la transmission de deux octet successifs D0 et D1

Comme on vient de le voir, le drapeau TXIF est gr automatiquement, on ne peut pas le modifier directement par programme.

IX.2.1 Le registre de contrle TXSTA


R/W(0) R/W(0) R/W(0) R/W(0) R/W(0) R/W(0) R(1) R/W(0)

CSRC

TX9

TXEN

SYNC

SENDB BRGH TRMT

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

Figure IX-3 : schma trs simplifi du module de rception

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

(2) Aprs l'arriv de l'octet D0 FERR RCREG RCIF

(3) Aprs l'arriv de l'octet D1

FERR

RCREG

1 F1 D1
(5) Aprs lecture de l'octet D1

(4) Aprs lecture de l'octet D0

Figure IX-4 : fonctionnement de la pile de rception

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.

IX.3.1 Lecture du 9me bit


En mode 9 bits, la fin de la rception d'une donne, 8 bits sont copis de le buffer de rception RCREG. Le 9me bit et copi dans la position RX9D du registre RCSTA. Le bit RX9D doit tre lu avant la lecture du registre RCSTA sinon il est perdu. Ceci, comme on l'a dj vu avec le bit FERR, est d au fait que le buffer RCSTA est une pile deux positions. Chaque lecture dcale la pile vers le haut d'une position. Comme on peut le voir sur la figure ci-dessous, Si on reoit deux octets, chacun a son 9me bit. Si on commence par lire RCREG, la pile est dcale vers le haut. Le bit 9b0 est cras par le bit 9b1 alors qu'on ne l'a pas encore lu.
RX9D RCREG

9b0 9b1

Octet 0 Octet 1

Figure IX-5 : buffer de rception en mode 9bits

IX.3.2 Le registre de contrle RCSTA


R/W(0) R/W(0) R/W(0) R/W(0) R/W(0) R(0) R() R(x)

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.

IX.3.3 Mode dtection d'adresse


Ce mode fonctionne en rception mode 9 bits. Il est activ/dsactiv l'aide du bit ADDEN du registre RCSTA. Ce mode est utile dans le cas d'une communication point multipoints dans laquelle un maitre communique avec plusieurs esclaves sur la mme ligne. Chaque esclave tant identifi par une adresse. On peut ainsi raliser un systme de communication travers une liaison RS-485.

Maitre

Esclave 1

Esclave 2

Esclave 3

Interface RS-485

Interface RS-485

Interface RS-485

Interface RS-485

Figure IX-6 : Communication point multipoints

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

prcision 8 bits prcision 16 bits

Tableau IX-1 : paramtres de la formule qui dtermine la vitesse de communication

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

IX.4.1 Le registre BAUDCTL


Certains bits de ce registre concernent le mode dtection automatique de vitesse qui ne sera pas trait dans ce document.
R(0) R(1) U(0) R/W(0) R/W(0) U(0) R/W() R(x)

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

La transmission en bref (sans interruption)

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

La rception en bref (sans interruption)

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

Registres utiliss par l'USART


INTCON PIE1 PIR1 TXSTA RCSTA TXREG RCREG SPBRG SPBRGH TRISC BAUDCTL Bank all GIE PEIE T0IE INTE RBIE T0IF INTF 1 ADIE RCIE TXIE SSPIE CCP1IE TMR2IE 0 ADIF RCIF TXIF SSPIF CCP1IF TMR2IF 1 CSRC TX9 TXEN SYNC SENDB BRGH TRMT 0 SPEN RX9 SREN CREN ADDEN FERR OERR 0 Registre d'accs en transmission 0 Registre d'accs en rception 1 Dtermination de la vitesse de transmission 1 Dtermination de la vitesse de transmission en mode rsolution 16 bits 1 TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 3 ABDOVF RCIDL SCKP BRG16 WUE RBIF TMR1IE TMR1IF TX9D RX9D
RESET 0000 000x 0000 0000 0000 0000 0000 0010 0000 000x 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 01-0 0-00

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