You are on page 1of 10

Club Robotique INSA Toulouse

Microcontrleur dsPIC30F et Programmation

A- Laspect matriel
1/ Prsentation Un microcontrleur est une sorte de mini ordinateur embarqu. Comme tout ordinateur, il possde un processeur vou au calcul, de la mmoire, une carte mre qui lui permet dutiliser des priphriques, et des priphriques. Le processeur dun dsPIC est un processeur 1 !bits. Ce qui veut dire quil peut raliser des oprations lmentaires "additions, soustractions# directement sur des entiers cods sur 1 ! bits. Par e$emple, il peut additionner dun seul coup 1%&'% avec %()* "rappel + un entier sur 1 bits est compris entre , et ''&'#. -n %,,., nous utilisions des processeurs )!bits, bien plus limits en terme de calcul ")!bits ,..%''#. /e plus, le processeur du dsPIC est accompa0n dun c1ur /2P "/i0ital 2i0nal Processin0#. Ce c1ur est une espce de processeur anne$e ddi au$ calculs mathmatiques. Ce qui con3re au dsPIC la possibilit de raliser rapidement multiplications, divisions, calculs tri0onomtriques4 Cette puissance de calcul est dun con3ort remarquable, surtout lorsquon pro0ramme en C. -n e33et, il est 3acile dcrire 5 $ 6 ('7 ')8 9 en C, or sur un microcontrleur classique, cette seule li0ne dinstruction pourrait prendre :usqu; 1 seconde ; se$cuter. 2ur un dsPIC, <a ne prendra que quelques =secondes. Ct mmoire, le dsPIC possde %>o pour stoc>er des variables "quivalent de la ?@A dun PC#, (>o pour stoc>er pour stoc>er le pro0ramme, et (>o d--P?BA pour stoc>er des variables qui ne se perdent pas lorsquon dbranche lalimentation "quivalent du disque dur dun PC#. -n ce qui concerne les priphriques, le dsPIC est asseC 3ourni. Le premier priphrique est le module -ntreD2ortie, qui permet de lire oE dcrire des valeurs binaires sur la %,aine de pattes qui compose un dsPIC. Bn peut mettre une sortie ; 'F ou ; ,F, et on peut lire une entre pour savoir si la patte est ; ,F ou ; 'F. Il possde aussi & timers, sorte de chronomtres permettant de raliser des temps dattente, on dactiver un certain nombre dactions de manire priodique. Gous avons a notre disposition & modules PHA, permettant de 0nrer des si0nau$ en crneau ; 3rquence et rapport cIclique variable "en 0nral, ce module constitue une sortie vers le monde analo0ique#. Il I a convertisseurs analo0ique!numrique 1,!bits et & modules capture and compare "sert ; mesurer des 3rquences et ; comparer des si0nau$ lo0iques#. -n3in, il possde toute une 0amme de modules ddis ; la communication avec le$trieur "liaison srie, I%C, 2PI, C@G#. -n ce qui concerne lutilisation dun dsPIC, nous le pro0rammerons en C. Gous dtaillerons comment la couche matrielle est prise en compte dans le lan0a0e C. "Comment utiliser les priphriques#. Foil; pour un petit survol de ce matriel, maintenant nous allons dtailler comment il 3onctionne et comment lutiliser. / !ranc"ement dun dsPIC

