Vous êtes sur la page 1sur 41

Rpublique Algrienne Dmocratique et Populaire Ministre de lEnseignement Suprieur et de la Recherche Scientifique Universit Abderrahmane Mira Bejaia

Facult de la Technologie Dpartement dElectronique

Thme

Programmation en C du Microcontrleur PIC 16F877

Prsent par : Mr. :BOUKARI Mansour

Encadr par : Mr. :HADJI Slimane

Master S1 2009/2010

Sommaire Introduction Gnrale...1 Chapitre 1 : Etude thorique du PIC 16F877


Introduction.2 1. 2. 3. 4. 5. 6. 7. Prsentation du microcontrleur PIC 16F877...2 Diffrents types de mmoire.5 Configuration de loscillateur (horloge) 6 Ports dEntres/Sorties7 Timers..11 Interface MSSP: (Master Synchronous Serial Port)..14 InterfaceUSART : (Universal Synchronous Asynchronous Receiver Transmitter)..15 8. Convertisseur Analogique-Numrique.......16 9. Modules CCP (Capture/Compare/PWM) ..18 Conclusion.....20

Chapitre 2 : Programmation en C et application


Introduction.21 1. 2. 3. 4. Choix du compilateur.21 Quelques notions de programmation en C sous SourceBoost..21 Structure dun programme.27 Exemple dapplication27 Conclusion.32

Conclusion Gnrale....33 Bibliographie

Introduction Gnrale
Le dveloppement des applications base des microcontrleurs PIC est devenu de plus en plus courant, ceci est d plusieurs causes : beaucoup de ressources internes (priphriques intgrs), mmoires embarques de plus en plus grande, vitesse de calcul accrue En effet, un microcontrleur est un composant parfaitement adapt des applications embarques, il permet, en le programmant, deffectuer et de contrler une tche tout en comparant son tat des conditions prfixes par lutilisateur. Lutilisation des microcontrleurs fait appel tout dabord leur programmation. Il existe plusieurs mthodes de programmation selon le langage utilis, par exemple en assembleur on peut crire un programme o on va tirer le maximum des performances du microcontrleur mais ce programme ncessite beaucoup de travail et surtout beaucoup de temps. Heureusement, avec la monte en puissance des microcontrleurs, on voit apparaitre des compilateurs en langage C qui permettent de gagner un temps considrable pour le dveloppement des programmes. Dans ce travail notre choix est port vers le PIC 16F877. Dans le premier chapitre nous allons tudier dune manire gnrale ce microcontrleur et ses diffrentes ressources internes, ensuite un deuxime chapitre destin la programmation de ce microcontrleur en langage C en utilisant le compilateur SourceBoost, dans ce chapitre nous allons exposer quelques notions de programmation en C et de proposer un exemple dapplication.

Chapitre 1

Etude thorique du PIC 16F877

Introduction :
Un microcontrleur est un composant lectronique ayant une unit de traitement de donnes, des mmoires, des interfaces de communication (entres/sorties, ports sries . . .) et de multiple ressources interne. Souvent un microcontrleur se contente dun bus de donnes de 8-bits ou 16-bits, on peut dire alors quil est moins puissant quun microprocesseur.

1 Prsentation du microcontrleur PIC 16F877 :


Dfinition dun PIC : [1]
Un PIC (Programmable Interface Controller) est un microcontrleur de Microchip Technology Inc. Un PIC est un composant dit RISC (Reduced Instructions Set Computer), ou encore composant jeu dinstruction rduit. Ces microcontrleurs sont conus sur une architecture dite HAVARD, elle est base sur deux bus, un pour les donnes (bus de donnes) et lautre pour les instructions (bus de programme).

Diffrentes familles des PICs : [2]


La famille des PICs est subdivise en trois grandes familles : Base line : cest la famille o lunit centrale travaille sur 12-bits, exemple : 12CXXX Mid-Range : cest la famille o lunit centrale travaille sur 14-bits, exemple : 16F877. High Performance : cest la famille o lunit centrale travaille sur 16-bits, exemple : 18FXXX, 18CXXX

Identifier un PIC :[3]


La rfrence dun microcontrleur PIC est de la forme NN LLL XXX o : NN dsigne la famille laquelle appartient le circuit. LLL est un ensemble dune, deux ou trois lettres qui indique le type de mmoire de programme contenue dans le circuit et si la plage de tension dalimentation est normale ou tendue. XXX est un ensemble de deux ou trois chiffres constituant la rfrence du circuit.

Exemple du 16F877-20 : 16 : indique la famille Mid-Range. F : indique le type de mmoire programme utilise : F pour Flash. 877 : identit. 20 : indique la frquence dhorloge.

1.1 Principales caractristiques du PIC 16F877 : [4]


Un PIC 16F877 possde les caractristiques suivantes : 2

Chapitre 1

Etude thorique du PIC 16F877

Une frquence de fonctionnement allant jusqu 20MHz. Jeu dinstructions de 35 instructions. Une mmoire de programme de type FLASH sur 8K mots (1 mot=14 bits). Une mmoire de donnes de type RAM sur 368 octets. Une mmoire de donnes de type EEPROM sur 256 octets. Une pile (Stack) 8 niveaux. 14 sources dinterruptions. Un chien de garde WDT (Watch Dog Timer). Timer0 (compteur 8-bits avec pr-diviseur). Timer1 (compteur 16-bits avec pr-diviseur et possibilit dutiliser une horloge externe). Timer2 (compteur 8-bits avec pr-diviseur et post-diviseur). Un convertisseur Analogique-Numrique 10-bits 8 entres multiplexes. Deux modules de capture/comparaison/PWM. Ports Entres/Sorties : A, B, C, D et E. Une interface de communication srie (MSSP, USART). Une interface de communication parallle (PSP). Tension de fonctionnement est entre 2.0V et 5.5V.

1.2 Brochage du PIC 16F877 : [4]


Le boitier ci-contre dcrit larchitecture externe du 16F877 qui comprend 40 pins dont : 33 pins dentres/sorties multiplexes avec dautres fonctions. 4 pins pour lalimentation : VDD et VSS. 2 pins pour loscillateur : OSC0 et OSC1. 1 pin pour le RESET : MCLR.

Figure 1.2.2 : Brochage du 16F877

Chapitre 1
1.3 Architecture interne : [4]

Etude thorique du PIC 16F877

Figure 1.2.3 : Architecture interne du PIC16F877. Une fois le programme est stock dans la mmoire (Program Memory) et le C est initialis, linstruction excuter est dsigne par le PC (Program Counter) et sera charge dans le registre dinstruction (Instruction reg) au moyen dun bus de programme sur 14-bits, puis elle sera dcode dans le dcodeur et le contrleur dinstruction (Instruction Decode & Control) et ensuite dirige vers lUAL (ALU) avec les donnes charges partir des pins configures comme entres, lUAL fera lopration ncessaire et sauvegardera le rsultat temporairement dans le registre de travail (W reg) sur 8-bits, ce rsultat sera aussi mit dans la RAM laide dun bus de donnes sur 8-bits.

Chapitre 1

Etude thorique du PIC 16F877

1.4 Registres de Fonction Spciale (SFR : Special Function Registers) : [4]


Les SFR sont des registres utiliss par lunit centrale et les modules priphriques, ils sont implments comme une RAM statique. Ils jouent le rle dun tableau de bord pour configurer les diffrentes ressources internes du PIC, parmi ces registres il y a : 1.4.1 Registre STATUS :( adresses: 03h, 83h, 103h, 183h) Contient les diffrents bits flags lis aux oprations arithmtiques, les indicateurs de RESET et le bit de slection de la BANK mmoire. 1.4.2 Registre OPTION_REG :(adresses : 81h, 181h) Ce registre peut tre lu et crit, il contient les bits de contrle qui permettent de configurer le prdiviseur, les interruptions externes, le TMR0 et le pull-up sur le PORTB. 1.4.3 Registre INTCON :(adresses : 0Bh, 8Bh, 10Bh, 18Bh) Cest le registre de contrle des interruptions.

2 Diffrents types de mmoire :


Le 16F877 possde 3 types de mmoire : Une mmoire FLASH pour stocker le programme. Une RAM pour les donnes. Une EEPROM pour les donnes.

