Vous êtes sur la page 1sur 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 16-bits. Ce qui veut dire quil peut raliser des oprations lmentaires (additions, soustractions) directement sur des entiers cods sur 16-bits. Par exemple, il peut additionner dun seul coup 12352 avec 24896 (rappel : un entier sur 16 bits est compris entre 0 et 65535). En 2007, nous utilisions des processeurs 8-bits, bien plus limits en terme de calcul (8-bits 0..255). De plus, le processeur du dsPIC est accompagn dun cur DSP (Digital Signal Processing). Ce cur est une espce de processeur annexe ddi aux calculs mathmatiques. Ce qui confre au dsPIC la possibilit de raliser rapidement multiplications, divisions, calculs trigonomtriques Cette puissance de calcul est dun confort remarquable, surtout lorsquon programme en C. En effet, il est facile dcrire x = 45*658; en C, or sur un microcontrleur classique, cette seule ligne dinstruction pourrait prendre jusqu 1 seconde sexcuter. Sur un dsPIC, a ne prendra que quelques secondes. Ct mmoire, le dsPIC possde 2ko pour stocker des variables (quivalent de la RAM dun PC), 4ko pour stocker pour stocker le programme, et 4ko dEEPROM pour stocker des variables qui ne se perdent pas lorsquon dbranche lalimentation (quivalent du disque dur dun PC). En ce qui concerne les priphriques, le dsPIC est assez fourni. Le premier priphrique est le module Entre/Sortie, qui permet de lire o dcrire des valeurs binaires sur la 20aine de pattes qui compose un dsPIC. On peut mettre une sortie 5V ou 0V, et on peut lire une entre pour savoir si la patte est 0V ou 5V. Il possde aussi 3 timers, sorte de chronomtres permettant de raliser des temps dattente, on dactiver un certain nombre dactions de manire priodique. Nous avons a notre disposition 3 modules PWM, permettant de gnrer des signaux en crneau frquence et rapport cyclique variable (en gnral, ce module constitue une sortie vers le monde analogique). Il y a 6 convertisseurs analogique-numrique 10-bits et 3 modules capture and compare (sert mesurer des frquences et comparer des signaux logiques). Enfin, il possde toute une gamme de modules ddis la communication avec lextrieur (liaison srie, I2C, SPI, CAN). En ce qui concerne lutilisation dun dsPIC, nous le programmerons en C. Nous dtaillerons comment la couche matrielle est prise en compte dans le langage C. (Comment utiliser les priphriques). Voil pour un petit survol de ce matriel, maintenant nous allons dtailler comment il fonctionne et comment lutiliser. 2/ Branchement dun dsPIC

[Photo EAGLE] Pour alimenter un dsPIC en rgime de fonctionnement normal, il faut lui fournir une tension comprise entre 4.5V et 5.5V. Cette tension sera applique entre ses pattes Vdd et Vss. Il faut noter quil possde plusieurs pattes Vdd et Vss, ceci afin de proposer plusieurs solutions dintgration : Selon la disposition des composants sur la carte, il sera peut tre plus facile dutiliser certaines pattes Vdd-Vss que dautres. Pour quun dsPIC fonctionne correctement, il faut relier la patte MCLR (Master Clear) au 5V par une rsistance de 10kohm. A ce stade, un programme peut tourner. Pour programmer un dsPIC, il faut relier les pattes MCLR, PGC, PGD, ainsi que le 5V et le 0V lICD2 (un module brancher en USB sur un PC). Sur les cartes allant dans le robot, on a dcid de ne pas mettre le connecteur de lICD2. Par contre il y a 2-3 cartes de dveloppement ou ce connecteur y est, on les utilise pour faire des tests quand on na pas les cartes dfinitives, et pour programmer les cartes dfinitives. Ensuite, toutes les autres pattes sont utilisables par les diffrents modules du dsPIC comme indiqu sur le nom des pattes. Exemple : RE0 est accessible comme entre sortie et comme sortie PWM1. 3/ Frquence de fonctionnement Comme tout processeur, pour fonctionner il doit tre muni dune horloge. Le dsPIC possde une horloge interne, mais pour une question de commodit, nous prfrons utiliser une horloge externe. Ce choix est tout fait discutable. Lhorloge externe est un cristal de quartz (matriau pizo-lectrique) de 10MHz (frquence doscillation propre du matriau). Pour fonctionner correctement, il doit tre reli aux entres OSC1 et OSC2 du dsPIC, et muni de deux condensateurs de 22pF (voir illustration du chapitre II). Il fourni une horloge 10MHz quil est possible de multiplier laide dun module dit de PLL. Nous choisissons de la multiplier par 4 (PLL x4). Or, pour excuter une instruction, le processeur besoin de 4 cycles dhorloge ; ce qui divise par 4 la frquence de fonctionnement. On arrive ainsi une frquence de fonctionnement finale de 10MHz, soit 100ns / instruction.

