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










Prsent par : Encadr par :
M
r.
:BOUKARI Mansour M
r.
:HADJI Slimane




Programmation en C
du Microcontrleur
PIC 16F877
Master S1 2009/2010

Sommaire


Introduction Gnrale...1
Chapitre 1 : Etude thorique du PIC 16F877
Introduction.2
1. Prsentation du microcontrleur PIC 16F877...2
2. Diffrents types de mmoire.5
3. Configuration de loscillateur (horloge) 6
4. Ports dEntres/Sorties7
5. Timers..11
6. Interface MSSP: (Master Synchronous Serial Port)..14
7. 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. Choix du compilateur.21
2. Quelques notions de programmation en C sous SourceBoost..21
3. Structure dun programme.27
4. Exemple dapplication27
Conclusion.32
Conclusion Gnrale....33
Bibliographie

















Introduction Gnrale
1

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
2

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 :
Chapitre 1 Etude thorique du PIC 16F877
3

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 :
V
DD
et V
SS
.
2 pins pour loscillateur :
OSC0 et OSC1.
1 pin pour le RESET : MCLR.





Figure 1.2.2 : Brochage du 16F877
Chapitre 1 Etude thorique du PIC 16F877
4

1.3 Architecture interne : [4]


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.
Figure 1.2.3 : Architecture interne du PIC16F877.
Chapitre 1 Etude thorique du PIC 16F877
5

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 pr-
diviseur, 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).







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 :

Figure 1.3.1 : Organisation de mmoire programme
Chapitre 1 Etude thorique du PIC 16F877
6


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 10
6
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 :
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 :






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 :
RP1 :RP0 BANK
00 0
01 1
10 2
11 3
FOSC1 :FOSC0 Mode
00 LP
01 XT
10 HS
11 RC
Figure 1.4.1 a) : Oscillateur en quartz/ rsonateur.
Chapitre 1 Etude thorique du PIC 16F877
7






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 :



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 V
REF
, pour cela, le registre ADCON1 permet de dterminer la fonction
de chaque pin.


Figure 1.4.1 b) : Connexion dune horloge externe.
Figure 1.4.2 : Oscillateur RC.
Chapitre 1 Etude thorique du PIC 16F877
8






x : inconnu, u : inchang, - : emplacements non implments (0), les cellules ombrages ne sont pas
utilises par le PORTA.

Tableau 1.5.2 : Rsum des registres associs avec le PORTB






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







Tableau 1.5.1 : Rsum des registres associs avec le PORTA

Adresse

Nom

Bit-7

Bit-
6

Bit-
5

Bit-
4

Bit-3

Bit-2

Bit-1

Bit-0
Valeur
sur
POR,
BOR
Valeur
sur
autres
RESET
05h PORTA - - RA5 RA4 RA3 RA2 RA1 RA0
--0x 0000 --0u 0000
85h TRISA - - Registre de direction des donnes PORTA
--11 1111 --11 1111
9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
--0- 0000 --0- 0000


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.



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.

Adresse

Nom

Bit-7

Bit-6

Bit-5

Bit-4

Bit-3

Bit-2

Bit-1

Bit-
0
Valeur
sur
POR,
BOR
Valeur
sur
autres
RESET
06h,
106h
PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
xxxx xxxx uuuu uuuu
86h,
186h
TRISB Registre de direction des donnes PORTB
1111 1111 1111 1111
81h,
181h
OPTION_REG RBPU INTEDC T0CS T0SE PSA PS2 PS1 PS0
1111 1111 1111 1111
Chapitre 1 Etude thorique du PIC 16F877
9

Tableau 1.5.3 : Rsum des registres associs avec le PORTC





x : inconnu, u : inchang.
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

Adresse

Nom

Bit-7

Bit-
6

Bit-5

Bit-4

Bit-3

Bit-2

Bit-1

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

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.




Adresse

Nom

Bit-7

Bit-
6

Bit-
5

Bit-
4

Bit-3

Bit-2

Bit-1

Bit-0
Valeur
sur
POR,
BOR
Valeur
sur
autres
RESET
07h PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0
xxxx xxxx uuuu uuuu
87h TRISC Registre de direction de donnes PORTC
1111 1111 1111 1111
Chapitre 1 Etude thorique du PIC 16F877
10


Tableau 1.5.5 : Rsum des registres associs avec le PORTE

Adresse

Nom

Bit-7

Bit-
6

Bit-5

Bit-4

Bit-3

Bit-2

Bit-1

Bit-0
Valeur
sur
POR,
BOR
Valeur
sur
autres
RESET
09h PORTE - - - - - RE2 RE1 RE0
---- -xxx ---- -uuu
89h TRISE IBF OBF IBOV PSPMODE - Registre de direction de
donnes PORTE
0000 -111 0000 -111
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.

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.

Chapitre 1 Etude thorique du PIC 16F877
11


5 Timers :[4]
5.1 Timer0 :
Le Timer0 est un 8-bits temporisateur /compteur.
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.







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 :
Figure1.6.1 : Schma interne du Timer0
Chapitre 1 Etude thorique du PIC 16F877
12

a. Mode temporisateur :
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 F
OSC
/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 U-0 L/E-0 L/E-0 L/E-0 L/E-0 L/E-0 L/E-0
- - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
Bit7 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.

Chapitre 1 Etude thorique du PIC 16F877
13