2.1 La mmoire FLASH :


Est une mmoire qui peut tre crite et efface lectriquement. Elle est conue pour stocker le programme et elle est sur 8k mots (1 mot=14-bits).

Figure 1.3.1 : Organisation de mmoire programme

2.2 La RAM et lEEPROM :


La RAM est sur 368 octets, elle sert stocker les donnes temporaires (rsultat de lUAL), elle comprend tous les registres de fonction spciale. Cette mmoire est partitionnes en 4 parties, chaque partie est appele BANK et comporte 7Fh adresses (i.e 128 octets), chaque BANK peut tre slectionn partir des bits RP1 et RP0 du registre STATUS comme suit :

Chapitre 1

Etude thorique du PIC 16F877

RP1 :RP0 00 01 10 11

BANK 0 1 2 3

Tableau 1.3 : Slection des BANKs.

LEEPROM est sur 256 octets prvue pour sauvegarder les donnes en cas de perte dalimentation, le nombre de cycle lecture/criture est limit lordre de 106 cycles.

3 Configuration de loscillateur (horloge) : [4]


Le PIC 16F877 peut fonctionner en 4 modes doscillateur : LP : Low Power crystal : quartz faible puissance. XT : Crystal/Resonator : quartz/rsonateur en cramique. HS : High Speed crystal/resonator : quartz haute frquence/rsonateur en cramique HF. RC : circuit RC.

Chacun de ces modes peut tre slectionn travers les bits de configuration FOSC1 et FOSC0 (registre : CONFIGURATION WORD 2007h), comme suit : FOSC1 :FOSC0 00 01 10 11 Mode LP XT HS RC Tableau 1.4 : Configuration de loscillateur.

3.1 Oscillateur en Quartz ou Rsonateur Cramique :


En mode LP, XT ou HS, un quartz ou un rsonateur en cramique est connect aux pins OSC1/CLKIN et OSC2/CLKOUT pour tablir loscillation. La figure suivante montre comment ce quartz ou ce rsonateur en cramique est connect au microcontrleur :

Figure 1.4.1 a) : Oscillateur en quartz/ rsonateur. Toujours dans lun de ces modes de fonctionnement, le microcontrleur peut avoir une horloge externe connecte la broche OSC1/CLKIN comme le montre la figure suivante :

Chapitre 1

Etude thorique du PIC 16F877

Figure 1.4.1 b) : Connexion dune horloge externe.

3.2 Oscillateur RC :
La frquence de loscillation dpend du voltage, des valeurs de R et C et de la temprature de fonctionnement. La figure (1.4.2) montre comment connecter un circuit RC au microcontrleur :

Figure 1.4.2 : Oscillateur RC.

4 Ports dEntres/Sorties : [4]


Le PIC 16F877 dispose de 5 ports entres/sorties (au total 33 pins) : port A, B, C, D et E. De plus il y a le PSP (Parallel Slave Port) : le Port Parallle Esclave.

4.1 PORT A :
Le PORTA est un port bidirectionnel de 6-bits (6 entres/sorties) : de RA0 jusqu' RA5; le registre correspondant qui dfinit la direction des donnes est le TRISA, la mise 1 dun bit du TRISA configura la broche correspondante ce bit comme entre, et la mise 0 de ce bit mettra la broche correspondante comme sortie. La broche RA4 est multiplexe avec une autre fonction qui est lentre pour lhorloge du TIMER0, cette broche deviendra donc RA4/T0CKI. Les autres pins sont multiplexes avec les entres analogiques du CAN et lentre VREF, pour cela, le registre ADCON1 permet de dterminer la fonction de chaque pin.

Chapitre 1

Etude thorique du PIC 16F877


Tableau 1.5.1 : Rsum des registres associs avec le PORTA

Valeur Adresse Nom Bit-7 Bit- Bit- Bit- Bit-3 Bit-2 Bit-1 Bit-0 sur 6 5 4 POR, BOR --0x 0000 05h PORTA RA5 RA4 RA3 RA2 RA1 RA0 --11 1111 85h TRISA Registre de direction des donnes PORTA 9Fh ADCON1 ADFM PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000

Valeur sur autres RESET --0u 0000 --11 1111 --0- 0000

x : inconnu, u : inchang, - : emplacements non implments (0), les cellules ombrages ne sont pas utilises par le PORTA. Au dmarrage (Power-On Reset POR), les pins de ce port sont configurs comme des entres analogiques et lus comme 0.

4.2 PORT B :
Le PORTB est un port bidirectionnel de 8-bits (8 entres/sorties) : de RB0 jusqu' RB7; le registre correspondant qui dfinit la direction des donnes est le TRISB, la mise 1 dun bit du TRISB configura la broche correspondante ce bit comme entre, et la mise 0 de ce bit mettra la broche correspondante comme sortie. En mode entre, chaque broche du PORTB doit tre maintenue un niveau haut laide des rsistances de pull-up, ceci en mettant 0 le bit RBPU (du registre OPTION). En mode sortie ou lors dun POR (Power-On Reset), ces pull-ups sont dsactivs. Un changement dtat sur lune des broches RB4, RB5, RB6 et RB7 dclenche une interruption, ceci nest possible que pour celles qui sont configures comme entres. Tableau 1.5.2 : Rsum des registres associs avec le PORTB Valeur Bit- sur 0 POR, BOR RB0 xxxx xxxx 1111 1111 PS0 1111 1111 Valeur sur autres RESET uuuu uuuu 1111 1111 1111 1111

Adresse Nom

Bit-7

Bit-6

Bit-5 Bit-4

Bit-3

Bit-2

Bit-1

06h, 106h 86h, 186h 81h, 181h

PORTB TRISB

RB7

RB6

RB5

RB4

RB3

RB2

RB1

Registre de direction des donnes PORTB INTEDC T0CS T0SE PSA PS2 PS1

OPTION_REG RBPU

x : inconnu, u : inchang, les cellules ombrages ne sont pas utilises par le PORTB.

4.3 PORT C :
Le PORTC est un port bidirectionnel de 8-bits (8 entres/sorties) : de RC0 jusqu' RC7; le registre correspondant qui dfinit la direction des donnes est le TRISC, la mise 1 dun bit du TRISC configura la broche correspondante ce bit comme entre, et la mise 0 de ce bit mettra la broche correspondante comme sortie. 8

Chapitre 1

Etude thorique du PIC 16F877


Tableau 1.5.3 : Rsum des registres associs avec le PORTC

Adresse Nom

Bit-7

Bit6

Bit5

Bit4

Bit-3

Bit-2

Bit-1

Bit-0

07h PORTC RC7 87h TRISC x : inconnu, u : inchang.

RC6 RC5 RC4 RC3 RC2 RC1 Registre de direction de donnes PORTC

RC0

Valeur sur POR, BOR xxxx xxxx 1111 1111

Valeur sur autres RESET uuuu uuuu 1111 1111

4.4 PORT D :
Le PORTD est un port bidirectionnel de 8-bits (8 entres/sorties) : de RD0 jusqu' RD7; le registre correspondant qui dfinit la direction des donnes est le TRISD, la mise 1 dun bit du TRISD configura la broche correspondante ce bit comme entre, et la mise 0 de ce bit mettra la broche correspondante comme sortie. Le PORTD peut tre configur comme port parallle esclave : PSP (Parallel Slave Port) en mettant 1 le bit PSPMODE du registre TRISE.

Tableau 1.5.4 : Rsum des registres associs avec le PORTD Valeur sur POR, BOR Valeur sur autres RESET uuuu uuuu 1111 1111 0000 -111

Adresse Nom

Bit-7

Bit6

Bit-5

Bit-4

Bit-3

Bit-2

Bit-1

Bit-0

RD6 RD5 RD4 RD3 RD2 RD1 RD0 xxxx xxxx 1111 1111 Registre de direction de donnes PORTD IBF OBF IBOV PSPMODE Registre de direction 0000 -111 de donnes PORTE x : inconnu, u : inchang, - : emplacements non implments (0), les cellules ombrages ne sont pas utilises par le PORTD. 08h 88h 89h PORTD TRISD TRISE RD7