B- Laspect logiciel
1/ O trouver de linformation sur le dsPIC ? Vous allez tre amen utiliser deux documents : dsPIC30F Familly Reference manual dsPIC30F4012 Datasheet Le premier document est un descriptif complet et ultra dtaill de la famille de composant dsPIC30F. Il y prsente le fonctionnement et la configuration de tous les modules existants sur dsPIC. Le second document est lui, ddi au dsPIC30F4012 (le modle que nous utilisons pour lanne 2008). Il y prsente les caractristiques du modle en question, et un rsum du fonctionnement des divers modules qui le compose. Ces deux documents sont indissociables, le premier est indispensable pour pouvoir configurer un module (la description dun module dans le 2me fait plus office daide mmoire). Le deuxime est ncessaire pour obtenir des informations telles que le brochage des priphriques (quelle patte fait quoi). Tout au long de cette initiation, je vais faire rfrence ces deux documents (le manuel, et la datasheet). 2/ le module dE/S 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 tre dvelopps ici sappliqueront tous les autres modules.

Cette illustration se trouve dans la section Pin Diagrams de la datasheet. Elle est dmonstrative du brochage de ce composant. Nous observons que la majorit des pattes possdent un nom du type Rxy o x est une lettre allant de B F, et y un chiffre allant de 0 15. Cette dnomination dcrit la possibilit de ces pattes tre utilises comme entres/sorties. Toutes les pattes du microcontrleur sont organises en port, cest la lettre x. Sur ce port, chaque patte son propre numro y. Ainsi, la patte No 26, RE0 est la patte 0 du port E. Tous les ports ne sont pas complets (aucun mme sur ce microcontrleur), c'est--dire quils

nont pas tous tout les chiffres possibles. Si on avait utilis le dsPIC30F ayant le plus de pattes, on aurait eu tous les ports de complets. Pour utiliser une patte en entre/sortie il faut dfinir 2 choses : Est-ce une entre ou une sortie ? Quelle est sa valeur (de sortie ou dentre) ? Pour rpondre ces questions, nous allons utiliser des registres de configuration. Un registre est une zone de la mmoire qui est directement utilise par le matriel pour piloter son fonctionnement. Cest une sorte de variable, mais qui possde un impact direct et intrinsque. Chaque priphrique utilise des registres pour fonctionner. Pour le module I/O, ces registres se nomment TRISx, PORTx et LATx (Section 11.2 I/O Port Control Register ). Le manuel dcrit lutilisation de ces registres, mais il faut se rfrer la page 59 de la datasheet ( 8-1 I/O Port Register Map ) pour voir quels bits de configuration nous avons accs sur notre modle de dsPIC. On retrouve bien que ces registres ne sont pas complets, il y a juste les bits dont les pattes sont disponibles. Il est impratif de toujours utiliser ces tables pour avoir le nom exact des bits de configuration et des registres (indispensable lors de la phase de programmation o on utilisera directement ces noms). Le registre TRISx sert donner la direction dune patte : entre ou sortie. Daprs le manuel, si on met le bit TRISE0 du registre TRISE 0, alors la patte No 26 (RE0) est dfinit comme tant une sortie. De mme, si on met le bit TRISF2 du registre TRISF 1, alors la patte No 18 (RF2) sera dfinit comme tant une entre. Ce qui va suivre est une simplification du fonctionnement des registres LATx et PORTx. Lorsquune patte est dfinit en sortie, on lui affecte une valeur en utilisant le registre LATx. Par exemple, si on veut mettre la patte No 26 (RE0) 5V, il suffit de positionner le bit LATE0 du registre LATE 1. Si la patte est dfinit en sortie, on lit sa valeur en regardant la valeur du registre PORTx. Par exemple si la patte RF2 est 0V, alors le bit RF2 du registre PORTF sera 0. Note 1 : En ce qui concerne les Register Map, il y a tout droite le Reset State , qui donne la valeur par dfaut ( la mise sous tension) de ces bits. u signifie que la valeur sera alatoire. Note 2 : Il faut toujours garder lesprit que le PORTB est coupl en entre avec les convertisseurs analogiques numriques. Et que par dfaut, si on passe une patte du PORTB en entre, elle est configure comme une entre analogique. Il ne faut pas oublier daller modifier le registre ADPCFG du module convertisseur analogique numrique (voir page 17-10 du manuel).

