Académique Documents
Professionnel Documents
Culture Documents
Program Mat Ion en C Du Microcontrolleur PIC16F877
Program Mat Ion en C Du Microcontrolleur PIC16F877
Thme
Master S1 2009/2010
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
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.
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.
Chapitre 1
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.
Chapitre 1
1.3 Architecture interne : [4]
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
Chapitre 1
RP1 :RP0 00 01 10 11
BANK 0 1 2 3
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.
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.
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
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.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
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
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
Adresse Nom
Bit-7
Bit6
Bit5
Bit4
Bit-3
Bit-2
Bit-1
Bit-0
RC6 RC5 RC4 RC3 RC2 RC1 Registre de direction de donnes PORTC
RC0
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
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
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
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 : 11
Chapitre 1
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 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
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.
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.
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
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.
Chapitre 1
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.
16
Chapitre 1
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.
17
Chapitre 1
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.
U-0 -
L/E-0 CCPxX
L/E-0 CCPxY
L/E-0 CCPxM3
L/E-0 CCPxM2
L/E-0 CCPxM1
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
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.
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.
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.
19
Chapitre 1
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.
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.
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
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.
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
+= : 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.
-= : 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.
*= : 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.
/= : 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.
%= : 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.
&= : 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.
^= : 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.
<<= : 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.
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.
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 (expression)//selon ltat de cette expression { case a : squences dinstructions excuter dans ce cas case b : squences dinstructions excuter dans ce cas }
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.
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++;
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.
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++)
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
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.
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
[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.