4.5 PORT E :
Le PORTE a 3 broches : RE0, RE1 et RE2, configurables en entres ou en sorties partir des trois premiers bits du registre TRISE. Ces broches sont multiplexes avec les entres du CAN (Convertisseur Analogique Numrique). Au dmarrage (Power-On Reset POR), les pins de ce port sont configurs comme des entres analogiques et lus comme 0.

Chapitre 1

Etude thorique du PIC 16F877

Tableau 1.5.5 : Rsum des registres associs avec le PORTE Valeur sur POR, BOR ---- -xxx 0000 -111 Valeur sur autres RESET ---- -uuu 0000 -111

Adresse Nom

Bit-7

Bit6

Bit-5

Bit-4

Bit-3

Bit-2

Bit-1

Bit-0

09h 89h

RE2 RE1 RE0 Registre de direction de donnes PORTE 9Fh ADCON1 ADFM PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000 x : inconnu, u : inchang, - : emplacements non implments (0), les cellules ombrages ne sont pas utilises par le PORTE.

PORTE TRISE

IBF

OBF IBOV PSPMODE -

4.6 Port Parallle Esclave (PSP: Parallel Slave Port) : [4]


Cest le PORTD qui fonctionne en PSP (sur 8-bits) quand le bit de contrle PSPMODE (du registre TRISE) est 1. La mise 1 du bit PSPMODE activera aussi les pins RD (Read), WR (Write) et CS (Chip Select) (physiquement sont celles du PORTE). Pour cette fonctionnalit, les broches du PORTE doivent tre configures en entres (mise 1 des bits 0, 1 et 2 dans TRISE) et aussi il faut mettre les 4 premiers bits du registre ADCON1 1 pour que le PORTE soit en E/S numriques (pas de conversion A/N sur ce port). Le PSP peut interfacer directement avec un microprocesseur 8-bits (bus de donnes sur 8-bits) laide des broches : CS : pour valider le PIC. RD : pour indiquer au PIC quil doit lire. WR : pour indiquer au PIC quil doit crire.

Lcriture dans le PSP ce fait lorsque CS et WR sont 0, et quand lune de ces broches se met 1 le bit flag IBF (Input Buffer Full) (du registre TRISE) se met 1 pour signaler la fin de lcriture. La lecture du PSP ce fait lorsque CS et RD sont 0. Ds la mise 0 de ces derniers, le bit flag OBF (Output Buffer Full) (du registre TRISE) se met immdiatement 0 pour indiquer que le PORTD est en attente pour tre lue par le bus externe. Quand CS ou RD se met 1, cest la fin de la lecture et qui sera signale par le bit PSPIF (PSP Interrupt Flag) (du registre PIR1) en se mettant 1. Quand le mode PSP est dsactiv, les bits IBF et OBF doivent tre 0. Cependant, mme si le bit IBOV tait 1, il doit tre effac par logiciel.

10

Chapitre 1 5 Timers :[4]


5.1 Timer0 :
Le Timer0 est un 8-bits temporisateur /compteur.

Etude thorique du PIC 16F877

En mode temporisateur, slectionn en mettant 0 le bit T0SC (OPTION_REG), lincrmentation du Timer0 se produit chaque cycle dinstruction sans le pr-diviseur, lcriture dans le registre TMR0 fait que lincrmentation sera arrte durant les deux cycles dinstruction suivants. Le mode compteur est slectionn en mettant 1 le bit T0SC (OPTION_REG), dans ce cas le Timer0 sera incrment soit sur front montant soit sur front descendant de lhorloge externe sur la patte RA4/T0CKI. Le front dincrmentation est slectionn partir du bit T0SE (OPTION_REG). Le Timer0 peut engendrer une interruption lors dun dbordement de FFh 00h, ce dbordement mit 1 le bit T0IF (INTCON) pour signaler linterruption, aprs la fin de linterruption ce bit doit tre effac par logiciel. Il suffit de mettre 0 le bit T0IE (INTCON) pour dsactiver linterruption du Timer0. Pour ce module Timer0 un pr-diviseur (Prescaler) est disponible et il est partag avec le Timer Chien de garde WDT (Watchdog Timer), lassignation du pr-diviseur au Timer0 fait que le WDT na pas de pr-diviseur associ, et vice-versa. Lassignation et la slection de taux de division de frquence se fait laide des bits PSA (pour lassignation) et PS2 :PS0 (pour le taux) (registre OPTION_REG). Quand le pr-diviseur est assign au Timer0, lcriture dans le registre TMR0 efface le pr-diviseur mais ne change pas son assignation, et aussi, cette criture fait que lincrmentation ne reprenne quaprs un dlai de trois cycles dinstructions.

Figure1.6.1 : Schma interne du Timer0

5.2 Timer1 :
Le Timer1 est un temporisateur/compteur 16-bits, il possde 2 registres : TMR1H et TMR1L chacun est sur 8-bits qui sincrmentent de 0000h FFFFh. Le Timer1 dclenche une interruption sur un passage de FFFFh 0000h (dbordement du Timer1), cette interruption est signale par la mise 1 du bit TMR1IF (registre PIR1). Cette interruption peut tre active/dsactive en mettant 1/0 le bit TMR1IE (registre PIE1). Ce module peut tre activ/dsactiv laide du bit TMR1ON (registre T1CON) ,1/0. Le Timer1 fonctionne en deux modes : 11

Chapitre 1
a. Mode temporisateur :

Etude thorique du PIC 16F877

Dans ce cas le Timer1 est incrment chaque cycle dinstruction. Ce mode est slectionn en mettant 0 le bit TMR1CS (registre T1CON), cependant lhorloge du timer est FOSC/4 et le bit de contrle de synchronisation avec lhorloge interne T1SYNC (registre T1CON) na pas deffet puisque lhorloge utilise est linterne.

b. Mode compteur :
Ce mode est slectionn en mettant 1 le bit TMR1CS. Et ds que le Timer1 est activ en mode compteur, le module doit avoir un front descendant avant que lincrmentation ne commence. Cependant le Timer1 fonctionne soit en mode synchrone, soit en mode asynchrone. En mode synchrone, slectionn en mettant 0 le bit T1SYNC, le timer est incrment chaque front montant de lhorloge externe sur la patte RC1/T1OSI/CCP2 si le bit T1OSCEN est mis 1, ou sur la patte RC0/T1OSO/T1CKI si le bit T1OSCEN est mis 0. Dans ce cas lhorloge externe est synchronise avec la phase de lhorloge interne. Dans cette configuration et durant le mode SLEEP (mode sommeil), lincrmentation du timer est arrte puisque le circuit de synchronisation est arrt. En mode asynchrone, slectionn en mettant 1 le bit T1SYNC, le timer est incrment chaque front montant de lhorloge externe sans que cette dernire ne soit synchronise avec lhorloge interne. Dans cette configuration et durant le mode SLEEP (mode sommeil), le timer continu lincrmentation et peut gnrer une interruption sur un dbordement qui rveille le C de son sommeil. Remarque : [3] Il existe deux sources dhorloge externe : un signal externe appliqu la patte RC0/T1OSO/T1CKI, ou il peut utiliser le signal dun oscillateur qui lui est propre en mettant 1 le bit T1OSCEN, ralis en connectant un quartz entre les pattes RC0/T1OSO/T1CKI et RC1/T1OSI/CCP2.

Registre T1CON :(adresse : 10h) U-0 Bit7 U-0 L/E-0 L/E-0 L/E-0 L/E-0 T1CKPS1 T1CKPS0 T1OSCEN T1SYNC L/E-0 TMR1CS L/E-0 TMR1ON Bit0

Bit 7 Non-implment : Lire comme 0. Bit 6 Non-implment : Lire comme 0. Bit 5:4 T1CKPS1:T1CKPS0 : Bits de slection du taux de pr-division de lhorloge du Timer1. 11 = 1:8 10 = 1:4 01 = 1:2 00 = 1:1 Bit 3 T1OSCEN : Bit de contrle de validation de loscillateur du Timer1. 1 = Oscillateur activ. 0 = Oscillateur dsactiv. Bit 2 T1SYNC : Bit de contrle de synchronisation de lhorloge externe du Timer1. Quand TMR1CS = 1 : 1 = Ne pas synchroniser lhorloge externe entrante. 0 = Synchroniser lhorloge externe entrante.