3/ Le module dinterruptions A priori, un microcontrleur nest capable dexcuter quun seul programme la fois. Or, dans le cadre dapplications en temps rel (cest souvent le cas sur microcontrleur) il est ncessaire de pouvoir ragi de faon dynamique des changements de lenvironnement. Cest l le rle du module dinterruption. Prenons un exemple : Vous avez votre programme principal (main) qui tourne. Dun coup, lutilisateur appuie sur un bouton qui est cens allum une LED. Vous pouvez alors utiliser le module Change Notification (un sous module du I/O Port, voir page 11-7 du manuel) qui gnre une interruption lors dune changement dtat sur une entre : le programme principal se met en pause, lexcution se dplace dans la fonction dinterruption Change Notification o lont me le code correspondant lallumage de la LED. Une fois le programme dinterruption excuter, le main reprend l ou il stait arrt. Plusieurs modules peuvent gnrer des interruptions sous plusieurs conditions qui sont chaque fois dcrite dans la section correspondant au module en question dans le manuel. Pour configurer ces interruptions, il faut agir sur 3 registres qui sont dcrits page 6-14 du manuel (Section Interrupt Control and Status Register ). Nous allons agir uniquement sur les registres IFSx, IECx et IPCx. Le registre IECx (Interrupt Enable Control Register) : Ce registre sert dfinir quelles sont les interruptions qui sont autorises. Vu quil y a beaucoup dinterruptions possibles, un seul registre ne suffit pas, il y en a donc 3 (IEC0, IEC1, IEC2). Pour autoriser linterruption change notification, on observe page 6-24 quil faut positionner le bit CNIE du registre IEC0 1. Le registre IFSx (Interrupt Flag Status Register) : Ce registre indique au processeur quelle interruption il doit traiter. Page 6-18 du manuel on voit que si le bit CNIF du registre IFS0 est 1, alors le processeur doit excuter le programme dinterruption correspondant au Change Notification. Ce bit ne se remet pas zro tout seul, il faut donc systmatiquement le remettre 0 la fin du programme dinterruption. Le registre IPCx (Interrupt priority Control Register) : Ce registre sert dfinir la priorit dune interruption. Cette priorit permet de rsoudre les conflits dinterruptions (plusieurs interruptions en mme temps). La priorit la plus haute, sur une chelle de 0 7, passe en premier (0 jamais excut). Si on veut mettre une priorit de 4 pour le Change Notification, il faut crire la valeur 4 sur les 3 bits CNIP du registre IPC3 (voir page 6-33 du manuel). 4/ Le module Timer1 Ce module est un compteur. Dans son utilisation la plus basique, il compte le nombre de cycles dhorloge. Mais on peut aussi le configurer pour compter le nombre de changements dtats sur une entre. Si on regarde le manuel, on voit quil existe plusieurs types de timer (A, B et C). Or, page 63 de la datasheet, une note nous informe que le Timer1 est un timer de type A. Son fonctionnement est alors dcrit page 12-3 du manuel (puis viennent les registres de configuration, et enfin une descriptions dtaill de laction de tout ces registres).