Quand TMR1CS = 0 :
Ce bit est ignor. Le Timer1 utilise lhorloge interne quand TMR1CS = 0.
Bit 1 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 (F
OSC
/ 4).
Bit 0 TMR1ON : Bit de mise en marche du Timer1.
1 = Active le Timer1.
0 = Stoppe le 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
(F
OSC
/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 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
Bit7 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.
Figure1.6.2 : Schma interne du Timer1

Chapitre 1 Etude thorique du PIC 16F877
14

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




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 I
2
C (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.
Figure1.6.3 : Schma interne du Timer2

Chapitre 1 Etude thorique du PIC 16F877
15

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 I
2
C :
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 9
me
bit dans TX9D (registre TXSTA), si la transmission 9-bits est slectionne.
Chapitre 1 Etude thorique du PIC 16F877
16

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 9
me
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 V
DD
, V
SS
, 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.
Chapitre 1 Etude thorique du PIC 16F877
17

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 (T
AD
), il existe 4 possibilits pour effectuer ce choix, le
tableau suivant montre comment ce temps est choisi :
Tableau 1.9.1 : valeurs de T
AD
.
T
AD
ADCS1 :ADCS0
(registre ADCON0)
Frquence max. du composant
2T
OSC
00 1.25 MHz
8T
OSC
01 5 MHz
32T
OSC
10 20 MHz
RC interne du CAN 11 Inferieure 1 MHz
Le fonctionnement du CAN continu durant un SLEEP condition dutiliser lhorloge RC interne.
Chapitre 1 Etude thorique du PIC 16F877
18



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 U-0 L/E-0 L/E-0 L/E-0 L/E-0 L/E-0 L/E-0
- - CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0
Bit7 Bit0
Bit 7 Non-implment : Lire comme 0.
Bit 6 Non-implment : Lire comme 0.
Bit 5:4 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.
Figure 1.9 : Schma du module de conversion analogique-numrique.
Chapitre 1 Etude thorique du PIC 16F877
19

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.

Chapitre 1 Etude thorique du PIC 16F877
20

9.3.1 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.

















Chapitre 2 Programmation en C et application
21

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
Chapitre 2 Programmation en C et application
22

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 Taille
bit, bool 1-bit
char 8-bits
Int, unsigned int, signed int 16-bits
short, unsigned short, signed short 16-bits
long, unsigned long, signed long 32-bits

Et en plus de ces donnes il y ales constantes et les variables :
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.
Tableau 2.3.2 : Type de donnes
Chapitre 2 Programmation en C et application
23

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.
Exemples :
c=a+b ;//c=2+15 donne c=17
c=b-a ;//c=15-2 donne c=13
c=a*b ;//c=2*15 donne c=30
c=b/a ;//c=15/2 donne c=7
c=b%a ;//c=15%2 donne c=1
X=10 ;
c=x++ ; //post-incrmentation
//aprs lopration :x=11, c=10
X=10 ;
c=++x ; //pr-incrmentation
//aprs lopration :x=11, c=11
c=x-- ; //post-dcrmentation
c=--x ; //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.
Chapitre 2 Programmation en C et application
24

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.
Chapitre 2 Programmation en C et application
25

>>=: 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 :
Chapitre 2 Programmation en C et application
26

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 ;
Chapitre 2 Programmation en C et application
27

} while (x>5) ;
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.
Chapitre 2 Programmation en C et application
28

#include <system.h>
#include <pic16F877.h>
#pragma DATA _CONFIG, _XT_OSC & _WDT_OFF
#pragma CLOCK_FREQ 4000000
int i;//Dclaration dun entier.
void main( void )
{
trisb = 0xFF;
trisc = 0x00;
trisd = 0x00; trise = 0x00;

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 :


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 :









RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-
4
RA4/T0CKI
6
RA5/AN4/SS
7
RE0/AN5/RD
8
RE1/AN6/WR
9
RE2/AN7/CS
10
OSC1/CLKIN
13
OSC2/CLKOUT
14
RC1/T1OSI/CCP2
16
RC2/CCP1
17
RC3/SCK/SCL
18
RD0/PSP0
19
RD1/PSP1
20
RB7/PGD
40
RB6/PGC
39
RB5
38
RB4
37
RB3/PGM
36
RB2
35
RB1
34
RB0/INT
33
RD7/PSP7
30
RD6/PSP6
29
RD5/PSP5
28
RD4/PSP4
27
RD3/PSP3
22
RD2/PSP2
21
RC7/RX/DT
26
RC6/TX/CK
25
RC5/SDO
24
RC4/SDI/SDA
23
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
15
MCLR/Vpp/THV
1
U1
PIC16F877
(1)
D1
comptage
D2
Mise zro
R1
6M8
15pF
15pF
Figure 2.5 : compteur 0 99 (8 bits)
Chapitre 2 Programmation en C et application
29




























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

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;
Chapitre 2 Programmation en C et application
30






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.
set_bit (porte,1);
clear_bit( intcon, INTF );
}
}
Chapitre 2 Programmation en C et application
31

Initialiser les ports par des valeurs :
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 5
me
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.
Chapitre 2 Programmation en C et application
32

ii. 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.
Linstruction suivante est un operateur de condition (de test) :
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.
Chapitre 2 Programmation en C et application
33

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.















Conclusion Gnrale

33

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.
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 2
me
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