12

Chapitre 1

Etude thorique du PIC 16F877

Bit 1

Bit 0

Quand TMR1CS = 0 : Ce bit est ignor. Le Timer1 utilise lhorloge interne quand TMR1CS = 0. TMR1CS : Bit de slection de source dhorloge du Timer1. 1 = Horloge externe sur la pin RC0/T1OSO/T1CKl (sur le front montant). 0 = Horloge interne (FOSC / 4). TMR1ON : Bit de mise en marche du Timer1. 1 = Active le Timer1. 0 = Stoppe le Timer1.

Figure1.6.2 : Schma interne du Timer1

5.3 Timer2 :
Le Timer2 est un temporisateur 8-bits avec un pr-diviseur, un post-diviseur et un registre sur 8-bits PR2 dit registre de priode. Le registre TMR2 est incrment, laide de lhorloge interne (FOSC/4), de 00h jusqu une valeur spcifie dans le registre PR2, puis il recommence de 00h. Lorsquil y a une galit entre le contenu du registre TMR2 et celui du PR2, un signal sera appliqu au post-diviseur (4-bits) pour gnrer une interruption. Le Timer2 est arrt sur la mise 0 du bit TMR2ON (du registre T2CON).

Registre T2CON :(adresse : 12h) U-0 Bit7 L/E-0 L/E-0 L/E-0 L/E-0 L/E-0 L/E-0 L/E-0 TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 Bit0

Bit 7 Non-implment : Lire comme 0. Bit 6:3 TOUTPS3:TOUTPS0 : Bits de slection du taux de post-division de la sortie du Timer2. 0000 = 1:1 valeur de post-division. 0001 = 1:2 valeur de post-division. . . . 1111 = 1:16 valeur de post-division. Bit 2 TMR2ON : Bit de mise en marche du Timer2. 1 = Active le Timer2. 0 = Stoppe le Timer2. Bit 1:0 T2CKPS1:T2CKPS0 : Bits de slection du taux de pr-division de lhorloge du Timer2. 13

Chapitre 1
00 = Pr-division par 1. 01 = Pr-division par 4. 1x = Pr-division par 16.

Etude thorique du PIC 16F877

Figure1.6.3 : Schma interne du Timer2

6 Interface MSSP: (Master Synchronous Serial Port): [4]


Le MSSP est une interface de communication srie, qui permet une communication srie avec des microcontrleurs et dautres composants priphriques (EEPROMs sries, afficheurs LCD, CAN). Le MSSP fonctionne en deux modes : Mode SPI (Serial Peripheral Interface). Mode I2C (Inter-Inegrated Circuit).

6.1 Mode SPI:


Ce mode permet, de faon synchrone, de transmettre et de recevoir simultanment des donnes sur 8-bits, ceci en utilisant 3 pattes et peut tre 4 : La patte SDO (Serial Data Out): est la sortie des donnes. La patte SDI (Serial Data In): est lentre des donnes. La patte SCK (Serial Clock) : est utilise pour synchroniser lchange des donnes, elle est en sortie sur le maitre et une entre sur lesclave. La mise 1 du bit CPK (registre SSPCON adresse : 14h) permettra de valider les donnes sur front descendant, et sur front montant si 0. La patte SS (Slave Select) : permet de slectionner soit le mode matre, soit le mode esclave.

Le port MSSP est activ en mettant 1 le bit SSPEN (registre SSPCON). Pour redmarrer et reconfigurer le mode SPI, on mit 0 le bit SSPEN, rinitialise le registre SSPCON, ensuite on mit 1 le bit SSPEN. Ceci configure les pattes SDO, SDI, SCK et SS pour le MSSP.

14

Chapitre 1

Etude thorique du PIC 16F877

Une donne est reue/transmise sil y aura une criture dans le registre SSPBUF, et quand cette opration est tablie, le bit SSPIF se mit 1 pour le signaler (dclanchement dune interruption). En mode matre, le C peut transfrer les donnes mimporte quel moment parce que cest lui qui contrle lhorloge (SCK). Tandis quen mode esclave, les donnes sont reues ou transmises chaque coup de lhorloge (SCK).Cependant, il peut recevoir/transmettre des donnes en mode SLEEP, le C sveillera lors de la rception de donnes.

6.2 Mode I2C :


Dans ce cas deux pattes sont utilises pour le transfert des donnes, SCL qui est la patte de lhorloge, et SDA qui est la patte des donnes. Ce mode est activ an mettant 1 le bit SSPEN (registre SSPCON). Le transfert de donnes se fait travers le registre SSPSR qui nest accessible qu partir le registre SSPBUF, donc les donnes qui seront transmises/reues, seront crites dans le registre SSPBUF. Vu quon peut connecter plusieurs matres/esclaves dans ce cas, le C utilise des adresses pour linformation envoye ne sera prise en compte que par le composant de destination.

7 Interface USART :( Universal Synchronous Asynchronous Receiver Transmitter): [4]


Le module USART est un module de communication srie, il est connu aussi sous SCI (Serial Communications Interface). LUSART peut tre configur en 3 modes de fonctionnement : Asynchrone (Full Duplex). Synchrone Matre (Half Duplex). Synchrone Esclave (Half Duplex). Le bit SPEN (registre RCSTA) et les bits 6 et 7 du registre TRISC doivent tre 1 pour que les deux pattes RC6/TX/CK et RC7/RX/DT soient configures en USART.

7.1 Mode Asynchrone :


En mode asynchrone (Full Duplex) lUSART peut communiquer avec les micro-ordinateurs, on peut slectionner ce mode en mettant 0 le bit SYNC (du registre TXSTA ladresse 98h). mission asynchrone : Elle suit la procdure suivante : Initialisation du registre SPBRG par une valeur pour dterminer la vitesse de transmission. Validation du port asynchrone srie. Si on dsire des interruptions, on doit mettre 1 le bit TXIE (bit de validation de linterruption de transmission de lUSART) (registre PIE1 ladresse 8Ch). Si on dsire transmettre 9-bits, on doit mettre 1 le bit TX9 (registre TXSTA). Validation de la transmission en mettant 1 le bit TXEN (registre TXSTA), ce qui mettra le bit TXIF (registre PIR1, adresse 0Ch) 1. Ecriture du 9me bit dans TX9D (registre TXSTA), si la transmission 9-bits est slectionne. 15

Chapitre 1

Etude thorique du PIC 16F877

Ecriture de loctet transmettre dans le registre TXREG (dbut de la transmission). Si on utilise les interruptions, il faut sassurer que les bits GIE et PEIE (registre INTCON) sont 1.

Rception asynchrone :
Elle suit la procdure suivante : Initialisation du registre SPBRG par une valeur pour dterminer la vitesse dmission. Validation du port asynchrone srie. Si on dsire des interruptions, on doit mettre 1 le bit RCIE (bit de validation de linterruption de rception de lUSART) (registre PIE1 ladresse 8Ch). Si on dsire recevoir 9-bits, on doit mettre 1 le bit TX9 (registre RCSTA, adresse 18h). Validation de la rception en mettant 1 le bit CREN (registre RCSTA). Gnration dune interruption lors de la fin de rception, qui sera signale par la mise 1 du bit RCIF (registre PIR1). Cette interruption ne sera gnrer que lorsque le bit de validation de linterruption RCIE (registre PIE1) est 1. Lecture du registre RCSTE pour avoir le 9me bit (si la rception 9-bits est valide). Lecture du registre RCREG pour avoir loctet reu. Si on utilise les interruptions, il faut sassurer que les bits GIE et PEIE (registre INTCON) sont 1.

7.2 Mode synchrone :


En mode synchrone (Half Duplex) lUSART peut communiquer avec des composants priphriques tels que les circuits intgrs CAN et CNA, les EEPROMs sries ect. Le principe est le mme que celui du mode asynchrone avec deux diffrences majeures : mission et rception simultanes ne sont pas possibles, le fait dactiver lune dsactive automatiquement lautre. Lorsque lUSART est en mode matre, cest lui qui fournit lhorloge sur la patte RC6/TX/CK une frquence fixe par le contenu du registre SPBRG ; lorsquil est en mode esclave, il reoit lhorloge sur cette mme patte RC6/TX/CK.