Nous allons dtailler le fonctionnement du Timer1 comme compteur dhorloge chronomtre. Page 66 de la datasheet, on observe que ce module utilise 3 registres. TMR1 est la valeur actuelle du compteur. PR1 est la valeur max du compteur : lorsque TMR1 = PR1, le compteur se remet 0 et recommence compter. Le module peut alors gnrer une interruption sil en lautorisation (grce au bit T1IE du registre IEC0, page 6-24 du manuel). T1CON est le registre de configuration du module. Son utilisation est dcrite succinctement la page 12-6 du manuel. T1CON : TCS permet de choisir ce quil faut compter. Pour compter les cycles de lhorloge interne, et donc le temps, il faut positionner TCS 0 (Internal Clock (Fosc / 4)). (Fosc / 4 fait rfrence au fait quil faut 4 cycles pour raliser une instruction). TSYNC nest pas utiliser. En effet, il est indiqu dignorer ce bit si TCS = 0. TCKPS est un groupe de 2 bits servant dfinir au bout de combien dvnements compter, la valeur de TMR1 est incrmente de 1. Ici lvnement compter est une priode dhorloge . A priori, on veut donc que TMR1 augmente de 1 chaque priode dhorloge. En ralit, tout dpend du temps que lon veut compter. Car il ne faut pas oublier que TMR1 est un registre 16 bits, et donc, il ne peut prendre qu des valeurs entre 0 et 65535. Si TCKPS est 0 (1 priode une incrmentation de TMR1), alors on ne pourra compter que 6.5535 ms (en considrant que 1 instruction 100 ns). On peut alors choisir de perdre en prcision, mais de gagner en longvit. Pour cela on pourra par exemple positionner TCKPS 1 (8 priodes dhorloge 1 incrmentation de TMR1). La prcision sera alors de 800ns, mais on pourra compter jusqu 52.428 ms. On peut ainsi rgler ce prescaler (changement dchelle) pour un rapport de 1:1, 1:8, 1:64 ou 1:256. TGATE ne sera pas utilis ici, voir page 12-12 du manuel pour sa description complte). TSIDL permet de dire si le module doit continue de compter ou non lorsque le microcontrleur passe en mode veille. En mettant TSIDL 0, on pourra ainsi mettre le dsPIC en veille, et le rveiller via une interruption au bout dun certain temps. TON sert activer ou non le comptage. Il est prfrable dactiver le timer aprs davoir configur tout le reste. Cette description succincte du Timer1 nillustre quune faon de lutiliser, mais cest une des plus courantes. 5/ Le module PWM 6/ Le module ADC

C- La programmation
1/ Particularits de la programmation C30 Le langage utilis pour programmer les dsPIC est le C30. Cest du C classique auquel viennent se rajouter quelques petites particularits que nous allons dtailler. Le logiciel utiliser pour programmer se nomme MPLAB, il est fournit gratuitement par Microchip. Pour le compilateur C30, il est payant, mais gratuit pour les tudiants (il faut crer un compte sur le site de Microchip avec son adresse mail INSA). Pour la prise en main du logiciel MPLAB, et son utilisation pour faire de la simulation, je vous renvoi au PDF Interface MPLAB . Pour dbuter un nouveau projet, utilisez le modle de projet fourni avec ce cours, il constitue une bonne base que nous allons dcrire. Je vous invite galement utiliser au maximum les librairies cres par le club pour utiliser les diffrents modules du dsPIC, comme la librairie CAN pour communiquer avec le PC. Chaque librairie devrait avoir sa documentation associe terme. Voici la liste non exhaustive des spcificits du langage C30 : 1/ #include "p30fxxxx.h" Cette ligne permet dinclure un fichier qui indique au compilateur C la correspondance entre les noms de registres que vous allez utiliser, et leur emplacement dans la mmoire du microcontrleur. 2/ // Internal FRC Oscillator _FOSC(XT_PLL4) _FWDT(WDT_OFF & WDTPSA_512) _FBORPOR(PBOR_ON & BORV_27) _FGS(CODE_PROT_OFF) Ces lignes servent configurer le fonctionnement gnral du microcontrleur. Il ne vaut mieux pas y toucher. La seule ligne intressante est la ligne _FOSC(XT_PLL4) . Elle configure le microcontrleur comme utilisant une horloge externe (XT) avec une PLL x4 (_PLL4). On peut utiliser lhorloge interne coupl dune PLL x4 en mettant _FOSC(FRC_PLL4). (voir page 7-31 du manuel) Ce bout de code remplace le rglage des Configuration bits de MPLAB dcrit page 7 du PDF Interface MPLAB . Il ne faut donc pas le faire. 3/ LATEbits.LATE0 = 1; Cette ligne positionne le bit LATE0 du registre LATE 1. Dune manire gnrale, il convient de lire le nom des bits et des registres dans les Register Map de la datasheet, et doprer ainsi pour accder la valeur : [Nom du registre]bits.[Nom du bit] . Pour lire la valeur de la patte RF2 configure comme une entre, il faut faire : int x = PORTFbits.RF2 ; .