JPhoto -@KL-L Pour alimenter un dsPIC en r0ime de 3onctionnement normal, il 3aut lui 3ournir une tension comprise entre (.'F et '.'F. Cette tension sera applique entre ses pattes Fdd et Fss. Il 3aut noter quil possde plusieurs pattes Fdd et Fss, ceci a3in de proposer plusieurs solutions dint0ration + 2elon la disposition des composants sur la carte, il sera peut Mtre plus 3acile dutiliser certaines pattes Fdd!Fss que dautres. Pour quun dsPIC 3onctionne correctement, il 3aut relier la patte ACL? "Aaster Clear# au 'F par une rsistance de 1,>ohm. @ ce stade, un pro0ramme peut tourner. Pour pro0rammer un dsPIC, il 3aut relier les pattes ACL?, PKC, PK/, ainsi que le 'F et le ,F ; lIC/% "un module ; brancher en U2N sur un PC#. 2ur les cartes allant dans le robot, on a dcid de ne pas mettre le connecteur de lIC/%. Par contre il I a %!& cartes de dveloppement ou ce connecteur I est, on les utilise pour 3aire des tests quand on na pas les cartes d3initives, et pour pro0rammer les cartes d3initives. -nsuite, toutes les autres pattes sont utilisables par les di33rents modules du dsPIC comme indiqu sur le nom des pattes. -$emple + ?-, est accessible comme entre sortie et comme sortie PHA1. 3/ Fr#uence de $onctionnement Comme tout processeur, pour 3onctionner il doit Mtre muni dune horlo0e. Le dsPIC possde une horlo0e interne, mais pour une question de commodit, nous pr3rons utiliser une horlo0e e$terne. Ce choi$ est tout ; 3ait discutable. Lhorlo0e e$terne est un cristal de quartC "matriau piCo!lectrique# de 1,AOC "3rquence doscillation propre du matriau#. Pour 3onctionner correctement, il doit Mtre reli au$ entres B2C1 et B2C% du dsPIC, et muni de deu$ condensateurs de %%pP "voir illustration du chapitre II#. Il 3ourni une horlo0e ; 1,AOC quil est possible de multiplier ; laide dun module dit de PLL. Gous choisissons de la multiplier par ( "PLL $(#. Br, pour e$cuter une instruction, le processeur ; besoin de ( cIcles dhorlo0e 8 ce qui divise par ( la 3rquence de 3onctionnement. Bn arrive ainsi ; une 3rquence de 3onctionnement 3inale de 1,AOC, soit 1,,ns D instruction.

!- Laspect logiciel
1/ %& trou'er de lin$ormation sur le dsPIC ( Fous alleC Mtre amen ; utiliser deu$ documents + dsPIC&,P PamillI ?e3erence manual dsPIC&,P(,1% /atasheet Le premier document est un descripti3 complet et ultra dtaill de la 3amille de composant dsPIC&,P. Il I prsente le 3onctionnement et la con3i0uration de tous les modules e$istants sur dsPIC. Le second document est lui, ddi au dsPIC&,P(,1% "le modle que nous utilisons pour lanne %,,)#. Il I prsente les caractristiques du modle en question, et un rsum du 3onctionnement des divers modules qui le compose. Ces deu$ documents sont indissociables, le premier est indispensable pour pouvoir con3i0urer un module "la description dun module dans le %me 3ait plus o33ice daide mmoire#. Le deu$ime est ncessaire pour obtenir des in3ormations telles que le brocha0e des priphriques "quelle patte 3ait quoi#. Qout au lon0 de cette initiation, :e vais 3aire r3rence ; ces deu$ documents "le manuel, et la datasheet#. / le module d)/* Le premier module que nous allons aborder est le module dentre sortie. Ce module est le plus simple de tous, et les concepts qui vont Mtre dvelopps ici sappliqueront ; tous les autres modules.

Cette illustration se trouve dans la section 5 Pin /ia0rams 9 de la datasheet. -lle est dmonstrative du brocha0e de ce composant. Gous observons que la ma:orit des pattes possdent un nom du tIpe ?$I oE $ est une lettre allant de N ; P, et I un chi33re allant de , ; 1'. Cette dnomination dcrit la possibilit de ces pattes ; Mtre utilises comme entresDsorties. Qoutes les pattes du microcontrleur sont or0anises en port, cest la lettre $. 2ur ce port, chaque patte ; son propre numro I. @insi, la patte Go % , 5 ?-, 9 est la patte , du port -.

Qous les ports ne sont pas complets "aucun mMme sur ce microcontrleur#, cRest!;!dire quils nont pas tous tout les chi33res possibles. 2i on avait utilis le dsPIC&,P aIant le plus de pattes, on aurait eu tous les ports de complets. Pour utiliser une patte en entreDsortie il 3aut d3inir % choses + -st!ce une entre ou une sortie S Tuelle est sa valeur "de sortie ou dentre# S Pour rpondre ; ces questions, nous allons utiliser des re0istres de con3i0uration. Un re0istre est une Cone de la mmoire qui est directement utilise par le matriel pour piloter son 3onctionnement. Cest une sorte de variable, mais qui possde un impact direct et intrinsque. Chaque priphrique utilise des re0istres pour 3onctionner. Pour le module IDB, ces re0istres se nomment Q?I2$, PB?Q$ et L@Q$ "2ection 5 11.% IDB Port Control ?e0ister 9#. Le manuel dcrit lutilisation de ces re0istres, mais il 3aut se r3rer ; la pa0e '* de la datasheet "5 )!1 IDB Port ?e0ister Aap 9# pour voir ; quels bits de con3i0uration nous avons accs sur notre modle de dsPIC. Bn retrouve bien que ces re0istres ne sont pas complets, il I a :uste les bits dont les pattes sont disponibles. Il est imprati3 de tou:ours utiliser ces tables pour avoir le nom e$act des bits de con3i0uration et des re0istres "indispensable lors de la phase de pro0rammation oE on utilisera directement ces noms#. Le re0istre Q?I2$ sert ; donner la direction dune patte + entre ou sortie. /aprs le manuel, si on met le bit Q?I2-, du re0istre Q?I2- ; ,, alors la patte Go % "?-,# est d3init comme tant une sortie. /e mMme, si on met le bit Q?I2P% du re0istre Q?I2P ; 1, alors la patte Go 1) "?P%# sera d3init comme tant une entre. Ce qui va suivre est une simpli3ication du 3onctionnement des re0istres L@Q$ et PB?Q$. Lorsquune patte est d3init en sortie, on lui a33ecte une valeur en utilisant le re0istre L@Q$. Par e$emple, si on veut mettre la patte Go % "?-,# ; 'F, il su33it de positionner le bit L@Q-, du re0istre L@Q- ; 1. 2i la patte est d3init en sortie, on lit sa valeur en re0ardant la valeur du re0istre PB?Q$. Par e$emple si la patte ?P% est ; ,F, alors le bit ?P% du re0istre PB?QP sera ; ,. Gote 1 + -n ce qui concerne les ?e0ister Aap, il I a tout ; droite le 5 ?eset 2tate 9, qui donne la valeur par d3aut "; la mise sous tension# de ces bits. 5 u 9 si0ni3ie que la valeur sera alatoire. Gote % + Il 3aut tou:ours 0arder ; lesprit que le PB?QN est coupl en entre avec les convertisseurs analo0iques numriques. -t que par d3aut, si on passe une patte du PB?QN en entre, elle est con3i0ure comme une entre analo0ique. Il ne 3aut pas oublier daller modi3ier le re0istre @/PCPK du module convertisseur analo0ique numrique "voir pa0e 1.! 1, du manuel#.

3/ Le module dinterruptions @ priori, un microcontrleur nest capable de$cuter quun seul pro0ramme ; la 3ois. Br, dans le cadre dapplications en temps rel "cest souvent le cas sur microcontrleur# il est ncessaire de pouvoir ra0i de 3a<on dInamique ; des chan0ements de lenvironnement. Cest l; le rle du module dinterruption. Prenons un e$emple + Fous aveC votre pro0ramme principal "main# qui tourne. /un coup, lutilisateur appuie sur un bouton qui est cens allum une L-/. Fous pouveC alors utiliser le module 5 Chan0e Goti3ication 9 "un sous module du IDB Port, voir pa0e 11!. du manuel# qui 0nre une interruption lors dune chan0ement dtat sur une entre + le pro0ramme principal se met en pause, le$cution se dplace dans la 3onction dinterruption Chan0e Goti3ication oE lont me le code correspondant ; lalluma0e de la L-/. Une 3ois le pro0ramme dinterruption e$cuter, le main reprend l; ou il stait arrMt. Plusieurs modules peuvent 0nrer des interruptions sous plusieurs conditions qui sont ; chaque 3ois dcrite dans la section correspondant au module en question dans le manuel. Pour con3i0urer ces interruptions, il 3aut a0ir sur & re0istres qui sont dcrits pa0e !1( du manuel "2ection 5 Interrupt Control and 2tatus ?e0ister 9#. Gous allons a0ir uniquement sur les re0istres IP2$, I-C$ et IPC$. Le re0istre I-C$ "Interrupt -nable Control ?e0ister# + Ce re0istre sert ; d3inir quelles sont les interruptions qui sont autorises. Fu quil I a beaucoup dinterruptions possibles, un seul re0istre ne su33it pas, il I en a donc & "I-C,, I-C1, I-C%#. Pour autoriser linterruption chan0e noti3ication, on observe pa0e !%( quil 3aut positionner le bit CGI- du re0istre I-C, ; 1. Le re0istre IP2$ "Interrupt Pla0 2tatus ?e0ister# + Ce re0istre indique au processeur quelle interruption il doit traiter. Pa0e !1) du manuel on voit que si le bit CGIP du re0istre IP2, est ; 1, alors le processeur doit e$cuter le pro0ramme dinterruption correspondant au Chan0e Goti3ication. Ce bit ne se remet pas ; Cro tout seul, il 3aut donc sIstmatiquement le remettre ; , ; la 3in du pro0ramme dinterruption. Le re0istre IPC$ "Interrupt prioritI Control ?e0ister# + Ce re0istre sert ; d3inir la priorit dune interruption. Cette priorit permet de rsoudre les con3lits dinterruptions "plusieurs interruptions en mMme temps#. La priorit la plus haute, sur une chelle de , ; ., passe en premier ", :amais e$cut#. 2i on veut mettre une priorit de ( pour le Chan0e Goti3ication, il 3aut crire la valeur ( sur les & bits CGIP du re0istre IPC& "voir pa0e !&& du manuel#. +/ Le module ,imer1 Ce module est un compteur. /ans son utilisation la plus basique, il compte le nombre de cIcles dhorlo0e. Aais on peut aussi le con3i0urer pour compter le nombre de chan0ements dtats sur une entre. 2i on re0arde le manuel, on voit quil e$iste plusieurs tIpes de timer "@, N et C#. Br, pa0e & de la datasheet, une note nous in3orme que le Qimer1 est un timer de tIpe @. 2on 3onctionnement est alors dcrit pa0e 1%!& du manuel "puis viennent les re0istres de con3i0uration, et en3in une descriptions dtaill de laction de tout ces re0istres#.

Gous allons dtailler le 3onctionnement du Qimer1 comme compteur dhorlo0e chronomtre. Pa0e de la datasheet, on observe que ce module utilise & re0istres.

QA?1 est la valeur actuelle du compteur. P?1 est la valeur ma$ du compteur + lorsque QA?1 6 P?1, le compteur se remet ; , et recommence ; compter. Le module peut alors 0nrer une interruption sil en ; lautorisation "0rUce au bit Q1I- du re0istre I-C,, pa0e !%( du manuel#. Q1CBG est le re0istre de con3i0uration du module. 2on utilisation est dcrite succinctement ; la pa0e 1%! du manuel. Q1CBG + QC2 permet de choisir ce quil 3aut compter. Pour compter les cIcles de lhorlo0e interne, et donc le temps, il 3aut positionner QC2 ; , "Internal Cloc> "Posc D (##. "Posc D ( 3ait r3rence au 3ait quil 3aut ( cIcles pour raliser une instruction#. Q2VGC nest pas ; utiliser. -n e33et, il est indiqu di0norer ce bit si QC2 6 ,. QCWP2 est un 0roupe de % bits servant ; d3inir au bout de combien dvnements ; compter, la valeur de QA?1 est incrmente de 1. Ici lvnement ; compter est 5 une priode dhorlo0e 9. @ priori, on veut donc que QA?1 au0mente de 1 ; chaque priode dhorlo0e. -n ralit, tout dpend du temps que lon veut compter. Car il ne 3aut pas oublier que QA?1 est un re0istre 1 bits, et donc, il ne peut prendre qu des valeurs entre , et ''&'. 2i QCWP2 est ; , "1 priode une incrmentation de QA?1#, alors on ne pourra compter que .''&' ms "en considrant que 1 instruction 1,, ns#. Bn peut alors choisir de perdre en prcision, mais de 0a0ner en lon0vit. Pour cela on pourra par e$emple positionner QCWP2 ; 1 ") priodes dhorlo0e 1 incrmentation de QA?1#. La prcision sera alors de ),,ns, mais on pourra compter :usqu; '%.(%) ms. Bn peut ainsi r0ler ce prescaler "chan0ement dchelle# pour un rapport de 1+1, 1+), 1+ ( ou 1+%' . QK@Q- ne sera pas utilis ici, voir pa0e 1%!1% du manuel pour sa description complte#. Q2I/L permet de dire si le module doit continue de compter ou non lorsque le microcontrleur passe en mode veille. -n mettant Q2I/L ; ,, on pourra ainsi mettre le dsPIC en veille, et le rveiller via une interruption au bout dun certain temps. QBG sert ; activer ou non le compta0e. Il est pr3rable dactiver le timer aprs davoir con3i0ur tout le reste. Cette description succincte du Qimer1 nillustre quune 3a<on de lutiliser, mais cest une des plus courantes. -/ Le module P.M // Le module A0C

C- La programmation
1/ Particularits de la programmation C30 Le lan0a0e utilis pour pro0rammer les dsPIC est le C&,. Cest du C classique auquel viennent se ra:outer quelques petites particularits que nous allons dtailler. Le lo0iciel utiliser pour pro0rammer se nomme APL@N, il est 3ournit 0ratuitement par Aicrochip. Pour le compilateur C&,, il est paIant, mais 0ratuit pour les tudiants "il 3aut crer un compte sur le site de Aicrochip avec son adresse mail IG2@#. Pour la prise en main du lo0iciel APL@N, et son utilisation pour 3aire de la simulation, :e vous renvoi au P/P 5 Inter3ace APL@N 9. Pour dbuter un nouveau pro:et, utiliseC le modle de pro:et 3ourni avec ce cours, il constitue une bonne base que nous allons dcrire. Xe vous invite 0alement ; utiliser au ma$imum les librairies cres par le club pour utiliser les di33rents modules du dsPIC, comme la librairie C@G pour communiquer avec le PC. Chaque librairie devrait avoir sa documentation associe ; terme. Foici la liste non e$haustive des spci3icits du lan0a0e C&, + 1D Yinclude Zp&,3$$$$.hZ Cette li0ne permet dinclure un 3ichier qui indique au compilateur C la correspondance entre les noms de re0istres que vous alleC utiliser, et leur emplacement dans la mmoire du microcontrleur. %D DD Internal P?C Bscillator [PB2C"\Q[PLL(# [PH/Q"H/Q[BPP ] H/QP2@['1%# [PNB?PB?"PNB?[BG ] NB?F[%.# [PK2"CB/-[P?BQ[BPP# Ces li0nes servent ; con3i0urer le 3onctionnement 0nral du microcontrleur. Il ne vaut mieu$ pas I toucher. La seule li0ne intressante est la li0ne 5 [PB2C"\Q[PLL(# 9. -lle con3i0ure le microcontrleur comme utilisant une horlo0e e$terne "\Q# avec une PLL $( "[PLL(#. Bn peut utiliser lhorlo0e interne coupl dune PLL $( en mettant [PB2C"P?C[PLL(#. "voir pa0e .!&1 du manuel# Ce bout de code remplace le r0la0e des 5 Con3i0uration bits 9 de APL@N dcrit pa0e . du P/P 5 Inter3ace APL@N 9. Il ne 3aut donc pas le 3aire. &D L@Q-bits.L@Q-, 6 18 Cette li0ne positionne le bit L@Q-, du re0istre L@Q- ; 1. /une manire 0nrale, il convient de lire le nom des bits et des re0istres dans les ?e0ister Aap de la datasheet, et doprer ainsi pour accder ; la valeur + 5 JGom du re0istreLbits.JGom du bitL 9. Pour lire la valeur de la patte ?P% con3i0ure comme une entre, il 3aut 3aire + 5 int $ 6 PB?QPbits.?P% 8 9.

Pour activer le Qimer1 il 3aut 3aire + 5 Q1CBGbits.QBG 6 1 8 9 (D void [I2?P@2Q [Q1Interrupt"void# ^ D7 Code du pro0ramme dinterruption 7D IP2,bits.Q1IP 6 , 8 _ La li0ne 5 void [I2?P@2Q [Q1Interrupt"void# 9 est compltement spci3ique au lan0a0e C&,. Cest ainsi quon dclare un pro0ramme dinterruption. La sInta$e 0nrique est la suivante + 5 void [I2?P@2Q [JGom de linterruptionLInterrupt"void# 9 Pour conna`tre la valeur de JGom de linterruptionL il 3aut se r3rer ; la table '!1 de la pa0e (, de la datasheet + s la colonne Interrupt 2ource on trouve le nom de linterruption, et son ori0ine. Par e$emple + 5 Q1 a Qimer 1 9, le nom tant Q1 et lori0ine Qimer 1. Gote + LentMte de la 3onction dinterruption pour le Chan0e Goti3ication est + 5 void [I2?P@2Q [CGInterrupt"void# 9. La datasheet ne prcise pas le nom, il est :uste indiqu 5 Input Chan0e Interrupt 9. Il convient ensuite de placer dans ce pro0ramme dinterruption le corps du pro0ramme, puis de ne surtout pas oublier de remettre le Interrupt 2tatus Pla0 ; , pour rendre la main au main ; la 3in de la 3onction. 'D bhile"1# 8 2ur un PC, lorsquun pro0ramme a 3ini de se$cuter, il quitte. Br, on ne peut pas 5 quitter 9 sur un microcontrleur. Il 3aut donc imprativement que lorsque le pro0ramme principal se termine "main# il arrive sur une boucle in3ini "bhile"1## + au lieu de quitter, on lui demande simplement de ne rien 3aire ind3iniment. 2i vous oublier cette boucle in3inie, le microcontrleur va se mettre ; 3aire nimporte quoi de 3a<on alatoire. / Programme 1 Faire clignoter une L)0 2 -34 La L-/ est branche sur la patte Go % , ?-,. Pour obtenir une 3rquence de 'OC, il 3aut chan0er ltat de la L-/ toutes les ,.1 secondes car une priode complte quivaut ; deu$ chan0ements dtat.

Yinclude Zp&,3$$$$.hZ DD Internal P?C Bscillator [PB2C"\Q[PLL(# [PH/Q"H/Q[BPP ] H/QP2@['1%# [PNB?PB?"PNB?[BG ] NB?F[%.# [PK2"CB/-[P?BQ[BPP# int main"void# ^ DDCon3i0uration du module IDB Q?I2-bits.Q?I2-, 6 ,8 DD/e3inition en sortie L@Q-bits.L@Q-, 6 ,8 DDLa L-/ est initialement teinte DDCon3i0uration du module Qimer1 Q1CBGbits.QC2 6 , 8 DD2ource + Internal Cloc> "1,AOC# Q1CBGbits.QCWP2 6 & 8 DDPrescaler de 1+ ( "on peut compter de , ; ,.(%sec avec une prcision de .( =sec# Q1CBGbits.Q2I/L 6 , 8 DDContinue de compter en mode veille DD?0la0e de la priode du timer1 P?1 6 1' %' 8 DDQA?1 recommence lorsquil vaut 1' %' + ,.1sec61' %' 7 ( 7 1,,ns DDCon3i0uration de linterruption IP2,bits.Q1IP 6 , 8 DD?emise ; , du 3la0 I-C,bits.Q1I- 6 1 8 DDBn autorise linterruption IPC,bits.Q1IP 6 ( 8 DDpriorit de (D. DDBn active le timer Q1CBGbits.QBG 6 1 8 DDPin du pro0ramme principal bhile"1# 8 _ void [I2?P@2Q [Q1Interrupt"void# ^ DDChan0ement dtat de la L-/ i3"L@Q-bits.L@Q-, 66 ,# L@Q-its.L@Q-, 6 1 8 else L@Q-bits.L@Q-, 6 , 8 DDBn rend la main au pro0ramme principal IP2,bits.Q1IP 6 , 8 _ Gormalement, vous devrieC avoir compris lint0ralit de ce pro0ramme qui commence par con3i0urer le port de sortie et le timer, puis qui toutes les ,.1sec chan0e ltat de la L-/.

You might also like