8 Convertisseur Analogique-Numrique : [4]


Ce module de conversion convertit un signal analogique prsent sur lune de ces 8 entres son quivalent numrique sur 10-bits. Le CAN a deux tensions de rfrence : haute et basse, qui sont choisis par programmation parmi VDD, VSS, RA2 ou RA3.De plus, il y a 4 registres qui lui sont associs: ADCON0 : qui est un registre de contrle des oprations du CAN, il est disponible ladresse 1Fh. ADCON1 : qui est un registre de configuration du CAN, il est disponible ladresse 9Fh. ADRESL : registre de rsultat de la conversion, il contient les bits du poids faible, disponible ladresse 9Eh.

16

Chapitre 1

Etude thorique du PIC 16F877

ADRESH : registre de rsultat de la conversion, il contient les bits du poids fort, disponible ladresse 1Eh. Pour effectuer une conversion A/N, voici les tapes suivre :

1. Configuration du module CAN : Configuration du port entre pour le CAN et les tensions de rfrence (par le registre ADCON1 bits 3 :0). Slection du canal dentre analogique (par le registre ADCON0 bits 5 :3). Slection de lhorloge de conversion (par le registre ADCON0 bits 7 :6). Mise en route du module CAN (par le registre ADCON0 bit 0). 2. Configuration de linterruption (cette tape nest pas obligatoire) : Mise 0 du bit ADIF (registre PIR1). Mise 1 du bit ADIE (registre PIE1). Mise 1 du bit PEIE (registre INTCON). Mise 1 du bit GIE (registre INTCON). 3. Attendre ce que lacquisition soit faite (temps dacquisition). 4. Dmarrer la conversion : Mettre 1 le bit GO/DONE (registre ADCON0). 5. Attendre ce que la conversion soit termine : Signale par la mise 0 du bit GO/DONE, ou par une interruption. 6. Lire le rsultat de la conversion. Le rsultat est stock dans les registres ADRESH : ADRESL, et mettre 0 le bit ADIF si cest ncessaire. 7. Pour effectuer une deuxime conversion, il faut attendre au moins 2 fois le temps de conversion par bit.

Remarque :
Du fait que le registre pair du rsultat (ADRESH : ADRESL) est sur 16-bits, on a donc la possibilit de justifier le rsultat (qui est sur 10-bits) soit gauche en mettant 0 le bit ADFM (registre ADCON1), soit droite en mettant le bit ADFM 1.

8.1 Choix de lhorloge de conversion :


Cest le temps de conversion par bit (TAD), il existe 4 possibilits pour effectuer ce choix, le tableau suivant montre comment ce temps est choisi : Tableau 1.9.1 : valeurs de TAD. ADCS1 :ADCS0 Frquence max. du composant (registre ADCON0) 2TOSC 00 1.25 MHz 8TOSC 01 5 MHz 32TOSC 10 20 MHz RC interne du CAN 11 Inferieure 1 MHz Le fonctionnement du CAN continu durant un SLEEP condition dutiliser lhorloge RC interne. TAD

17

Chapitre 1

Etude thorique du PIC 16F877

Figure 1.9 : Schma du module de conversion analogique-numrique.

9 Modules CCP (Capture/Compare/PWM) : [4]


Le PIC 16F877 possde deux modules CCP qui fonctionnent de la mme faon. Chaque module contient un registre sur 16-bits qui peut fonctionner en un des modes suivants : Registre de capture. Registre de comparaison. Registre de la PWM.

Ce registre de 16-bits CCPR1 pour le module CCP1 (ou CCPR2 pour le module CCP2) est constitu de deux registres de 8-bits chacun : CCPR1L (CCPR2L) qui contient loctet bas et CCPR1H (CCPR2H) qui contient loctet haut.

Registre CCP1CON/CCP2CON :( adresse : 17h/1Dh) U-0 Bit7


Bit 7 Bit 6 Bit 5:4

U-0 -

L/E-0 CCPxX

L/E-0 CCPxY

L/E-0 CCPxM3

L/E-0 CCPxM2

L/E-0 CCPxM1

L/E-0 CCPxM0 Bit0

Non-implment : Lire comme 0. Non-implment : Lire comme 0. CCPxX:CCPxY : Bits de poids faible du PWM. Mode capture et comparaison: Inutiliss. Mode PWM : Ces bits sont les deux bits de poids faible du temps de cycle PWM. Les huit bits de poids fort se trouvent dans CCPRxL. Bit 3:0 CCPxM3:CCPxM0 : Bit de slection du mode CCP. 0000 = module Capture/Compare/PWM dsactiv (Reset le module CCPx). 0100 = Mode capture, chaque front descendant. 18

Chapitre 1

Etude thorique du PIC 16F877

0101 = Mode capture, chaque front montant. 0110 = Mode capture, chaque 4me front montant. 0111 = Mode capture, chaque 16me front montant. 1000 = Mode comparaison, mise 1 de la sortie lors dune galit (le bit CCPxIF (registre PIRx) est mit 1). 1001 = Mode comparaison, mise 0 de la sortie lors dune galit (le bit CCPxIF est mis 1). 1010 = Mode comparaison, gnre une interruption lors dune galit (le bit CCPxIF est mis 1, la pin CCPx est non-affect). 1011 = Mode comparaison, vnement spcial trigger (le bit CCP1IF est positionn, la pin CCPx est non-affect) ; Le CCPx reset le TMR1, le CCP2 dmarre le CAN (sil est activ). 11xx = Mode PWM. Vu que les deux modules sont identiques, on ne dcrira quun seul : CCP1.

9.1 Mode capture :


Dans ce cas, le registre CCPR1 (CCPR1H :CCPR1L) capture le contenu du registre TMR1 (du Timer1) quand lun des vnements suivants se produit sur la patte RC2/CCP1 : Tous les fronts descendants. Tous les fronts montants Tous les 4 fronts montants. Tous les 16 fronts montants.

Quand une capture est faite, il y aura gnration dune interruption signale par le bit CCP1IF. Le Timer1 tant associ au mode capture, il doit fonctionner en mode temporisateur ou compteur synchronis. La patte RC2/CCP1 doit tre configure en entre.

9.2 Mode comparaison :


Dans ce mode, la valeur du registre CCPR1 est compare celle du registre TMR1. Quand une galit aura lieu, lun des cas suivants se produira : Passage 0 de la patte RC2/CCP2. Passage 1 de la patte RC2/CCP2. Aucun changement sur cette patte.

En ce mme temps, le bit CCP1IF se mit 1 pour signaler une interruption. Mme chose pour le Timer1, il doit tre configur en temporisateur ou en compteur synchronis, tandis que la patte RC2/CCP1 doit tre configure en sortie.

9.3 Mode PWM :


Dans ce mode le module CCP permet de gnrer une PWM (Pulse Width Modulation) avec une rsolution de 10-bits. La patte RC2/CCP1 doit tre configure en sortie.

19

Chapitre 1
9.3.1

Etude thorique du PIC 16F877

Priode de la PWM : La priode de la PWM est spcifie en crivant une valeur dans le registre PR2 (registre priode du Timer2) et qui sera calcule en utilisant la formule suivante : Priode de la PWM = [(PR2) + 1] x 4 x TOSC x (la valeur du pr-diviseur du Timer2) 9.3.2 Rapport cyclique : Le rapport cyclique est spcifi en crivant une valeur dans le registre CCPR1L (sur 8-bits) qui dtermine les bits du poids fort et dans CCP1CON (bit 4 et 5) qui dtermine les bits du poids faible donc on a 10-bits. La formule suivante permet de dterminer ce rapport cyclique : Rapport cyclique = (CCPR1L:CCP1CON<5:4>) x TOSC x (la valeur du pr-diviseur du Timer2) Le registre CCPR1H est utilis comme esclave du CCPR1L et ne peut tre crit par le programmateur, il sert, avec les deux autres bits, sauvegarder la valeur du rapport cyclique pour ensuite gnrer une mme priode que la prcdente, cette sauvegarde ne se produit que lorsque la valeur du PR2 soit gale celle du TMR2 (cette galit signifie quune priode est termine).