Pour activer le Timer1 il faut faire : T1CONbits.TON = 1 ; 4/ void _ISRFAST _T1Interrupt(void) { /* Code du programme dinterruption */ IFS0bits.T1IF = 0 ; } La ligne void _ISRFAST _T1Interrupt(void) est compltement spcifique au langage C30. Cest ainsi quon dclare un programme dinterruption. La syntaxe gnrique est la suivante : void _ISRFAST _[Nom de linterruption]Interrupt(void) Pour connatre la valeur de [Nom de linterruption] il faut se rfrer la table 5-1 de la page 40 de la datasheet : s la colonne Interrupt Source on trouve le nom de linterruption, et son origine. Par exemple : T1 Timer 1 , le nom tant T1 et lorigine Timer 1. Note : Lentte de la fonction dinterruption pour le Change Notification est : void _ISRFAST _CNInterrupt(void) . La datasheet ne prcise pas le nom, il est juste indiqu Input Change Interrupt . Il convient ensuite de placer dans ce programme dinterruption le corps du programme, puis de ne surtout pas oublier de remettre le Interrupt Status Flag 0 pour rendre la main au main la fin de la fonction. 5/ while(1) ; Sur un PC, lorsquun programme a fini de sexcuter, il quitte. Or, on ne peut pas quitter sur un microcontrleur. Il faut donc imprativement que lorsque le programme principal se termine (main) il arrive sur une boucle infini (while(1)) : au lieu de quitter, on lui demande simplement de ne rien faire indfiniment. Si vous oublier cette boucle infinie, le microcontrleur va se mettre faire nimporte quoi de faon alatoire. 2/ Programme : Faire clignoter une LED 5Hz La LED est branche sur la patte No 26, RE0. Pour obtenir une frquence de 5Hz, il faut changer ltat de la LED toutes les 0.1 secondes car une priode complte quivaut deux changements dtat.

#include "p30fxxxx.h" // Internal FRC Oscillator _FOSC(XT_PLL4) _FWDT(WDT_OFF & WDTPSA_512) _FBORPOR(PBOR_ON & BORV_27) _FGS(CODE_PROT_OFF) int main(void) { //Configuration du module I/O TRISEbits.TRISE0 = 0; //Definition en sortie LATEbits.LATE0 = 0; //La LED est initialement teinte //Configuration du module Timer1 T1CONbits.TCS = 0 ; //Source : Internal Clock (10MHz) T1CONbits.TCKPS = 3 ; //Prescaler de 1:64 (on peut compter de 0 0.42sec avec une prcision de 6.4 sec) T1CONbits.TSIDL = 0 ; //Continue de compter en mode veille //Rglage de la priode du timer1 PR1 = 15625 ; //TMR1 recommence lorsquil vaut 15625 : 0.1sec=15625 * 64 * 100ns //Configuration de linterruption IFS0bits.T1IF = 0 ; //Remise 0 du flag IEC0bits.T1IE = 1 ; //On autorise linterruption IPC0bits.T1IP = 4 ; //priorit de 4/7 //On active le timer T1CONbits.TON = 1 ; //Fin du programme principal while(1) ; } void _ISRFAST _T1Interrupt(void) { //Changement dtat de la LED if(LATEbits.LATE0 == 0) LATEits.LATE0 = 1 ; else LATEbits.LATE0 = 0 ; //On rend la main au programme principal IFS0bits.T1IF = 0 ; } Normalement, vous devriez avoir compris lintgralit de ce programme qui commence par configurer le port de sortie et le timer, puis qui toutes les 0.1sec change ltat de la LED.

Vous aimerez peut-être aussi