Conclusion :
Cette tude thorique nous a permis de traiter et de comprendre le fonctionnement des diffrentes ressources interne du PIC 16F877, denvisager des applications pour ce C et on va prsenter une de ces applications dans le chapitre qui suit.

20

Chapitre 2

Programmation en C et application

Introduction :
La programmation des microcontrleurs PIC est supporte par plusieurs langages de programmation tel que : MPLAB, lAssembleur, le C ou C++. Dans ce chapitre on va prsenter de manire gnrale la procdure de programmation en C des microcontrleurs PIC et donner quelques exemples dapplication.

1. Choix du compilateur : [5]


Il existe plusieurs compilateurs C pour PIC, et notre choix sest port sur loutil dveloppement SourceBoost IDE qui permet de dvelopper des programmes en C et de les compiler pour gnrer le code Hexadcimal pour PIC en utilisant le compilateur BoostC, puisque le langage est le C et surtout quon peut facilement accder nimporte quel bit de nimporte quel registre. Avec SourceBoost on peut faire lessentiel de ce quon peut faire avec lassembleur ou dautres langages moins volus mais avec moins dinstructions, mais aussi quil prend en charge la gestion dun certain nombre de mcanismes, par exemple : pas besoin de spcifier la page mmoire dans laquelle on veut crire, le compilateur sen charge.

2. Quelques notions de programmation en C sous SourceBoost : [6]


La saisie dun programme en C rpond pratiquement toujours la mme structure. On peut noter que : Le symbole # est suivi dune directive. Le symbole // est suivi dun commentaire, ou bien /* indiquant le dbut dun commentaire et */ indiquant sa fin. Chaque ligne dinstruction se termine par un ;. Le dbut dune squence est prcd du symbole {. La fin dune squence est suivie du symbole }. La notation des nombres peut se faire en dcimal de faon normale ou en hexadcimal avec le prfixe 0x ou encore en binaire avec le prfixe0b.

2.1.Les directives :
Directives de compilation :
#include <nomdufichier.h>

Cette directive indique au pr-compilateur dinclure le fichier.h indiqu par son nom entre < >, ce fichier est une bibliothque contenant toutes les dfinitions qui seront utilises par la suite dans le programme. Si ce fichier est non disponible, une erreur sera gnre et la compilation est stoppe.
#define iden (a,b,) statement

Cette directive indique des quivalences. iden est le nom de lquivalence dclare dans statement, avec (a,b,) des variables utilises dans cette quivalence.
#undef iden

21

Chapitre 2

Programmation en C et application

Cette directive permet de mettre fin lquivalence iden dfinie prcdemment.

Directives pragma :
#pragma CLOCK_FREQ frquence en Hz

Cette directive indique au pr-compilateur la valeur de la frquence (en Hz) utilise par notre PIC.
#pragma DATA addr, d1, d2,

Cette directive permet lutilisateur de se placer dans la mmoire ladresse dsigne par addr et de mettre les constantes d1, d2, qui sont sur 8-bits.
#pragma DATA _bit du registre configuration word

Dans ce cas cette directive permet de configurer le C travers le registre configuration word, tel que loscillateur, le WDT, LVP

2.2.Les donnes :
En gnral, les donnes sous SourceBoost sont de type tel quil est indiqu dans le tableau suivant : Types bit, bool char Int, unsigned int, signed int short, unsigned short, signed short long, unsigned long, signed long Tableau 2.3.2 : Type de donnes Et en plus de ces donnes il y ales constantes et les variables : Taille 1-bit 8-bits 16-bits 16-bits 32-bits

Constantes :
Les constats peuvent tre exprims en : Binaire : 0bXXXX, o X est : soit 1, soit 0. Octal : 0XXXX, o X est un nombre entre 0 et 7. Dcimal : XXXX, o X est un nombre entre 0 et 9. Hexadcimal : 0xXXXX, o X est un nombre entre 0 et 9 ou A et F.

Variables :
Les variables peuvent tre dclares et utilises comme dans tout compilateur de langage C. Les variables peuvent tre forces de se placer dans une certaine adresse. La syntaxe est la suivante :
char var@<addr>;

O <addr> est une adresse en hexadcimal ou en dcimal. Cette technique est utilise pour accder un registre spcifi depuis le programme. 22

Chapitre 2

Programmation en C et application

Les variables bit peuvent aussi avoir une adresse fixe. Cette adresse peut inclure la position du bit et peut se faire suivant deux formes :
bit b; //la variable sera place arbitrairement bit b1@0x40.1; // bit 1 du registre dont ladresse est 0x40 bit b2@0x202; // bit 2 du registre dont ladresse est 0x40 (0x40*8 + 2)

En plus des variables bit, on peut accder un bit dun registre spcifi en utilisant loperateur . Comme suit :
char var; var.2 = 1; //mettre 1 le bit 2 de la variable var

Il existe un type de variable appel volatile qui est utilis pour dclarer des variables bit qui : a) peuvent changer en dehors du programme, par exemple : lassigner une patte dun port. b) reoivent des valeurs immdiates. Exemple :
Volatile bit pinB1@0x6.1; //dclare le bit de patte 1 du portB //laddresse 0x06 comme volatile, pinB1 est le nom donn cette variable.

2.3 .Les oprateurs :


Plusieurs oprateurs sont disponibles sous SourceBoost pour effectuer diffrentes oprations :

Oprateurs arithmtiques :
Ces oprateurs permettent deffectuer les oprations arithmtiques et sont : + : addition, - : soustraction, *: multiplication, / : division, % : donne le reste de la division de deux oprandes, ++ : incrmentation, -- : dcrmentation.
c=a+b c=b-a c=a*b c=b/a c=b%a

Exemples :
;//c=2+15 ;//c=15-2 ;//c=2*15 ;//c=15/2 ;//c=15%2 donne donne donne donne donne c=17 c=13 c=30 c=7 c=1 X=10 ; c=x++ ; //aprs X=10 ; c=++x ; //aprs c=x-- ; c=--x ; //post-incrmentation lopration :x=11, c=10 //pr-incrmentation lopration :x=11, c=11 //post-dcrmentation //pr-dcrmentation

Oprateurs daffectation :
Ces oprateurs permettent daffecter une valeur une variable avec possibilit deffectuer une opration sur cette variable, ces oprateurs sont : = : oprateur daffectation, la valeur ou lexpression droite de cet oprateur est affecte la variable qui est gauche de cet oprateur.

23

Chapitre 2

Programmation en C et application

x=5 ;//quelque soit la valeur de x elle sera remplace par 5

+= : oprateur addition et affectation, la variable gauche de cet oprateur sera additionne avec celle d droite, puis le rsultat sera affect la variable d gauche.

x+=2 ;//si x avait la valeur 14,aprs cette opration x vaudra 16

-= : oprateur soustraction et affectation, la variable droite de cet oprateur sera soustraie de celle d droite, puis le rsultat sera affect la variable d gauche.

x-=2 ;//si x avait la valeur 14,aprs cette opration x vaudra 12

*= : oprateur multiplication et affectation, la variable gauche de cet oprateur sera multiplie par celle d droite, puis le rsultat sera affect la variable d gauche.

x*=2 ;//si x avait la valeur 14,aprs cette opration x vaudra 28

/= : oprateur division et affectation, la variable gauche de cet oprateur sera divise par celle d droite, puis le rsultat sera affect la variable d gauche.

x/=2 ;//si x avait la valeur 14,aprs cette opration x vaudra 7

%= : oprateur reste de la division et affectation, le reste de la division de la variable qui est gauche de cet oprateur par celle qui est droite sera affect la variable qui est gauche.

x%=2 ;//si x avait la valeur 15,aprs cette opration x vaudra 1

&= : oprateur ET bit bit et affectation. Cet oprateur effectue le ET logique (bit bit) entre la variable sa gauche et celle sa droite, ensuite il affecte le rsultat la variable gauche.

x &= 0b11110001 ;//si x avait la valeur 0b10001111,aprs cette opration x //vaudra 0b10000001

|= : oprateur OU bit bit et affectation. Cet oprateur effectue le OU logique (bit bit) entre la variable sa gauche et celle sa droite, ensuite il affecte le rsultat la variable gauche.

x |= 0b11110000 ;//si x avait la valeur 0b10001110,aprs cette opration x //vaudra 0b11111110

^= : oprateur XOR et affectation. Cet oprateur effectue le XOR logique (bit bit) entre la variable sa gauche et celle sa droite, ensuite il affecte le rsultat la variable gauche.

x ^= 0b11111000 ;//si x avait la valeur 0b00011110,aprs cette opration x //vaudra 0b11100110

<<= : oprateur de dcalage gauche et affectation. Les bits de la variable gauche vont tre dcals gauche, le nombre de cases de dcalage est indiqu par la variable droite.

x <<= 0b00000010; // si x avait 0b00011110,aprs cette opration x vaudra //0b01111000.

24

Chapitre 2

Programmation en C et application

>>=: oprateur de dcalage droite et affectation. Les bits de la variable gauche vont tre dcals droite, le nombre de cases de dcalage est indiqu par la variable droite.

x >>= 0b00000010; // si x avait 0b00011110,aprs cette opration x vaudra // 0b00000111.

Oprateurs de comparaison :
Ces oprateurs sont utiliss pour la comparaison de deux oprandes. == != <= < >= > Egalit Non galit Infrieur ou gale Infrieur Suprieur ou gale Suprieur

Oprateurs de condition :
Ces oprateurs permettent dexcuter une partie du programme sous certaines conditions. if / else : la syntaxe de cet oprateur est la suivante :

if (condition) squences dinstructions excuter si la condition est vrifie else squences dinstructions excuter si la condition nest pas vrifie

switch / case : la syntaxe est la suivante :

switch (expression)//selon ltat de cette expression { case a : squences dinstructions excuter dans ce cas case b : squences dinstructions excuter dans ce cas }

2.4 Les boucles :


La boucle for :

25

Chapitre 2

Programmation en C et application

Cette permet de contrler le nombre de fois excuter un bloc dinstructions. Dans la syntaxe de cette boucle on trouve : la valeur initiale du compteur, a valeur finale et la valeur avec laquelle il doit tre incrment (ou dcrment) chaque fois que le bloc dinstructions est excut. Exemple :
for (i=0 ;i=10 ;i++)//i est le compteur { portd = portd++; }

Supposons que le port d a 0 comme valeur initiale, donc en sortant de cette boucle le port d aura la valeur 10 puisque il sera incrment en fonction de i, de 0 10.

La boucle while :
La boucle while ou bien tant que en franais, permet lexcution dune suite dinstructions plusieurs fois tant que une condition soit vraie. Si cette condition un moment donn ne soit pas vrifie (fausse), lexcution de cette boucle va tre stoppe. Exemple:
While (x>5) { portb = portb++; --x ; }

Supposons que x a une valeur initiale de 8 et le port b une valeur 0. Tant que la valeur de x est suprieure 5, le port b est incrment. Quand la valeur de x soit gale 5 cette boucle ne sera plus excute.

La boucle do / while :
Cette boucle permet lexcution dune suite dinstructions avant de vrifie la condition, donc cette boucle est excute au moins une fois mme si la condition nest pas vrifie. Si la condition nest pas vrifie lexcution est stoppe, sinon elle continue. Exemple:
do { portb = portb++; --x ;

26

Chapitre 2
} while (x>5) ;

Programmation en C et application

Si la valeur initiale de x est infrieure 5, le port b sera incrment une seule fois puis lexcution de la boucle est stoppe. Sinon il sera incrment jusqu' ce que la valeur de x soit infrieure 5.

2.5.Fonctions usage gnral :


clear_bit (var,num) : Cette fonction permet de mettre zro le bit num de la variable var. set_bit (var,num) : Cette fonction permet de mettre un le bit num de la variable var. test_bit (var,num) : test si le bit num de la variable var est un. MAKESHORT (dst,lobyte,hibyte) : cette fonction permet crer une valeur sur 16 bit qui sera stocke dans dst partir de deux valeurs de 8 bit, lobyte pour loctet du poids faible et hibyte pour loctet du poids fort. Notons que dst doit tre une variable sur 16 bit. LOBYTE (dst,src) : permet davoir loctet du poids faible partir de src et de le stocker dans dst. HIBYTE (dst,src) : permet davoir loctet du poids fort partir de src et de le stocker dans dst. void nop (void) : cest une fonction inline c--d que a syntaxe dans le programme est la suivante : nop(). Cette fonction permet de gnrer linstruction nop (no operation). void sleep (void) : cest une fonction inline c--d que a syntaxe dans le programme est la suivante : sleep(). Cette fonction permet de gnrer linstruction sleep qui mettra en veille le C. void reset (void) : cest une fonction inline c--d que a syntaxe dans le programme est la suivante : reset(). Cette fonction permet de gnrer un reset.

3. Structure dun programme :


Un programme sous SourceBoost a la structure suivante : Le programme doit commencer par une directive de compilation qui indique au compilateur quel sont les fichiers inclure, ensuite il faut configurer le C travers le registre configuration word, et aprs a il faut indiquer au compilateur la frquence du C. La deuxime partie du programme consiste dfinir les interruptions et le programme de chacune. La dernire partie est la partie du programme principale, elle est subdivise en deux parties : dans la premire partie le programmateur doit configurer et initialiser chaque port, configurer les timers et dautres ressources internes et aussi configurer les interruptions. La deuxime partie est ddie au programme qui va dfinir la tche effectuer par le C.

4. Exemple dapplication :
Aprs avoir vu comment programmer un C PIC, nous allons prsenter, dans cette partie, un exemple dapplication o le PIC est programm en C sous SourceBoost.

27

Chapitre 2

Programmation en C et application

Lexemple que nous allons prsenter est une application trs simple raliser, cest un compteur qui peut aller de 0 99 (8 bits) avec un bouton de remise zro. Le circuit de cet exemple a t ralis et simul sous le logiciel ISIS, la figure suivante illustre ce montage :

15pF (1)

U1
13 14 1 15pF 2 3 4 5 6 7 8 9 10 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD 33 34 35 36 37 38 39 40 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30

D1
comptage

D2
Mise zro

RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RE0/AN5/RD RC2/CCP1 RE1/AN6/WR RC3/SCK/SCL RE2/AN7/CS RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 PIC16F877

R1
6M8

Figure 2.5 : compteur 0 99 (8 bits) Comme nous pouvons le voir, ce circuit est constitu dun C PIC 16F877, deux afficheurs 7 segments avec circuits de dcodage BCD intgrs lun est connect au port d et lautre au port c, deux LED : une rouge pour indiquer le comptage et une jaune pour indiquer la remise zro et un bouton poussoir pour la remise zro. Un autre circuit connect entre OSC1 et OSC2 qui est compos dun quartz de 4MHz en parallle avec deux condensateurs de 15pF qui permet de fixer lhorloge 4MHz. Pour que ce circuit fonctionne il faut que le C soit programm correctement. Le programme qui permet deffectuer cette tche est le suivant :
#include <system.h> #include <pic16F877.h> #pragma DATA _CONFIG, #pragma CLOCK_FREQ _XT_OSC & _WDT_OFF 4000000

int i;//Dclaration dun entier. void main( void ) { trisb = 0xFF; trisc = 0x00; trisd = 0x00; trise = 0x00;

28

Chapitre 2
portc = 0x00; portd = 0x00; intcon = 0x90;

Programmation en C et application

sleep();

for (i=0;i=99;i++) { clear_bit(porte,1); set_bit(porte,0); portd=portd++; delay_ms(20); if ((portd==9) && (portc!=9)) { portd=0; portc=portc++;

} if ((portd==9) && (portc==9)) break; }

portd=0; portc=0; } void interrupt( void ) { if(INTF==1) { portd=0; portc=0;

29

Chapitre 2
set_bit (porte,1);

Programmation en C et application
clear_bit( intcon, INTF );

} }

4.1.Analyse de la structure :
#include <system.h>

Cette directive indique au pr-compilateur dinclure le fichier system.h. Celui-ci contient son tour un fichier contenant toutes les informations sur les diffrents PIC et de plus il permet dinclure des fonctions qui seront utilises dans le programme.
#include <pic16F877.h>

Cette directive indique au pr-compilateur dinclure le fichier pic16F877.h. Celui-ci contient des informations sur le PIC 16F877 telles que les associations nom de registre/adresse mmoire.
#pragma DATA _CONFIG, _WDT_OFF & _XT_OSC

Une autre directive de pr-compilation, qui permet de dfinir les bits de configuration du PIC. Ces bits de configuration permettent de configurer un certain nombre de paramtres de fonctionnement du PIC: WDT_OFF: dsactive le Watch Dog Timer. XT_OSC : Configure loscillateur en mode XT. Pour linstant on dsactive tout (OFF), part bien sr loscillateur quon configure en mode XT puisque loscillateur utilis est en quartz 4MHz.
#pragma CLOCK_FREQ 4000000

A nouveau une directive de pr-compilation. On indique ici quelle est la frquence du quartz utilis. Cest partir de cette valeur que les temporisations sont gnres par la fonction delay .
void main( void ) { }

La fonction main est obligatoire en langage C, elle indique le dbut du programme principal. Cest dans cette zone entre accolades { } quon a: Configurer les diffrents ports utiliss dans cette application : trisb = 0xFF; configurer toutes les pins du port b en entres.
trisc = 0x00; configurer toutes les pins du port c en sorties. trisd = 0x00; configurer toutes les pins du port d en sorties. trise = 0x00; configurer toutes les pins du port e en sorties.

30

Chapitre 2
Initialiser les ports par des valeurs :

Programmation en C et application

portc = 0x00;initialisation du port c par 0. portd = 0x00; initialisation du port d par 0. porte = 0x00; initialisation du port e par 0.

Valider les interruptions :

intcon = 0x90; INTCON est un registre qui permet de contrler les interruptions. Lquivalent de

90h en binaire est 10010000b, affecter cette valeur au registre INTCON permet de mettre 1 le 8 me bit qui correspond au bit de validation globale des interruptions et le 5me bit qui correspond au bit de validation de linterruption sur changement de RB0, et de mettre 0 tous les autres bits pour dsactiver toute autre interruption. Ecrit la partie programme qui dfinit la tche principale effectuer par la C :

Aprs que le C excute les tapes prcdentes, il va excuter la fonction sleep qui va le mettre en veille. Lintrt de cette mise en veille dans notre exemple est de ne pas commencer le comptage quaprs avoir reu un changement dtat sur RB0 (en appuyant sur le bouton poussoir), donc il va excuter la routine dinterruption pour ensuite continuer lexcution du programme. Ds que le C sort de la routine dinterruption, il retourne au programme principal pour excuter la boucle for. Initialement, au dbut du programme, on dclarer un entier i qui va servir de compteur pour la boucle et qui va tre incrment chaque fois que la boucle est excute de 0 99:
for (i=0;i=99;i++)

Entre les accolades de cette boucle, on trouve :


clear_bit(porte,1);qui va mettre 0 la pin RE1 pour teindre la LED jaune qui est connecte

cette pin, ce qui va signaler la fin de la mise 0 du compteur et dbut du comptage.


set_bit(porte,0);qui mettra 1 la pin RE0 o une LED rouge est connecte. Cette mise 1

allume la LED pour signaler le comptage et elle reste allume tant quune remise zro ne sest produite. Incrmentation de la valeur du port d par : portd=portd++; et gnration dun dlai de 20ms avant que la prochaine instruction ne soit excute : delay_ms(20); Ensuite on rencontre un bloc dinstructions prcd par un operateur de condition (un test) :
if ((portd==9) && (portc!=9))

Si la valeur du port d est gale 9 et celle du port c est diffrente de 9, le bloc dinstructions va tre excut, dans ce bloc on va: i. Mettre 0 le port d : portd=0;, cette remise zro est ncessaire puisque le port d ne doit pas dpasser 9.

31

Chapitre 2
ii.

Programmation en C et application

Incrmenter la valeur du port c : portc=portc++; ,puisque il na pas encore atteint la valeur 9. Cette incrmentation nous permet de passer, par exemple, des dizaines aux vingtaines.

Aprs lexcution de ce bloc, le C passe directement linstruction qui suit. Sinon, c--d que les conditions ne sont pas vrifies, le bloc ne va pas tre excut et le C passe directement linstruction qui suit le bloc. suivante est un operateur de condition (de test) :

Linstruction

if ((portd==9) && (portc==9)) :

Si ces conditions ne sont pas vrifies, donc le compteur na pas encore atteint la valeur 99 et il faut lincrment, pour cela le C va ignorer linstruction qui suit ce test pour ensuite se retrouver la fin de la boucle for ce qui lui permettra de reboucler tout en incrmentant le i et de r-excuter cette boucle. Sinon, le C trouve que les conditions son vrifies (le compteur atteint 99), donc il va excuter linstruction qui suit et cest un break, cette instruction est utilise gnralement la fin dune boucle for et excute aprs vrification dune certaine condition, lexcution de cette instruction permet au C de sortir de la boucle. Dans ce cas notre condition est vrifie donc le C sort de la boucle pour continuer lexcution du reste du programme.

Le reste du programme consiste remettre le compteur 0 puisque il a atteint 99 :


portd=0; mise 0 du port d (bits de poids faible). portc=0; mise 0 du port c (bits de poids fort).

Si, durant lexcution du programme ou la fin de lexcution, le C a reu un changement dtat sur RB0 (en appuyant sur le bouton poussoir), ceci va engendrer une interruption. Le sous programme qui traite cette interruption ce mis entre les accolades de la fonction interrupt comme suit :
void interrupt( void ) { } interrupt est la fonction qui traite les interruptions, Le void signifie que cette fonction ne

retourne rien. Dans ce sous programme on a : Affecter un 0 au port d et au port c pour permettre au C de mettre zro chaque pins de ces ports, ce qui fait que le compteur sera mit zro. Mis 1 la patte RE1, o une LED jaune est connecte, par set_bit(porte,1);. Ds que cette patte est mise 1, la LED sallume indiquant la remise zro. clear_bit(intcon,INTF);permet de mettre zro le bit INTF du registre INTCON, ce bit qui signale un changement sur RB0 et de dclenche une interruption en se mettant 1, do la ncessit de le remettre 0 pour signaler la fin de cette interruption.

32

Chapitre 2

Programmation en C et application

Aprs que le C sort de cette routine, il va continuer lexcution du programme principal de la fonction main.

Conclusion :
A travers les notions et lapplication prsente dans ce chapitre, nous avons fait un pas dans la programmation des PIC en C.

33

Conclusion Gnrale
Llaboration de ce modeste travail nous a permis de comprendre un peu le fonctionnement du microcontrleur PIC 16F877 travers une tude thorique de ces diffrentes ressources internes, ensuite de sinitier leur programmation en langage C, pour cela nous avons utilis le compilateur SourceBoost et comme nous lavons vu il est dune grande simplicit. Cela nous a permis aussi dlaborer une application pour mettre en uvre toutes les notions thoriques. A la fin nous esprons avoir apport une contribution au domaine des microcontrleurs PIC et leur programmation en langage C.

33

Bibliographie

[1] : Les Microcontrleurs PIC 16F87X, Philippe LETENNEUR - GRANVILLE 2003.

[2] : Programmation En C Sur Carte "EASYPIC 2" du Microcontrleur PIC16F877, Karim SAAD, Mmoire de fin dtude -Licence LMD-, Universit dORAN. Promotion 2007/2008.

[3] : Les Microcontrleurs PIC : Description et mise en uvre, Christian TAVERNIER, Nouvelle prsentation de la 2me dition, DUNOD, 2002.

[4]: PIC16F87X DATA SHEET, Microchip Technology Inc, 2001.

[5]: Programmation des PIC en C-PARTIE 1, Noxyben, 2007.

[6]: BoostC C Compiler for PICmicro Reference Manual, SourceBoost Technologies.

Vous aimerez peut-être aussi