Tp Frdspic30F4011 Final

download Tp Frdspic30F4011 Final

of 83

Transcript of Tp Frdspic30F4011 Final

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

1

Sommaire1. 2. Introduction ........................................................................................................................ 4 Prsentation des outils de developpement.......................................................................... 4 2.1. MPLAB IDE .............................................................................................................. 4 2.1.1. Rapide prise en main du logiciel ........................................................................ 5 2.1.1.1. Cration du premier projet ......................................................................... 5 2.1.1.2. Simulation du premier projet...................................................................... 9 2.2. MPLAB ICD2 .......................................................................................................... 11 2.3. dsPICDEM2 ............................................................................................................. 11 2.4. Documentations utiles .............................................................................................. 12 3. Notion sur le projet et la programmation en C................................................................. 12 3.1. Composition du projet.............................................................................................. 12 3.2. Accs aux variables .................................................................................................. 13 3.3. Accs direct un bit dun registre de configuration ................................................ 14 3.4. Registres grant les interruptions ............................................................................. 14 3.5. Dclaration dune routine dinterruption.................................................................. 16 4. Application sous dsPIC30F.............................................................................................. 17 4.1. Gestion des interruptions externes INT0 et INT1 .................................................... 17 4.1.1. Avant propos .................................................................................................... 17 4.1.2. Programmation ................................................................................................. 17 4.1.2.1. Initialisation des interruptions INT0 et INT1........................................... 17 4.1.2.2. Dclaration du prototype de la fonction ................................................... 18 4.1.2.3. Ecriture des routines dinterruptions associes ........................................ 18 4.1.2.4. Ecriture de la fonction principale (main.c)............................................... 18 4.2. Gestion des Timers 1 et 3......................................................................................... 19 4.2.1. Avant Propos .................................................................................................... 19 4.2.2. Programmation ................................................................................................. 24 4.2.2.1. Initialisation des Timers ........................................................................... 24 4.2.2.1.1. Timer1 ................................................................................................... 24 4.2.2.1.2. Timer3 ................................................................................................... 25 4.2.2.2. Dclaration du prototype des fonctions.................................................... 25 4.2.2.3. Ecriture des routines dinterruptions associes ........................................ 26 4.2.2.3.1. Timer1 ................................................................................................... 26 4.2.2.3.2. Timer3 ................................................................................................... 27 4.2.2.4. Ecriture de la fonction principale (main.c)............................................... 27 4.2.3. Simulation ........................................................................................................ 28 4.3. Gestion de lUART .................................................................................................. 28 4.3.1. Avant propos .................................................................................................... 28 4.3.2. Programmation ................................................................................................. 32 4.3.2.1. Initialisation de lUART........................................................................... 32 4.3.2.2. Dclaration du prototype de la fonction ................................................... 32 4.3.2.3. Ecriture des routines dinterruptions associes ........................................ 33 4.3.2.4. Ecriture de la fonction principale (main.c)............................................... 34 4.3.3. Simulation ........................................................................................................ 36 4.4. Gestion de la PWM .................................................................................................. 37 4.4.1. Avant propos .................................................................................................... 37 4.4.2. Programmation ................................................................................................. 41 4.4.2.1. Initialisation du module PWM ................................................................. 41UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

2

4.4.2.2. Dclaration du prototype de la fonction ................................................... 42 4.4.2.3. Ecriture de la fonction principale (main.c)............................................... 43 4.4.3. Simulation ........................................................................................................ 43 4.5. Gestion du convertisseur Analogique Numrique 10 bits........................................ 44 4.5.1. Avant propos .................................................................................................... 44 4.5.2. Programmation ................................................................................................. 53 4.5.2.1. Initialisation de lADC ............................................................................. 53 4.5.2.2. Dclaration du prototype de la fonction ................................................... 54 4.5.2.3. Ecriture des routines dinterruptions associes ........................................ 54 4.5.2.4. Ecriture de la fonction principale (main.c)............................................... 54 4.5.3. Simulation ........................................................................................................ 57 4.6. Gestion du SPI pour communication avec LCD ...................................................... 57 4.6.1. Avant propos .................................................................................................... 58 4.6.2. Programmation ................................................................................................. 60 4.6.2.1. Initialisation du module SPI..................................................................... 61 4.6.2.2. Sous-programme dcriture sur lafficheur LCD ..................................... 61 4.6.2.3. Dclaration du prototype des fonctions.................................................... 64 4.6.2.4. Ecriture de la fonction principale (main.c)............................................... 64 4.6.3. Simulation ........................................................................................................ 64 5. Conclusion........................................................................................................................ 64 6. Le noyau temps-rel PICOS............................................................................................. 65 6.1. Prsentation .............................................................................................................. 65 6.1.1. Les avantages dun noyau temps-rel .............................................................. 65 6.1.2. Les inconvnients dun noyau temps-rel ........................................................ 65 6.2. PICOS : un noyau temps-rel, multitches, premptif, normalis ........................... 66 6.2.1. Un noyau temps-rel. ....................................................................................... 66 6.2.2. Un noyau multitches....................................................................................... 66 6.2.3. Un noyau premptif.......................................................................................... 66 6.2.4. Un noyau normalis ......................................................................................... 66 6.3. Mise en uvre de PICOS ......................................................................................... 67 6.3.1. Objectif et attentes............................................................................................ 67 6.3.2. Etape n1 : se procurer les outils ncessaires ................................................... 67 6.3.3. Etape n2 : installer et configurer les outils ..................................................... 67 6.3.4. Etape n3 : cration et paramtrage du projet PICOS ...................................... 68 6.3.5. Etape n4 : Ajouter les fichiers au projet ......................................................... 69 6.3.6. Etape n5 : Paramtrer les chemins des ressources.......................................... 69 6.4. Comprendre le fonctionnement de PICOS, visite guide du code ........................... 70 6.4.1. Le fichier main.c .............................................................................................. 70 6.4.2. Le fichier Tascdesc.c........................................................................................ 73 6.4.3. Le fichier tsk_taskX.c ...................................................................................... 76 6.5. Cration dune nouvelle tche.................................................................................. 77 6.5.1. Cration dun nouveau fichier tsk_taskX.c ...................................................... 77 6.5.2. Modifications dans le fichier taskdesc.c .......................................................... 77 6.5.3. Modifications dans le fichier define.h.............................................................. 80 6.6. Exemple de fonction pilote par PICOS : contrle moteur par PWM ..................... 80 6.6.1. Phase de dveloppement .................................................................................. 81 6.6.2. Intgration du code dans lenvironnement de PICOS ...................................... 82 7. Conclusion........................................................................................................................ 83

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

3

1. IntroductionLa plupart des processus industriels sont maintenant commands et superviss par des batteries de microcontrleurs. Ces derniers permettent une meilleur flexibilit de commande des processus, de plus ils apportent des solutions de communication, qui pour lors ne sont pas ralisables dans un processus totalement analogique. Ainsi lindustrie tend de plus en plus vers des communications Machine to Machine (M2M) permettant de suivre la qualit de la fabrication et de corriger des dysfonctionnements rapidement. Pour exemple, si sur une machine-outil un roulement suse plus rapidement que prvu, ou quune cote nest plus exacte, les capteurs le dtectent et envoient linformation la machine en amont qui peut prendre la dcision de changer sa commande. Tout ceci demande une intelligence embarque des capteurs de plus en plus importante. Ainsi les capteurs standards dans le pass mesuraient une grandeur voulue, maintenant grce aux microcontrleurs embarqus, il est possible de compenser les grandeurs dinfluences, de donner des informations de diagnostic permettant de faire remonter des informations de dysfonctionnement aux calculateurs. Une tendance actuelle est aussi de pouvoir paramtrer les capteurs distance. A la lumire de ceci, nous pouvons en dduire que les microcontrleurs au plus prs du processus (gestion de capteur, de commande moteur,) doivent grer un flux de donnes consquents tout en respectant des contraintes temps rel. Lunit de valeur TR57 a pour but de sensibiliser les tudiants la commande temps rel des processus. Une commande est dite temps-rel lorsquelle respecte deux principes : Le temps dacquisition des donnes : le traitement et la restitution de la commande respecte des temps dfinis dans le cahier des charges. La commande doit tre dterministe, c'est--dire que pour une entre donne la sortie doit toujours tre la mme.

2. Prsentation des outils de developpement2.1. MPLAB IDE MPLAB IDE est un environnement intgr de dveloppement permettant de programmer toutes les familles de microcontrleur de Microchip. De base et en version gratuite disponible sur www.microchip.com , il est possible de dvelopper des applications uniquement en langage Assembleur. Ladjonction de module tel que C18 ou C30 permet de programmer en C respectivement des microcontrleurs de la famille 18F et 30F. Ces modules sont aussi disponibles sur le site internet mais seulement en version tudiante. Cette version optimise le code pendant une dure de 60jours puis fonctionne sans optimisation de code. Loption doptimisation est inutile car lutilisation ultrieur du noyau temps rel PICos(voir www.picos18.com) de la socit PRAGMATEC nutilise pas loptimisation du code. La suite des explications est donne pour la version v7.5 de MPLAB IDE et MPLAB C30 version 2.05. Les dveloppements se font sur une cible dsPIC30F4011.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

4

2.1.1. Rapide prise en main du logiciel Cette rapide prise en main du logiciel na pas pour but dexpliquer toutes les fonctionnalits de MPLAB IDE et de MPLAB C30, mais dexpliquer le minimum pour pouvoir lancer un projet. Aprs avoir install le logiciel MPLAB IDE et MPLAB C30, lancer lapplication. 2.1.1.1.Cration du premier projet La premire tape est de vrifier que MPLAB C30 est bien install. Pour ce faire cliquer sur ProjectSet Language Tool Locations

Vrifier que le compilateur est bien install. Puis faire OK

La cration dun nouveau projet se fait par ProjectProject Wizard.. Cliquer sur suivant puis choisir la cible (dans notre cas dsPIC30F4011) puis Suivant.

Il faut maintenant choisir le langage de programmation, nous dveloppons une application pour dsPIC30F il nous faut donc choisir Active Toolsuite : Microchip C30 Toolsuite. Puis cliquer sur Suivant

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

5

Entrer le nom de votre projet ainsi que son emplacement sur le disque dur. Puis cliquer sur Suivant. Attention le nom de votre projet ne doit pas dpasser les 8 caractres et il est souvent prconis de navoir aucun espace dans ladresse de votre dossier ou le projet est sauvegard.

Vous pouvez inclure des fichiers qui existent dj dans votre dossier (fichier header *.h ou fichier contenant du code *.c, fichier linker .gld ou tout autre fichier reconnu par lenvironnement de dveloppement). Dans notre cas aucun fichier nest joindre. Cliquer sur Suivant, puis vrifier les donnes et cliquer sur Terminer si tout vous convient.

Votre projet est maintenant cr. Il faut toutefois encore y adjoindre quelques fichiers. Recherchez sur votre ordinateur le fichier p30f4011.gld, ce fichier permet de faire le lien lors de la compilation entre votre programme et le dsPIC utilis. Il se peut que se fichier se trouve sous le rpertoire C:\Program Files\Microchip\MPLAB ASM30 Suite\Support\gld En dautres cas faire une recherche sous Windows. Lorsque vous avez trouv ce fichier, le copier dans le dossier du projet. Recherchez aussi le fichier p30f4011.h, ce fichier contient tous les registres du microcontrleur. Il se peut que ce fichier se trouve sous le rpertoire Emplacement o est install MPLAB C30\support\h En dautres cas faire une recherche sous Windows.

Lorsque vous avez trouv ce fichier, le copier dans le dossier du projet. Il vous suffit maintenant dinclure ces deux fichiers dans le projet en cliquant (clique droit) sur votre projet puis Add FilesUTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

6

Choisir p30f4011.h puis cliquer sur Ouvrir Rpter lopration mais en choisissant dans le menu droulant Fichier de type Linker Scripts (*.gld) slectionner p30f4011.gld puis ouvrir. Il faut encore configurer certains bits pour que votre projet soit prt. Cliquer sur ConfigureConfiguration Bits Ces registres permettent de configurer les bits de fonctionnement du microcontrleur. Oscillator Source = Primary Oscillator Cette configuration indique que le microcontrleur utilise le quartz branch sur les broches OSC1/OSC2. Primary Oscillator Mode = XT w/PLL4x Le quartz branch sur les Pin OSC1 et OSC2 donne la frquence de fonctionnement du CPU (Fcy=Fosc/4). Ce microcontrleur peut augmenter la vitesse CPU en utilisant une PLL tout en gardant le mme quartz. Ainsi si le mode XT w/PLL4x est slectionn, la PLL augmente de 4 fois la frquence de fonctionnement du CPU. Il est possible de laugmenter de 8 fois ou mme de 16 fois. Dans notre cas Fcy=Fosc/4=(Fquartz*4)/4=Fquartz La connaissance de Fcy est trs importante lorsque vous configurerez des registres bass sur le temps (PWM, Timer, UART,..) Il existe dautres entres doscillateur. Le choix de XT est d au fait que nous utilisons une horloge externe base sur un quartz. Watchdog Timer=Disable Permet dinhiber la fonction Watchdog Timer, car sinon votre microcontrleur se rinitialise au bout dun certain temps. La configuration donne est :

Votre projet est prt, il ne vous reste plus qu y ajouter le fichier comprenant la fonction principale. Crer un nouveau fichier en faisant Fichier Add New File to Project entrer le nom de votre fichier (dans notre cas main.c) puis enregistrer.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

7

Taper le code suivant : #include "p30F4011.h" int main (void) { while(1) ; } Puis compiler ctrl+F10 ou alors ProjectBuild All. La compilation doit se faire sans erreur. Pour la simulation, nous pouvons remarquer que ce programme ralise une boucle infinie sans rien faire. Il est important de toujours mettre un while(1) la fin de votre programme car sinon le compteur programme pourrait se perdre en engendrant un plantage du systme. Modifions le programme pour raliser des additions et comparaisons afin de pouvoir le simuler. #include "p30F4011.h" int valeur1,valeur2; //dclaration de deux entier sign unsigned int valeur3 ; //dclaration dun entier non sign int stop ; //dclaration dun entier permettant de savoir quand arrter la boucle int main (void) { valeur1=0; //initialisation de valeur1 0 valeur2=0; //initialisation de valeur2 0 valeur3=0; //initialisation de valeur3 0 stop=0; //initialisation de stop 0 while(stop==0) //tant que boucle stop est gale 0 { valeur1++ ; //incrmentation de valeur1 valeur2+=valeur1+10 ; //valeur2=valeur2+valeur1+10 valeur3=valeur1+valeur2; //valeur3= valeur2+valeur1 if(valeur3>=1000) //Si valeur3 suprieur ou gale 1000 alors on //arrte la boucle { stop=1; //boucle stop =1 } } while(1) ; } Lorsque vous avez tap ce code compiler votre projet. (ctrl+F10). Passons maintenant la simulation.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

8

2.1.1.2.Simulation du premier projet Lenvironnement permet de simuler et debugger votre programme sans utiliser de microcontrleur. Les fonctionnalits explicites sont celles de base, mais bien dautres actions peuvent tre ralises par le simulateur. (Simulation de la liaison RS232, dentres-sorties,). Configuration du simulateur Cliquer sur Debugger Select Tool MPLAB SIM

Lorsque vous recliquez sur Debugger, de nouvelles options saffichent. Slectionner DebuggerSettings

Entrer la valeur du Quartz utilis. La simulation ne prend pas en compte la PLL dentre, pour elle dans tous les cas Fcy=Processor Frequency/4 Dans notre cas, nous avons utilis une PLLx4 Donc le Processor Frequency=Fquartz*4 A.N. : Fquartz=7,3728MHz Processor Frequency=7,3728*4=29,4912 MHz Cliquer sur Ok

Placer maintenant des breakpoints au niveau de stop=0; stop=1; while(1);. Pour placer des breakpoints cliquer dans la barre grise au niveau de la ligne o vous voulez que la simulation sarrte.

Raccourcis clavier pour la simulation F6=Reset du processeur F7=mode pas pas en entrant dans toutes les fonctions F8=mode pas pas les fonctions sont simules comme une unique instruction F9=lance la simulation jusquau prochain breakpoint.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

9

Avant de simuler il serait peut tre intressant de suivre lvolution de certaines variables, pour ce faire cliquer sur ViewWatch Une fentre saffiche, dans Symbol Name, entrer les variables ou registres que vous voulez surveiller. Dans notre cas valeur1, valeur2, valeur3 et stop.

Lancer la simulation par F9. Elle va sarrter sur votre premier Breakpoint stop=0 ; Passer maintenant en mode Pas Pas (F7) et suivre lvolution des grandeurs. Laffichage en mode Hexadcimal des grandeurs dvolution nest peut tre pas dans notre cas adquat. Cliquer sur la grandeur dvolution que vous souhaitez afficher dans une autre base puis Clique droitProperties et dans le menu slectionn Format=Decimal. Laffichage se fait maintenant en dcimal. Apres avoir pass le programme en revue, il serait peut tre intressant de connatre le temps que met le microcontrleur pour effectuer la premire boucle while(stop==0) ;. Pour ce faire cliquer sur Debugger StopWatch. Ce module permet de connatre le temps parcouru entre deux breakpoints condition de linitialiser chaque fois.

Enlever le breakpoint au niveau de la ligne stop=1 ; Reset du microcontrleur par la touche F6. Puis Lancer la simulation par la touche F9. La simulation sarrte au niveau de stop=0 ; Cliquer dans la fentre StopWatch sur Zero, ceci aura pour effet de remettre le compteur 0.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

10

Appuyer sur F9, le programme sarrte sur la boucle while(1). On peut lire sur la StopWatch 91,417101s. Ainsi entre les deux breakpoints il sest coul 91,417101s

Cette fonctionnalit nous sera utile lorsque nous simulerons les interruptions des Timers. Ainsi nous pourrons rapidement vrifier la frquence des interruptions et donc la frquence du Timer. 2.2. MPLAB ICD2 MPLAB ICD2 est un systme permettant de debugger et programmer les microcontrleurs. Le dbuggage se fait sur la cible mme (In circuit Debugger). Le choix entre la programmation et le dbuggage se fait sous MPLAB. Attention ne pas slectionner les deux fonctionnalits en mme temps. Pour la programmation de la carte dsPICDEM2, slectionner Programmer Select ProgrammerMPLAB ICD2. Puis ProgrammerConnect Enfin ProgrammerProgramm

2.3. dsPICDEM2 La carte dsPICDEM2 est une carte dveloppement cre par Microchip. Cette carte permet de tester diffrents PIC 18 broches, 28 broches et 40 broches en boitier PDIP ou SPDIP. De base la carte comporte un dsPIC30F4011. Il est possible daccder toutes les broches du microcontrleur via des connecteurs, toutefois certaines fonctionnalits sont embarques sur la carte afin davoir un mini environnement de dveloppement. Ainsi la carte comprend un contrleur RS232, un contrleur CAN (Controller Area Network), des Leds de visualisation, des boutons, un potentiomtre, une sonde de temprature et un afficheur LCD (2*16 caractres). Un Connecteur ICD permet la programmation et le dbuggage de cette carte par MPLAB ICD2UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

11

2.4. Documentations utiles Avant de commencer la programmation pure de fonctionnalits, certains documents sont ncessaires : Sur internet (www.microchip.com) dsPIC30Family Reference Manual Documentation expliquant tous les registres du dsPic30FXXXX avec la fonction de chaque bit, ainsi que des exemples de fonctionnalits. Certaines fonctionnalits et certains registres sont dtaills mais non implments sur le 30F4011. 30F4011 datasheet Documentation expliquant tous les registres du dsPic30F4011. C30_Users_Guide Document expliquant la programmation en C avec le module C30 de Mplab. Attention des diffrences peuvent apparatre avec C18. C18 t dvelopp par Microchip alors que C30 a t sous-trait par Mircrochip une socit tierce. 16-BIT LANGUAGE TOOLS GETTING STARTED Manuel de prise en main du module C30. Sur le CD fournit avec le dsPICDEM2 dsPICDEM 2 Users Guide DS-51558A.pdf Document expliquant les fonctionnalits de la carte dsPICDEM2 ainsi que les mthodes daccs lafficheur LCD et la configuration des cavaliers et switches pour vos applications.

3. Notion sur le projet et la programmation en C3.1. Composition du projet Avant de commencer tous les petits exemples, il est important de comprendre la structure gnrale des projets. Un projet est compos de diffrents fichiers : main.c Ce fichier comprend le programme principal du projet. Code du fichier main.c #include "define.h" int main ( void ) {//code du projet}UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

12

define.h Ce fichier comprend toutes les #include importants du projet. Code du fichier define.h //fichier comprenant tous les registres du dsPIC30F4011 #include p30F4011.h //fichier comprenant tous les prototypes des fonctions utilises #include "fonction.h" //Si nous utilisons la fonction printf avec lUART nous devrons inclure stdio.h #include fonction.h Ce fichier comprend tous les prototypes des fonctions utilises. Ainsi une fonction peut tre appele dans tous les fichiers incluant #include "define.h" Code du fichier define.h /********************************************************************** * Fonction prototypes. **********************************************************************/ nom_fonction.c Ce fichier comprend une fonction. Le fichier prendra le nom de la fonction. Si la fonction est linitialisation dun priphrique, la description de linterruption du priphrique est aussi incluse dans le fichier. Tous les fichiers .c doivent comporter #include "define.h" afin davoir accs toutes les fonctions. Crer ds le dpart le fichier main.c fonction.h et define.h, ceci permettra de les inclure dans chaque mini projet qui suivra. 3.2. Accs aux variables Nous dclarons les variables globales dans le fichier main.c, pour avoir accs ces variables dans un autre fichier que main.c, il faut dclarer dans le fichier les variables avec lattribut extern. Attention ne pas rinitialiser la variable dans le fichier sinon cela causera une erreur de compilation. Pour exemple : Cration dune variable entire dans main.c Dclaration dans le fichier main.c int tab=0 ;UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

13

Besoin de la variable tab dans le fichier modif_uart.c Dclaration de la variable dans modif_uart.c extern int tab ; 3.3. Accs direct un bit dun registre de configuration Tous les registres de configuration sont dclars dans p30F4011.h. Lorsque vous voulez accder un bit du registre, il faut taper le nom du registre (NomRegistre) suivi par bits puis dun point et du nom du bit (NomBit) que vous voulez modifier. La syntaxe est la suivante NomRegistrebits.NomBit Exemple pour le registre INTCON2 INTCON2Bit 15 ALTIVT 14 DISI 13 12 11 10 9 8 7 6 5 - - - - 4 INT4EP 3 INT3EP 2 INT2EP 1 INT1EP 0 INT0EP

Laccs au bit INT0P se fait de la faon suivante : INTCON2bits.INT0EP = 1 ; 3.4. Registres grant les interruptions Les registres IEC0, IEC1 et IEC2 grent lautorisation des interruptions 1 = Autorisation de linterruption 0 = Inhibe linterruption IEC0Bit 15 CNIE Bit 7 T3IE 14 MI2CIE 6 T2IE 13 SI2CIE 5 OC2IE 12 NVMIE 4 IC2IE 11 ADIE 3 T1IE 10 U1TXIE 2 OC1IE 9 U1RXIE 1 IC1IE 8 SPI1IE 0 INT0IE

CNIE =Interruption sur changement dtat des entres MI2CIE = Interruption du bus I2C lors dune collision SI2CIE = Interruption lorsquun transfert I2C est fini NVMIE = Interruption lorsque lcriture dans la mmoire Non Volatile est fini ADIE = Interruption lorsque lADC a fini de convertir une donne U1TXIE = Interruption lorsque lUART1 a transmis un caractre U1RXIE = Interruption lorsque lUART1 a reu un caractre SPI1IE = Interruption du module SPI1 T3IE = Interruption du Timer3 T2IE = Interruption du Timer2 OC2IE = Interruption de lOutput Compare Channel 2 IC2IE = Interruption de lInput Compare Channel 2 T1IE = Interruption du Timer1 OC1IE = Interruption de lOutput Compare Channel 1 IC1IE = Interruption de lInput Compare Channel 1 INT0IE = Interruption de la broche INT0

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

14

IEC1Bit Bit 15 7 INT2IE 14 6 T5IE 13 5 T4IE 12 4 OC4IE 11 C1IE 3 OC3IE 10 2 IC8IE 9 U2TXIE 1 IC7IE 8 U2RXIE 0 INT1IE

C1IE = Interruption du Bus CAN U2TXIE = Interruption lorsque lUART2 a transmis un caractre U2RXIE = Interruption lorsque lUART2 a reu un caractre INT2IE = Interruption de la broche INT2 T5IE = Interruption du Timer5 T4IE = Interruption du Timer4 OC4IE = Interruption de lOutput Compare Channel 4 OC3IE = Interruption de lOutput Compare Channel 3 IC8IE = Interruption de lInput Compare Channel 8 IC7IE = Interruption de lInput Compare Channel 7 INT1IE = Interruption de la broche INT1 IEC2Bit Bit 15 7 PWMIE 14 6 13 5 12 4 11 FLTAIE 3 10 2 9 1 8 QEIIE 0 -

FLTAIE = Interruption de FAULTA dans le module PWM QEIIE = Interruption du module de Quadrature QEI PWMIE interruption du module PWM lorsquune priode est accomplie Les registres IFS0, IFS1 et IFS2 indiquent les interruptions qui sont actives IFS0Bit Bit 15 CNIF 7 T3IF 15 7 INT2IF 14 13 12 MI2CIF SI2CIE NVMIF 6 5 4 T2IF OC2IF IC2IF 14 6 T5IF 14 6 13 5 T4IF 13 5 11 ADIF 3 T1IF 10 9 U1TXIF U1RXIF 2 1 OC1IF IC1IF 10 2 IC8IF 10 2 9 U2TXIF 1 IC7IF 9 1 8 SPI1IF 0 INT0IF 8 U2RXIF 0 INT1IF 8 QFIIF 0 -

IFS1Bit Bit 12 11 C1IF 4 3 OC4IF OC3IF

IFS2Bit 15 Bit 7 PWMIF 12 4 11 FLTAIF 3 -

Lorsquune interruption survient, il faudra effacer le bit correspondant linterruption dans la routine.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

15

Exemple : Interruption active sur le Timer2 (IEC0bits.T2IE=1) dans la routine dinterruption il faudra penser mettre IFS0bits.T2IF=0 3.5. Dclaration dune routine dinterruption Il y a trois faons de dclarer une interruption 1. Aucune sauvegarde de contexte void __attribute__((__interrupt__)) _Nom de linterruption(void) {//code de linterruption} 2. Sauvegarde de contexte rapide par push. et pop.s Sauvegarde des bits DC N OV Z C et des registres W0 W3 du CPU DC = Demi Carry permet de savoir si un carry est survenu sur les 4 bits de poids faible dun octet (8bits) ou bien si un carry est survenu sur les 8bits dun mot (16bit). N = Signe du registre de lUnit Arithmtique et Logique OV = Overflow de lUnit Arithmtique et Logique Z = Zero de lUnit Arithmtique et Logique C = Carry de lUnit Arithmtique et Logique void __attribute__((__interrupt__, __shadow__)) _Nom de linterruption (void) {//code de linterruption} 3. Sauvegarde du contexte en spcifiant les donnes sauvegarder et restaurer. Les variables 1 et 2 seront sauvegardes sur la pile puis restitues la fin de linterruption void __attribute__((__interrupt__(__save__(variable1,variable2)))) _ Nom de linterruption (void) {//code de linterruption} Tous les noms dinterruption sont dclars dans le fichier p30F4011.gld. Attention il faut enlever un underscore (_) par rapport au nom donn dans le fichier Quelques exemples des interruptions les plus usites : Interruption ADC Timer1 INT0 INT1 U1TX U1RX Dclaration en C _ADCInterrupt _T1Interrupt _INT0Interrupt _INT1Interrupt _U1TXInterrupt _U1RXInterrupt

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

16

4. Application sous dsPIC30F4.1. Gestion des interruptions externes INT0 et INT1 4.1.1. Avant propos Le but de cette manipulation est dutiliser les interruptions INT0 et INT1. Ces deux interruptions sont des interruptions externes qui interviennent lors dun changement dtat sur la broche RE8 (INT0 pin 17) et RD0 (INT1 pin 23).

INTCON2Bit 15 ALTIVT 14 DISI 13 12 11 10 9 8 7 6 5 - - - - 4 INT4EP 3 INT3EP 2 INT2EP 1 INT1EP 0 INT0EP

ALTIVT: Autorise la table des interruptions alternatives 1 = Use alternate vector table 0 = Use standard (default) vector table DISI: Statut des instructions INTxEP: Choix du front de dtection 1 = Interruption sur front descendant 0 = Interruption sur front montant 4.1.2. Programmation Lexemple que nous allons dvelopper sur le dsPICDEM2 utilise le front montant sur INT0 pour dclencher une interruption qui teindra la LED du port RB0, le front descendant sur INT1 dclenche une interruption qui allumera la LED du port RB0. Crer un nouveau projet en incluant tous les fichiers de base dun projet (define.h, fonction.h, main.c, p30f4011.h et p30f4011.gld). Tout dabord afin de respecter la composition dun projet, crons un fichier init_int01.c. Ce fichier comprendra linitialisation des interruptions INT0 et INT1 ainsi que les programmes dinterruption. 4.1.2.1.Initialisation des interruptions INT0 et INT1 Nous voulons la dtection du front montant sur INT0 et du front descendant sur INT1 INTCON2bits.INT0EP = 1; INTCON2bits.INT1EP = 0; Ensuite il faut effacer le flag dinterruption correspondant linterruption extrieure 0 et 1 IFS0bits.INT0IF = 0; IFS1bits.INT1IF = 0;UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

17

Puis activer les interruptions IEC0bits.INT0IE = 1; IEC1bits.INT1IE = 1; void init_INT01(void) { INTCON2bits.INT0EP = 1; //interruption sur Front descendant INTCON2bits.INT1EP = 0; //interruption sur Front montant IFS0bits.INT0IF = 0; //Efface le flag d'interruption INT0 IEC0bits.INT0IE = 1; //Autorise les interruptions INT0 IFS1bits.INT1IF = 0; //Efface le flag d'interruption INT1 IEC1bits.INT1IE = 1; //Autorise les interruptions INT1 } 4.1.2.2.Dclaration du prototype de la fonction Penser mettre le prototype de la fonction dans fonction.h afin que tous les fichiers associs au projet aient accs cette fonction. Dans fonction.h void init_INT01(void) ; 4.1.2.3.Ecriture des routines dinterruptions associes Les interruptions nont pas besoin de sauvegarder le contexte car aucun calcul nest effectu et donc nous nutilisons pas lALU Le bouton branch sur la broche RE8 (INT0 pin 17) teint la Led branche sur le PORTB0 void __attribute__((__interrupt__)) _INT0Interrupt(void) { LATBbits.LATB0 = 0; //Eteint la LED IFS0bits.INT0IF = 0; //efface le flag dinterruption INT0 } Le bouton branch sur la broche RD0 (INT1 pin 23) allume la Led branche sur le PORTB0 void __attribute__((__interrupt__)) _INT1Interrupt(void) { LATBbits.LATB0 =1; // Eteint la LED IFS1bits.INT1IF = 0; //efface le flag dinterruption INT1 } Penser toujours effacer les flags dinterruptions la fin de chaque routine dinterruption 4.1.2.4.Ecriture de la fonction principale (main.c) Dans la fonction principale, il faudra initialiser les interruptions avec le sous-programme que nous avons crit. Penser aussi dfinir le PORTB0 en sortie.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

18

#include "define.h" int main ( void ) { init_INT01(); TRISBbits.TRISB0=0; //configure le PORTB0 comme sortie LATBbits.LATB0=0; //initialise le PORTB0 0 while(1); } Compiler le projet (ctrl+F10) puis programmer la platine dsPICDEM2. En appuyant sur les boutons poussoir INT0 et INT1 juste au dessus de lafficheur LCD, vous verrez une Led sallumer ou steindre selon vos actions. 4.2. Gestion des Timers 1 et 3 4.2.1. Avant Propos Le but de cette manipulation est de pouvoir initialiser des Timers pour raliser diverses actions relatives au temps. La famille des dsPIC30F possde diffrents types de Timers (A,B,C) qui caractrisent leurs fonctionnalits. Type A Les Timers de type A (Timer1 la plus part du temps) peuvent oprer en mode 32kHz Low Power et peuvent utiliser une source externe comme rfrence de comptage. La plupart du temps ce type de Timer est utilis dans les OS temps rel pour dcompter le temps.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

19

Registre contrlant le Timer1 T1CONBit Bit 15 TON 7 14 6 TGATE 13 TSIDL 5 TCKPS1 12 4 TCKPS0 11 3 10 2 TSYNC 9 1 TCS 8 0 -

TON: Lance le Timer 1 = Lance TIMER1 0 = Arrte TIMER1 TSIDL: Mode de fonctionnement en IDLE mode 1 = Arrte le TIMER1 en Idle Mode 0 = Continue les oprations de TIMER en IDLE mode TGATE: Le TIMER1 est mis en mode "Timer Gated Time Accumulation" en d'autres termes le compteur du TIMER1(TMR1) s'incrmente uniquement lorsque TxCK est l'tat 1. 1 = Autorise le mode "Timer gated time accumulation" (TCS doit tre mis 0 quand TGATE = 1) 0 = Inhibe la fonction "Timer gated time accumulation" (Lecture d'un 0 si TCS = 1) TCKPS: Prescaler de l'horloge TIMER1 11 = 1:256 prescaler 10 = 1:64 prescaler 01 = 1:8 prescaler 00 = 1:1 prescaler TSYNC: Synchronisation avec l'horloge extrieure Quand TCS = 1: 1 = Synchronisation avec l'horloge externe 0 = Pas de Synchronisation avec l'horloge externe Quand TCS = 0: Ce bit est ignor TCS: Choix de la source du TIMER1 1 = Horloge de la PIN TxCK 0 = Horloge interne (FOSC/4) Type B Les Timers de type B (Timer2 et Timer4 si implment) sont capables dtre concatns avec un Timer de type C. Le bit T32 du registre TxCON contrle alors le compteur 32bits. Lhorloge dincrmentation du Timer de type B utilise un prescaler permettant de fonctionner une autre vitesse que celle du CPU (Tcy).

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

20

Registre contrlant le Timer2 ou Timer4 T2CON et T4CONBit Bit 15 TON 7 14 6 TGATE 13 TSIDL 5 TCKPS1 12 4 TCKPS0 11 3 T32 10 2 9 1 TCS 8 0 -

TON: Lance le Timer Si T32=1 (Mode Timer 32 bits) 1 = Lance TIMER2 ou 4 32bits 0 = Arrte TIMER2 ou 4 32bits Si T32=0 (Mode Timer 16 bits) 1 = Lance TIMER2 ou 4 16bits 0 = Arrte TIMER2 ou 4 16bits TSIDL: Mode de fonctionnement en IDLE mode 1 = Arrte le TIMER1 en Idle Mode 0 = Continue les oprations de TIMER en IDLE mode TGATE: Le TIMER2 ou 4 est mis en mode "Timer Gated Time Accumulation" en d'autres termes le compteur du TIMER2 ou 4 (TMR2 ou 4) s'incrmente uniquement lorsque TxCK est l'tat 1. 1 = Autorise le mode "Timer gated time accumulation" (TCS doit tre mis 0 quand TGATE = 1) 0 = Inhibe la fonction "Timer gated time accumulation" (Lecture d'un 0 si TCS = 1) TCKPS: Prescaler de l'horloge TIMER2 ou 4 11 = 1:256 prescalerUTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

21

10 = 1:64 prescaler 01 = 1:8 prescaler 00 = 1:1 prescaler T32 : Slectionne le Mode Timer 32bits 1 = Le Timer 2/3 ou 4/5 forme un timer 32bits 0 = Timer2 ou 4 16bits TCS: Choix de la source du TIMER2 ou 4 1 = Horloge de la PIN TxCK 0 = Horloge interne (FOSC/4) Type C Les Timers de type C (Timer3 et Timer5 si implment) ont la possibilit dtre concatns avec un Timer de Type B. Un des Timers de type C (Timer3 en gnral) permet de lancer une conversion Analogique Numrique. (Le choix de la source de dclenchement des conversions ADC se fait dans les registres de lADC SSRC de ADCON1 )

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

22

Registre contrlant le Timer3 ou 5 T3CONBit Bit 15 TON 7 14 6 TGATE 13 TSIDL 5 TCKPS1 12 4 TCKPS0 11 3 10 2 9 1 TCS 8 0 -

TON: Lance le Timer 1 = Lance TIMER3 ou 5 0 = Arrte TIMER3 ou 5 TSIDL: Mode de fonctionnement en IDLE mode 1 = Arrte le TIMER1 en Idle Mode 0 = Continue les oprations de TIMER en IDLE mode TGATE: Le TIMER3 ou 5 est mis en mode "Timer Gated Time Accumulation" en d'autres termes le compteur du TIMER3 ou 5 (TMR3 ou 5) s'incrmente uniquement lorsque TxCK est l'tat 1. 1 = Autorise le mode "Timer gated time accumulation" (TCS doit tre mis 0 quand TGATE = 1) 0 = Inhibe la fonction "Timer gated time accumulation" (Lecture d'un 0 si TCS = 1) TCKPS: Prescaler de l'horloge TIMER3 ou 5 11 = 1:256 prescaler 10 = 1:64 prescaler 01 = 1:8 prescaler 00 = 1:1 prescaler TCS: Choix de la source du TIMER3 ou 5 1 = Horloge de la PIN TxCK 0 = Horloge interne (FOSC/4)

Chaque TIMERx (x=1, 2, 3, 4, 5) possde les registres suivant : TMRx = registre contenant la valeur de comptage. PRx = registre contenant la priode du Timer. Ce registre est compar TMRx lorsque les deux registres sont gaux le Timer se rinitialise. La valeur de PRx se calcul de la faon suivante : Time _ x =

(PRx * Pr escaler )

Fcy Time _ x * Fcy PRx = Pr escaler

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

23

4.2.2. Programmation Crez un nouveau projet en incluant tous les fichiers de base dun projet (define.h, fonction.h, main.c, p30f4011.h et p30f4011.gld). Tout dabord afin de respecter la composition dun projet, crons un fichier init_int01.c. Ce fichier comprendra linitialisation des interruptions INT0 et INT1 ainsi que les programmes dinterruption. 4.2.2.1.Initialisation des Timers Le timer1 sera utilis pour grer une horloge, linterruption permettra de mettre jour les variables heure, minute, seconde et milliseconde. La frquence dinterruption sera donc la milliseconde. Le timer3 permettra de crer la frquence dchantillonnage du convertisseur Analogique Numrique. Nous utiliserons une frquence dchantillonnage de 2kHz 4.2.2.1.1. Timer1

Crer tout dabord un fichier inclus dans le projet appel init_timer1.c. Aprs avoir inclus le fichier define.h (#include "define.h"), commencer linitialisation du TIMER1.

Crer un sous programme void init_timer1(void) Avec la description du registre donne plus haut suivre les tapes suivantes : 1. Calculer la valeur de PR1 pour savoir si un prescaler est utile. (Time_x=1ms, Fcy= (Fosc/4)*PLL4x=Fosc) Pr escaler = 1 Time _ x * Fcy PR1 = = 1*10 3 * 7,3728 *10 6 = [7372,8] = 7372 = 0 x1CCC < 0 xFFFF Pr escaler PR1 ne dpasse pas 65536 donc le prescaler na pas dutilit. 2. Arrter le Timer1 3. Configurer le TIMER1 : Le Timer1 peut continuer les oprations en IDLE mode. La fonction "Timer gated time accumulation" nest pas utilise. Le prescaler vaut 1. La synchronisation avec lhorloge externe nest pas utilise. La source du timer est le quartz. Initialiser la valeur du Registre contenant la valeur du compteur 0. Initialiser le Registre contenant la priode du Timer

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

24

Registres configurs : T1CON=0X00; TMR1=0; PR1=7372; Nous voulons utiliser linterruption du Timer1 pour mettre jour notre horloge Effacer le Flag d'interruption du Timer1 IFS0bits.T1IF = 0; Puis autoriser les interruptions du Timer1 IEC0bits.T1IE = 1 ; La configuration du Timer1 est faite et il peut tre lanc. T1CONbits.TON=1 ;

4.2.2.1.2. Timer3 La configuration est la mme pour le Timer3 la diffrence prs que le temps est calcul pour avoir une frquence dchantillonnage de 2kHz. La configuration se fera dans un nouveau fichier appel init_timer3.c. Linterruption du Timer3 nest pas utile lorsque nous utilisons ce Timer pour lancer la conversion ADC. Toutefois, afin de vrifier la frquence des interruptions en simulation, nous pouvons autoriser linterruption.

(Time_x=0,5ms, Fcy= (Fosc/4)*PLL4x=Fosc) Pr escaler = 1 Time _ x * Fcy = 0,5 *10 3 * 7,3728 *10 6 = [3686,4] = 3686 = 0 x0 E 66 < 0 xFFFF PR3 = Pr escaler

4.2.2.2.Dclaration du prototype des fonctions Penser mettre le prototype de la fonction dans fonction.h afin que tous les fichiers associs au projet aient accs cette fonction. Dans fonction.h void init_timer1(void) ; void init_timer3(void) ;

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

25

4.2.2.3.Ecriture des routines dinterruptions associes 4.2.2.3.1. Timer1 Linterruption du Timer1 permettra de mettre jour lhorloge du systme, pour ce faire il faut incrmenter le compteur de milliseconde (msec) puis traiter les cas de figure selon que les msec soient suprieurs 1000, que les secondes (sec) soient suprieures 60, que les minutes (min) soient suprieure s 60 et que les heures (heure) soient suprieure s 24. Cette interruption utilise des oprations daddition et de comparaisons, cest pour ces raisons quil faut sauvegarder le contexte de lunit Arithmtique et Logique avant dentrer dans la routine dinterruption (dclaration de linterruption avec lattribut __shadow__) Nous profiterons aussi de cette interruption pour faire changer ltat de la LED RB0 toutes les secondes. Il faut penser r-autoriser les interruptions sur Timer1 la fin de la routine. La routine dinterruption du Timer1 (init_timer1.c) void __attribute__((__interrupt__, __shadow__)) _T1Interrupt(void) { msec++; if (msec >= 1000) { msec = 0; sec++; LATBbits.LATB0 =~ LATBbits.LATB0; if(sec>=60) { sec=0; min++; if (min >= 60) { min = 0; heure++; if(heure>=24) { heure=0; } //fin if(heure>=24) }//fin if (min >= 60) }//fin if(sec>=60) }//fin if (msec >= 1000) IFS0bits.T1IF = 0; //r-autorisation des interruptions } Vous avez pu remarquer que linterruption a besoin des variables msec, sec, min, heure. Ces variables tant globales au projet elle seront dclares dans le fichier main.c. Il faut juste penser les dclarer dans le fichier init_timer1.c en tant que variables externes.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

26

4.2.2.3.2. Timer3 Linterruption du Timer3 nest pas utile lorsque nous utilisons ce Timer pour lancer la conversion ADC. Toutefois afin de vrifier la frquence des interruptions en simulation, nous pouvons crire la routine dinterruption. Cette routine r-autorise la prochaine interruption du Timer3. La routine dinterruption du Timer3 (init_timer3.c) void __attribute__((__interrupt__)) _T3Interrupt(void) { IFS0bits.T3IF = 0; //r-autorisation des interruptions } 4.2.2.4.Ecriture de la fonction principale (main.c) Dans le fichier main.c, il faudra dclarer msec, sec, min, heure comme variable globale de type entier non sign. unsigned int msec, sec, min, heure ; La fonction principal main.c initialisera msec, sec, min, heure puis le port B0 comme port de sortie et enfin fera appel aux initialisations du Timer1 et Timer3. fichier main.c #include "define.h" unsigned int msec, sec, min, heure ; int main ( void ) { msec=0; sec=0; min=0; heure=0; LATBbits.LATB0 = 0; init_timer1(); init_timer3(); while(1); } Compiler tout le projet pour la simulation (ctrl+F10)

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

27

4.2.3. Simulation Nous allons simuler le projet pour voir si les interruptions interviennent dans les temps impartis. Mettre un breakpoint dans linterruption du Timer3, puis avec le module StopWatch vrifier que linterruption intervient tous les 500s. Enlever le breakpoint au niveau de linterruption du timer3 et ajouter un breakpoint au niveau de msec++ dans linterruption du timer1, vrifier nouveau que linterruption intervient toutes les 1ms. Vous pouvez aussi visualiser les variations des variables msec, sec, min, heure en appuyant sur F7 4.3. Gestion de lUART Le but de cette manipulation est de pouvoir raliser une communication entre le microcontrleur et des priphriques extrieurs (ordinateur, modem,) via une liaison srie RS232. Dans le rpertoire (mplabide) joint au tutoriel, un projet gre laffichage dun menu et la saisie de donnes (dossier menu ). Dans ce projet vous trouverez des fonctions permettant de transformer un nombre saisi au clavier en entier interprtable par le microcontrleur (int buffer2nombre(void)). Le nombre saisi doit tre entour de deux balises 0x0D (retour chariot) (0x0D 0x31 0x32 0x33 0x0D = 123) Ce projet contient aussi une fonction permettant de transformer un entier compris entre 0 et 10 en une chaine de caractres (void i2a(int valeur, unsigned char *tab)). Ces fonctions ont t dveloppes pour une application bien spcifique, vous de les modifier votre guise. 4.3.1. Avant propos Le dsPIC30F comprend un UART Full Duplex de 8 ou 9bits. Les spcifications techniques sont : Gestion de la parit Paire, Impair, Pas de Parit (transfert de donne 8bits uniquement) 1 ou 2 stop bits Gnrateur de Baud intgr Vitesse de transmission variant entre 29bps 1,875 Mbps une Frquence Cycle Fcy de 30 MHz Les donnes reues sont stockes dans un buffer First-In-First-Out (FIFO) dune profondeur de 4 octets Les donnes mettre sont stockes dans un buffer First-In-First-Out (FIFO) dune profondeur de 4 octets La dtection des erreurs de parit, de fin de trame (stop bit manquant) et de dbordement des buffers sont intgres au module. Supporte la transmission de donne 9 bits avec dtection du mode adresse (9me bit=1)UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

28

Interruption de transmission et de rception Possibilit de connecter la broche de transmission sur la broche de rception pour diagnostic

Registre du module UART U1MODEBit Bit 15 UARTEN 7 WAKE 14 6 LPBACK 13 USIDL 5 ABAUD 12 11 10 9 ALTIO 4 3 2 1 - PDSEL 8 0 STSEL

UARTEN: Activation de l'UART 1 = UART est actif. Les pins RX et TX sont contrles par l'UART 0 = UART est inactif. Les pins RX et TX sont des I/O standard USIDL: Opration en mode repos 1 = Arrt des oprations en mode sommeil (SLEEP) 0 = Poursuite des oprations en mode sommeil (SLEEP) ALTIO: Alternance des transmissions - rceptions 1 = l'UART utilise UxATX et UxARX alternativement en rception puis en mission 0 = l'UART utilise les pins UxTX and UxRX respectivement pour l'mission et pour la rception Attention cette fonctionnalit n'est pas disponible sur tous les PICs WAKE: Action lorsqu'un Start bit est dtect en mode sommeil 1 = Rveil du C 0 = Ne rien faire LPBACK: La broche TX est branche la broche RX en interne 1 = activation du mode 0 = dsactivation du mode ABAUD: Activation de l'auto-dtection de la vitesse de transfert en paramtrant l'unit de capture. L'unit doit capturer les fronts montant et descendant du bit de Start 1 = Input to Capture module from UxRX pin 0 = Input to Capture module from ICx pin PDSEL:Choix de la parit et du nombre de donnes transmises 11 = 9-bit data, pas de parit 10 = 8-bit data, parit pair 01 = 8-bit data, parit impair 00 = 8-bit data, pas de parit STSEL: Choix du nombre de bits de stop 1 = 2 Stop bits 0 = 1 Stop bit

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

29

U1STABit 15 14 13 UTXISEL Bit 7 6 5 URXISEL ADDEN 12 4 RIDLE 11 UTXBRK 3 PERR 10 9 UTXEN UTXBF 2 1 FERR OERR 8 TRMT 0 URXDA

UTXISEL: Mode d'interruption sur transmission de caractre 1 = Une interruption intervient lorsqu'il y a un transfert du buffer de transmission au Transmit Shift register, par ce biais le buffer de transmission est vide. 0 = Une interruption est ralise lorsqu'un caractre est transmis au Transmit Shift register, ce qui implique qu'au moins un caractre peut tre ajout dans le buffer de transmission UTXBRK: Transmission d'un break 1 = Transmission d'un tat '0' pendant un minimum de 13 cycle d'horloge 0 = La broche Tx fonctionne normalement UTXEN: Autorisation des transmissions 1 = La pin UxTX est commande par l'UART normalement 0 = Arrt des transmissions, toutes les transmissions en cours sont arrtes et les buffers sont rinitialiss. La broche Tx est contrle par la PORT. UTXBF: Statut du buffer de Transmission (Lecture seul) 1 = Le buffer est plein 0 = Le buffer n'est pas plein, un minimum d'une donne peut tre crit dans le buffer TRMT: Statut du Transmit Shift Register (Lecture seul) 1 = Le Transmit shift register est vide et le buffer de transmission est vide 0 = Le Transmit shift register n'est pas vide, une transmission est en cours URXISEL: Mode d'interruption sur rception 11 = L'interruption intervient lorsque le buffer de rception est plein (4 donnes reues) 10 = L'interruption intervient lorsque le buffer de rception est aux 3/4plein (3donnes reues) 0x = L'interruption intervient lorsqu'un caractre est reu ADDEN: Dtection du mode Adresse 1 = Le mode adresse est activ. Si la transmission de 9 caractres n'est pas slectionne ce bit n'a pas d'effet. 0 = Le mode d'adresse est inhib RIDLE: Rception en mode Idle (au repos) (Lecture seul) 1 = Le rcepteur est en mode Idle 0 = Des donnes sont entrain d'tre reus PERR: Flag Erreur de parit (Lecture seul) 1 = Une erreur de parit a t dtecte sur le caractre courant 0 = Aucune erreur de parit n'a t dtecteUTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

30

FERR: Flag erreur de forme non dtection du bit de stop (Lecture seul) 1 = Une erreur de forme a t dtecte sur le caractre courant 0 = Aucune erreur de forme n'a t dtecte OERR: Flag erreur sur le buffer de rception (Lecture/effacement seul) Lev dans 3 cas: 1Le buffer de rception est plein 2Le Shift register de rception est plein et ne peut pas transfrer les donnes au buffer de rception 3Le bit de stop du caractre dans UxRSR est dtect et indique que le caractre de UxRSR doit tre transfr dans le buffer de rception 1 = Le buffer de rception a dbord 0 = Le buffer de rception n'a pas dbord URXDA: Des donnes sont disponibles dans le buffer de rception (Lecture seule) 1 = Des donnes sont disponibles dans le buffer de rception 0 = Le buffer de rception est vide La vitesse de transmission se calcule de la faon suivante Vitesse de transmission = SoitUxBRG = Fcy 1 16(Vitesse de transmission)

Fcy 16(UxBRG + 1)

A.N. pour une vitesse de transmission de 9600bauds (Fcy= (Fosc/4)*PLL4x=Fosc) 7 372 800 000 1 = [47] = 47 16(9600) Vitesse de transmission relle calcule UxBRG = 7 372 800 000 = 9600bauds 16(47 + 1) Erreur due lapproximation Vitesse de transmission =Erreur% = Vitesse de transmission voulu - Vitesse de Transmission relle 9600 - 9600 = = 0% Vitesse de transmission voulu 9600

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

31

4.3.2. Programmation 4.3.2.1.Initialisation de lUART Crer tout dabord un fichier inclus dans le projet appel init_uart.c. Aprs avoir inclus le fichier define.h (#include "define.h"), commencer linitialisation de lUART.

Crer un sous-programme void init_uart(void) Suivre les tapes suivantes : 1. 2. 3. 4. 5. 6. 7. 8. Arrter lUART Configurer lUART (8bits, parit pair, 1bit de stop) Une interruption intervient quand le buffer de transmission est vide Choisir la vitesse de transmission (9600bauds) Effacer les flags dinterruption en mission et rception Activer les interruptions en mission et rception Activer lUART Activer la broche Tx

void init_uart(void) { U1MODE=0x0003; U1STA=0x8000; U1BRG=47; //Efface le flag d'interruption en rception IFS0bits.U1RXIF=0; //Efface le flag d'interruption en mission IFS0bits.U1TXIF=0; //Autorisation des interruptions en rception IEC0bits.U1RXIE=1; //Autorisation des interruptions en mission IEC0bits.U1TXIE=1; // Activation de l'UART U1MODEbits.UARTEN=1; // Autorisation des transmissions U1STAbits.UTXEN=1; }

4.3.2.2.Dclaration du prototype de la fonction Penser mettre le prototype de la fonction dans fonction.h afin que tous les fichiers associs au projet aient accs cette fonction. Dans fonction.h void init_uart(void);UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

32

4.3.2.3.Ecriture des routines dinterruptions associes Pour lmission de caractre nous utiliserons la fonction printf. Cette dernire fait partie de la librairie de fonction compris dans et gre automatiquement lenvoi de caractres travers lUART Linterruption de transmission de lUART sert uniquement remettre le flag dinterruption zro. void __attribute__((__interrupt__)) _U1TXInterrupt(void) { IFS0bits.U1TXIF=0; }

Linterruption de rception de caractre permet de transfrer les donnes reus dans un buffer circulaire. Ce buffer circulaire sera par la suite trait dans diffrentes parties du programme. Cette interruption permet aussi de savoir sil y a une erreur sur le bit reu (erreur de parit, de forme ou si le buffer de rception est plein).

Voir lalgorithme suivant

.UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

33

void __attribute__((__interrupt__, __shadow__)) _U1RXInterrupt(void) { if(nb_val>TAILLE_BUF) { erreur_RX.buffer_plein=1; } else { while(U1STAbits.URXDA==1)//tant qu'il y a des valeurs dans le buffer de rception on les stocke { if(U1STAbits.PERR==1)erreur_RX.parite=1;//test la parit if(U1STAbits.FERR==1)erreur_RX.forme=1;//test si bit de stop prsent if(U1STAbits.OERR==1)erreur_RX.buffer_RXplein=1;//test si le buffer de rception est plein if(erreur_RX.parite==0&erreur_RX.forme==0&erreur_RX.buffer_RXplein==0) { bufferRX[ptrW++]=U1RXREG; if(ptrW>=TAILLE_BUF) { ptrW=0; } nb_val++; } else { erreur_RX.reception=1; } } } IFS0bits.U1RXIF=0; } 4.3.2.4.Ecriture de la fonction principale (main.c)

Le programme principal attend indfiniment si un caractre est reu. Ds quun caractre est reu, on renvoie sa valeur par le port srie, ceci permet de faire une fonction dcho. Avant dcrire la fonction main il faut dclarer certaines variables utiles. La premire est la dfinition de la taille du buffer de rception, puis il faut crer une structure traant toutes les erreurs survenues pendant la phase de rception de caractre, par la suite il faut dclarer le buffer de rception puis les pointeurs (ptrW et ptrR) permettant de manipuler le buffer de rception et finalement le compteur nb_val permettant de savoir combien de valeurs sont prsentes dans le buffer de rception. Dans la fonction main, nous initialiserons les variables nb_val, ptrW et ptrR zro puis ferons appel la fonction dinitialisation de lUART.UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

34

Le reste du programme principal est une boucle infinie qui affiche les caractres du buffer de rception. #include "define.h" #define TAILLE_BUF 20 struct erreurRX_type { unsigned char parite; unsigned char forme; unsigned char buffer_RXplein; unsigned char buffer_plein; unsigned char reception; } erreur_RX; unsigned char bufferRX[TAILLE_BUF]; int ptrW,ptrR,nb_val;

int main ( void ) { //remise zros du compteur du nombre de valeur dans le buffer de rception nb_val=0; //remise zro du pointeur d'criture dans le buffer de rception ptrW=0; //remise zro du pointeur de lecture dans le buffer de rception ptrR=0; init_uart(); printf("fonction d'echo\n\r"); while(1) { while(nb_val!=0) { nb_val--; printf("caractere=%c\n\r",bufferRX[ptrR++]); if(ptrR>=TAILLE_BUF) { ptrR=0; } } } } Lutilisation de la fonction printf ncessite de changer une option de compilation, pour ce faire cliquer sur ProjectBuild option Project. Dans longlet MPLAB LINK 30, ajouter 512 la valeur de HEAP SIZE puis cliquer sur OK Compiler le projet (ctrl+F10)UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

35

4.3.3. Simulation MPLAB IDE ne gre pas trs bien la simulation de lUART. Toutefois un module existe. Crer tout dabord un fichier texte dans vote rpertoire de projet appel entree_uart.txt. Ce fichier comprendra toutes les entres que vous voulez soumettre votre UART. Attention ne taper que des chiffres reprsentant des nombres hexadcimaux. Pour exemple si vous tapez 0F, lors de la simulation le caractre reu aura pour valeur 0x0F. Utilisez la table ASCII pour connatre les combinaisons hexadcimales des caractres que vous voulez envoyer.

Pour lors le fichier entree_uart.txt comprend les valeurs suivantes : 30 31 32 33 34 35 36 37 38 39 Choisir le simulateur MPLAB SIM, puis cliquer Debugger Settings. Dans longlet UART IO cliquer sur Enable UART1 IO. Cliquer sur Browse et entrer le chemin du fichier entree_uart.txt. Rewind Input permet de lire en boucle le fichier texte. Dans Output cliquer sur Window. Un afficheur sera disponible en cliquant ViewOutput, onglet SIM UART1. Sinon cliquer sur file et donner un nom de fichier recueillant les sorties de lUART.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

36

Maintenant que vous avez initialis la liaison srie, vous pouvez lancer le programme et passer aux phases de vrification avec des breakpoints. Mettre des breakpoints dans les interruptions pour vrifier lenvoi de caractres ainsi que le remplissage du buffer de rception. Si vous ne mettez aucun breakpoint vous devriez voir dans la fentre SIM UART1 le rsultat suivant. Ce programme peut aussi tre test sur la carte dsPICDEM2. Attention il faut mettre deux cavaliers sur H3 MALL et enlever les cavaliers sur H4 MALL. Utiliser un cble droit et configurer lHyperterminal avec la configuration que vous avez donne la liaison soit dans notre cas 8bits, parit paire, 1bit de stop, 9600bauds. La carte doit afficher les caractres que vous tapez au clavier.

4.4. Gestion de la PWM 4.4.1. Avant propos Les modules PWM sont utiliss dans tout ce qui est commande de moteur. (Moteur triphas, Moteur courant continu, Moteur DC Brushless,). Les principales caractristiques du module PWM : Chaque PWM possde 2 sorties PWMxL/PWMxH Les sorties peuvent tre complmentaires ou indpendantes Il est possible de grer des temps morts entre les broches PWMxL et PWMxH La polarit des broches PWM peut tre programme Diffrents mode de fonctionnement du compteur PWM Mode compteur Mode compteur dcompteur Mode compteur dcompteur avec la possibilit de rafraichir rafrachir le rapport cyclique la moiti de la priode Mode compteur mono coup Programmation dvnements pouvant synchroniser une conversion ADC

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

37

Les registres du module PWM PTCONBit Bit 15 PTEN 7 14 13 PTSIDL 6 5 PTOPS 12 11 10 9 8 - 4 3 2 1 0 PTCKPS PTMOD

PTEN: arrte la base de temps de la PWM 1 = La base de temps est active 0 = La base de temps est dsactive

PTSIDL: Etat de fonctionnement du module PWM en Idle Mode 1 = La base de temps du module est arrte en Idle Mode 0 = La base de temps du module fonctionne en Idle Mode PTOPS: A chaque fin de cycle de comptage une interruption peut tre dclenche. Ce registre permet de dfinir le nombre de cycles de comptage avant que l'interruption ne soit dclenche. 1111 = 1:16 Postscale 0001 = 1:2 Postscale 0000 = 1:1 Postscale PTCKPS: Prescaler d'entre de la base de temps de la PWM 11 = PWM time base input clock period is 64 TCY (1:64 prescale) 10 = PWM time base input clock period is 16 TCY (1:16 prescale) 01 = PWM time base input clock period is 4 TCY (1:4 prescale) 00 = PWM time base input clock period is TCY (1:1 prescale) PTMOD: Mode de fonctionnement de la PWM 11 = La base de temps fonctionne en mode compteur-dcompteur continu. Une interruption est gnre la fin du cycle et au milieu du cycle permettant de raliser une mise jour du registre PDCx (=duty cycle) 10 = La base de temps fonctionne en mode compteur-dcompteur continu. Une interruption est gnre la fin de cycle permettant de raliser une mise jour du registre PDCx (=duty cycle) voir aussi le registre PTOPS 01 = La base de temps fonctionne uniquement sur un cycle. A la fin du cycle une interruption est gnre et le bit PTEN passe 0 00 = La base de temps fonctionne en mode compteur continu. Une interruption est gnre la fin de cycle permettant de raliser une mise a jour du registre PDCx (=duty cycle) voir aussi le registre PTOPS

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

38

PWMCON2Bit Bit 15 7 14 6 13 5 12 4 11 3 10 2 IUE 9 SEVOPS 1 OSYNC 8 0 UDIS

< SEVOPS> Post Scaler sur les Evnements PWM (signal de lancement ADC) = 1111 1:16 Postcal ... = 0001 1:2 Postcal = 0000 1:1 Postcal IUE = 1 rafrachissement du Duty cycle (PDC) immdiatement = 0 rafrachissement du Duty cycle (PDC) sur chaque priode PWM OSYNC = 1 criture sur les sorties par OVDCON synchronis par le cycle PWM = 0 criture sur les sorties par OVDCON au prochain cycle machine Tcy UDIS = 1 Le rafrachissement du temps de cycle (PDC) and du buffer (PTPER) est inhib = 0 Le rafrachissement du temps de cycle (PDC) and du buffer (PTPER) est possible DTCON1Bit Bit 15 14 7 6 DTAPS 13 5 12 4 11 3 DTA 10 2 9 1 8 0

DTAPS Prescaler Value pour DTB 11 : Prescaler de 8Tcy 10 : Prescaler de 4Tcy 01 : Prescaler de 2Tcy 00 : Prescaler de Tcy DTA Dead Time A DTA=(DeadTime*Fcy/(Prescaler_Value) Exemple 1s DTA=(1e-6*7 372 800 000)/1=[7,3728]=0x7=00111(b) Les temps-morts sont automatiquement mis en marche lorsque les sorties PWM sont commandes en mode complmentaire pour des raisons de commutation des circuits lectroniques.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

39

Explication des diffrents modes Mode comptage continu :

Mode comptage continu mono coup :

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

40

Mode comptage dcomptage continu :

PTPER est le registre grant le temps de cycle de la PWM En mode comptage continu et comptage mono coup : Fcy PTPER = 1 Fpwm * PTMR _ prescaler En mode comptage dcomptage continu : PTPER = Fcy 1 2 * Fpwm * PTMR _ prescaler

Les registres PDCx contiennent la valeur du Duty cycle. En mode comptage continu :PTPER PDCx PTPER Attention en mode comptage-dcomptage continu si PDCx=PTPER cela donne un Duty Cycle de 50% et non de 100%. 2 * PTPER PDCx Duty _ cycle% = PTPER Ceci nest pas spcifi dans la documentation Microchip Duty _ cycle% =

4.4.2. Programmation 4.4.2.1.Initialisation du module PWM Crer tout dabord un fichier inclus dans le projet appel init_pwm.c. Aprs avoir inclus le fichier define.h (#include "define.h"), commencer linitialisation de lUART.UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

41

Crer un sous programme void init_pwm(void) Suivre les tapes suivantes : 1. Arrter le compteur PWM 2. Configurer la PWM en mode comptage dcomptage continu. Une interruption par cycle 3. La frquence de la PWM est de 20 kHz 4. Les 3 paires de sortie PWM sont utilises en mode complmentaire 5. Le rafraichissement du Duty cycle (PDC) se fait sur chaque priode PWM 6. Le rafraichissement du temps de cycle (PDC) et du buffer (PTPER) est possible 7. Le Dead Time est de 1s 8. PWM1H/L Duty cycle de 2/3 9. PWM1H/L Duty cycle de 1/2 10. PWM1H/L Duty cycle de 1/3 11. Lancer la PWM #include "define.h" void init_pwm(void) { PTCON=0x0002; PTPER=183; PWMCON1=0x00FF; PWMCON2=0x0000; /* DTA=(DeadTime*Fcy/(Prescaler_Value) Exemple 1s DTA=(1e-6*7 372 800 000)/1=[7,3728]=0x7=00111(b) */ DTCON1=0x0007; //initialisation du temps de cycle PDC1=244; PDC2=183; PDC3=122; //lancement de la PWM par PTEN PTCONbits.PTEN=1; }

4.4.2.2.Dclaration du prototype de la fonction Penser mettre le prototype de la fonction dans fonction.h afin que tous les fichiers associs au projet aient accs cette fonction. Dans fonction.h void init_pwm(void);

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

42

4.4.2.3.Ecriture de la fonction principale (main.c) La fonction principale appelle juste la fonction init_pwm. #include "define.h" int main ( void ) { init_pwm(); while(1); } Compiler le projet (ctrl+F10) 4.4.3. Simulation Sous MPLAB il est possible de tracer ltat de certaines sorties au fil des temps cycle. Pour avoir accs cette fonction, slectionner DebuggerMPLAB SIM, puis dans Settings Cocher les cases Trace All et si vous voulez que la simulation sarrte quand le buffer de trace est plein cocher Break on Trace Buffer Full. Cliquer sur OK.

Pour slectionner les sorties tracer, cliquer sur ViewSimulator Logic Analyzer Une nouvelle fentre souvre cliquer alors sur Channel pour slectionner les voies que vous voulez tracer. Dans notre cas PWM1L/H, PWM2L/H et PWM3L/H. Cliquer sur OK

Lancer la simulation et visualiser les diffrentes PWM.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

43

4.5. Gestion du convertisseur Analogique Numrique 10 bits Dans bon nombre dapplications de rgulation, il est primordial de mesurer des grandeurs analogiques. Cette partie permet dassimiler le principe de fonctionnement du module ADC 10bits du dSP30Fxxx. 4.5.1. Avant propos Les spcifications techniques du convertisseur ADC sont : Conversion Analogique Numrique par conversion successive (SAR) Jusqu' 1M Sample par seconde 16 voies de conversion Possibilit dutiliser une rfrence de tension externe 4 canaux permettant des conversions diffrentielles Possibilit de sampler 4 valeurs simultanment. Choix de la source de dclenchement des conversions (Timer 3/ PWM/) Choix du mode de reprsentation des conversions Buffer 16 mots contenant les valeurs des diffrentes voies converties Possibilit de convertir le Buffer 16 mots en deux Buffers 8 mots Choix de fonctionnement en Idle mode et Sleep mode

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

44

Le schma interne du Convertisseur ADC 10bits, permet de mieux comprendre son fonctionnement. Nous remarquons quun seul convertisseur est implant dans le module, les donnes converties transiteront toutes par des module appels S/H (Sample and Hold) associs un canal (CH0, CH1, CH2, CH3). Ces modules prennent en compte la valeur de la tension analogique provenant des broches ANx connectes leur borne pendant un temps appel Sample time et bloquent cette valeur jusqu' la conversion. Les canaux branchent la sortie du module S/H au convertisseur. Ainsi il est possible de prendre en compte 4 entres simultanment. Chaque entre sera convertie tour tour. Le canal 0 est quant lui reli toutes les entres ANx, ceci permet de faire une conversion squentielle de chaque entre relie au canal 0.UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

45

Vous pouvez maintenant comprendre que deux modes sont possibles, le mode Simultan et le mode Squentiel.

0 RGH6 L XO p P W DQ

6 DP SO HB&+

$1

6 DP SO HB&+

$1

6 DP SO HB&+ $1

6 DP SO HB&+

$1

2 U HG G H FRQYHU RQ VL

$1

$1

$1

$1

0 RGHVpTXHQ L W HO

6 DP SO HB&+

$1

$1

$1

2U H GHG FRQYHU RQ VL

$1

$1

$1

Le temps de conversion ( partie sujette rvision ) Le temps de conversion du module peut se choisir selon la configuration des bits ADC du registre ADCON3. Tad reprsente un temps dhorloge du module, pour raliser une conversion il faut 12Tad en respectant un Tad suprieur 83,33ns (Pour 1MSps) Tcy ( ADCS + 1) TAD = 2 2T ADCS = AD 1 Tcy

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

46

Le schma dentre dune voie du convertisseur est reprsent ci-dessous :

La capacit Chold se charge la valeur de la tension dentre et garde cette valeur jusqu la conversion. Le temps de sampling doit tre assez long pour que la capacit se charge la tension dentre. Dans la documentation un minimum de 12Tad est recommand pour le temps de sampling en mode Simultan.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

47

Exemple : Il faut avoir un temps Tad> 84ns Fcy=Fosc*PLL4x/4=Fosc Fcy=7,3728Mhz => Tcy135ns Si on configure 15 Tad pour le temps de sampling et une priode de 4Tcy pour l'horloge interne du module, cela nous donne Tad = X*Tcy = 4*Tcy => ADCS=2X-1=7 15 Tad = Tsmpl La priode de conversion est de 12 Tad Si nous convertissons 2 voies en simultan Temps total d'acquisition= Temps de sampling + (Nombre de channels) (Temps de conversion) Temps total d'acquisition= 15 Tad +2*12 Tad= (15+2*12)4*Tcy=156 Tcy =Tta Fosc=7,3728MHz Tta=156 Tcy=156*1/Fosc=21s Soit Fta=47261Hz Pour le calcul des temps de conversion cela peut diffrer selon les modes disponible, rfrezvous au dsPIC30F Family Rference Les registres importants du convertisseur ADC. ADCON1Bit Bit 15 14 13 ADON ADSIDL 7 6 5 SSRC 12 4 11 3 SIMSAM 10 2 ASAM 9 8 FORM 1 0 SAMP DONE

ADON: Mise en marche du convertisseur 1 = A/D enclenche le convertisseur 0 = A/D arrte le convertisseur ADSIDL: Mode de fonctionnement en mode IDLE 1 = arrte la conversion en mode IDLE 0 = les conversions continuent en mode IDLE FORM: Format de sortie des conversions 11 = Bit de signe + 9 bits de conversion + 6bits 0 (DOUT = sddd dddd dd00 0000) 10 = 10 bits de conversion + 7bits 0 (DOUT = dddd dddd dd00 0000) 01 = Entier sign 7bits de signe 9 bits de conversion (DOUT = ssss sssd dddd dddd) 00 = Entier non sign 6bits de signe 10 bits de conversion (DOUT = 0000 00dd dddd dddd) SSRC: Source lanant la conversion (SAMP=1) 111 = Le compteur interne arrte le sampling et lance la conversion (auto conversion) 110 = ReservUTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

48

101 = Reserv 100 = Reserv 011 = Un cycle PWM (voir la configuration des vnements SEVOPS du registre PWMCON2) PWM) arrte le sampling et lance la conversion (auto conversion) 010 = Le Timer3 arrte le sampling et lance la conversion (auto conversion) 001 = Une transition active sur la broche INT0 arrte le sampling et lance la conversion (auto conversion) 000 = L'effacement du bit SAMP arrte le sampling et lance la conversion (auto conversion) SIMSAM: Slectionne le mode de multisampling (utilisable si CHPS = 01 ou 1x) 1 = Le sampling de CH0, CH1, CH2, CH3 se fait simultanment (quand CHPS = 1x) ou le sampling de CH0 et CH1 se fait simultanment (quand CHPS = 01) 0 = Le sampling se fait de faon squentielle avec CH0 ASAM: Mode sampling automatique de l'ADC 1 = Le sampling commence directement aprs la dernire conversion. Le bit SAMP bit est automatiquement mis 1 0 = Le sampling commence quand le bit SAMP passe 1 SAMP: A/D Sample Enable bit 1 = Au moins une valeur est en cours de sampling 0 = La ou les valeur(s) sont maintenues Quand ASAM = 0, crire 1 dmarre la phase de sampling Quand SSRC = 000, crire 0 arrte la phase de sampling et lance la conversion DONE: A/D Etat de la conversion 1 = A/D la conversion est ralise 0 = A/D la conversion est en cours Effac par logiciel ou par le dbut d'une nouvelle conversion. L'effacement de ce bit n'affecte aucune opration en cours.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

49

ADCON2Bit Bit 15 14 13 VCFG 7 6 5 BUFS 12 4 11 10 CSCNA 3 2 SMPI 9 8 CHPS 1 0 BUFM ALTS

VCFG: Configuration de la tension de rfrence VCFG A/D VREFH A/D VREFL 000 AVDD AVSS 001 External Vref+pin AVSS 010 AVDD External Vref-pin 011 External Vref+pin External Vref-pin 1xx AVDD AVSS CSCNA: Lorsque l'on fait de la conversion analogique numrique squentielle de plusieurs entres sur CH0, il faut mettre le bit CSCNA 1 puis configurer le registre ADCSSL permettant de savoir quelles entres sont prises en compte La conversion se fera toujours de AN0 AN15, il n'est pas possible de choisir l'ordre 1 = Scan inputs 0 = Do not scan inputs CHPS: Slectionne les canaux utiliss 1x = Conversion des canaux CH0, CH1, CH2 and CH3 01 = Conversion des canaux CH0 and CH1 00 = Conversion du canaux CH0 Quand SIMSAM bit (ADCON1) = 0 Le sampling des canaux se fait de faon squentielle Quand SIMSAM bit (ADCON1) = 1 Le sampling multiple se fait d'aprs CHPS BUFS: Donne les buffers accessibles par l'utilisateur en mode double buffer voir (BUFM=1) 1 = l'ADC est en train de remplir les buffers 0x8-0xF, l'utilisateur doit rcuprer les donnes des buffers 0x0-0x7 0 = l'ADC est en train de remplir les buffers 0x0-0x7, l'utilisateur doit rcuprer les donnes des buffers 0x8-0xF SMPI: Indique quand une interruption doit survenir 1111 = Une interruption est ralise la fin des 16 squences de sampling/conversion 1110 = Une interruption est ralise la fin des 15 squences de sampling/conversion ..... 0001 = Une interruption est ralise la fin des 2 squences de sampling/conversion 0000 = Une interruption est ralise la fin de chaque squence de sampling/conversion BUFM: Configuration du BUFFER 1 = Le Buffer est configur comme deux buffers de 8 mots ADCBUF(15...8), ADCBUF(7...0) 0 = Le Buffer est configur comme deux buffers de 16 mots ADCBUF(15...0.)

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

50

0 ALTS: Bit permettant de configurer les entres des canaux. Il est possible de les modifier alternativement. 1 = Utiliser alternativement la valeur de MUXA puis la valeur de MUXB pour les entres 0 = Toujours utiliser la valeur de MUXA pour les entres ADCON3Bit Bit 15 7 ADRC 14 6 13 5 12 4 11 10 SAMC 3 2 ADCS 9 1 8 0

SAMC: Temps pour l'auto sampling 11111 = 31 TAD 00001 = 1 TAD 00000 = 0 TAD (autoris si on ralise une conversion squentielle utilisant plus d'un canal) ADRC: Choix de la source de temps du convertisseur ADC 1 = L'ADC utilise une horloge RC interne 0 = L'ADC utilise l'horloge systme ADCS: Choix du temps de l'horloge du module ADC Tad 111111 = TCY/2 (ADCS + 1) = 32 TCY 000001 = TCY/2 (ADCS + 1) = TCY 000000 = TCY/2 (ADCS + 1) = TCY/2 Pour Tad=X*TcyTad = Tcy ( ADCS + 1) = X * Tcy 2 ADCS = 2 X 1

ADCHSBit Bit 15 14 CH123NB 7 6 CH123NA 13 CH123SB 5 CH123SA 12 CH0NB 4 CH0NA 11 10 9 8 CH0SB 3 2 1 0 CH0SA

CH123NB: Entre ngative du Canal 1, 2, 3 pour la configuration MUX B Mme configuration de choix que pour CH123NA CH123SB: Entre positive Canal 1, 2, 3 pour la configuration MUX B Mme configuration de choix que pour CH123SA CH0NB: Entre ngative du Canal 0 pour la configuration MUX B Mme configuration de choix que pour CH0NA CH0SB: Canal 0 Positive Input Select for MUX B Multiplexer Setting bits Mme configuration de choix que pour 3-0 CH0SAUTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

51

CH123NA: Entre ngative du Canal 1, 2, 3 pour la configuration MUX A 11 = Entre ngative CH1 est AN9, Entre ngative CH2 est AN10, Entre ngative CH3 est AN11 10 = Entre ngative CH1 est AN6, Entre ngative CH2 est AN7, Entre ngative CH3 est AN8 0x = Entre ngative CH1, CH2, CH3 est VREFCH123SA: Entre positive Canal 1, 2, 3 pour la configuration MUX A 1 = Entre positive CH1 est AN3, Entre positive CH2 est AN4, Entre positive CH3 est AN5 0 = Entre positive CH1 est AN0, Entre positive CH2 est AN1, Entre positive CH3 est AN2 CH0NA: Choix de lentre ngative du Canal 0 pour la configuration MUX A 1 = L'Entre ngative Channel 0 est AN1 0 = L'Entre ngative Channel 0 est VREFCH0SA: Choix de lentre positive du Canal 0 pour la configuration MUX A 1111 = L'entre positive du Channel 0 est AN15 1110 = L'entre positive du Channel 0 est AN14 1101 = L'entre positive du Channel 0 est AN13 || || || 0001 = L'entre positive du Channel 0 est AN1 0000 = L'entre positive du Channel 0 est AN0

ADPCFGBit 15 14 13 12 11 10 9 8 PCFG15 PCFG14 PCFG13 PCFG12 PCFG11 PCFG10 PCFG9 PCFG8 Bit 7 6 5 4 3 2 1 0 PCFG7 PCFG6 PCFG5 PCFG4 PCFG3 PCFG2 PCFG1 PCFG0

PCFGx 1= Entre sortie numrique, dans l'ADC l'quivalent de la broche est reli AVss 0= Entre analogique, dans l'ADC la broche est relie au canal souhait ADCSSLBit 15 14 13 12 11 10 9 8 CSSL15 CSSL14 CSSL13 CSSL12 CSSL11 CSSL10 CSSL9 CSSL8 Bit 7 6 5 4 3 2 1 0 CSSL7 CSSL6 CSSL5 CSSL4 CSSL3 CSSL2 CSSL1 CSSL0

Utilis pour choisir les entres numriser lorsque lon est en mode squentiel (SIMSAM=0 bit (ADCON1)) CSSLx 1=L'entre ANx est numrise 0=L'entre ANx n'est pas numrise

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

52

4.5.2. Programmation 4.5.2.1.Initialisation de lADC Crer tout dabord un fichier inclus dans le projet appel init_adc.c. Aprs avoir inclus le fichier define.h (#include "define.h"), commencer linitialisation de lADC.

Crer un sous programme void init_ADC(void) Avec la description du registre donn plus haut suivre les tapes suivantes : 1. Arrter lADC 2. Configurer lADC: Raliser une conversion cyclique simultane de AN2 et AN3 Le timer 3 lance priodiquement les conversions. Faire une conversion des canaux 0 et 1 Une interruption intervient chaque fois que lon refait un Utiliser le buffer en 2 buffers de 8bits Le temps de sampling est de 15Tad Tad=4Tcy Effacer les flags dinterruption Autoriser les interruptions Lancer le convertisseur numrique analogique void init_ADC(void) { ADCON1bits.SSRC=2; //ralise une conversion cyclique automatique de AN2 ET AN3 avec le Timer3 ADCON1bits.SIMSAM=1; //sample au mme moment AN2 et AN3 ADCON1bits.ASAM=1; //mise 1 de SAMP automatiquement aprs chaque conversion ADCON2bits.CHPS=1; //conversion du channel 0 et 1 (des canaux 0 et 1) ADCON2bits.SMPI=0; //une interruption est ralise chaque fois que l'on refait un sampling ADCON2bits.BUFM=1; //utilise le buffer en 2 buffers de 8bits ADCON3bits.SAMC = 15; ADCON3bits.ADCS = 7; ADCHSbits.CH123NA=0; //relie toutes les entres ngatives des channels 1/2/3 VREFADCHSbits.CH123SA=1; //relie l'entre positive CH1 AN3 ADCHSbits.CH0NA=0; //relie l'entre ngative du channels 0 VREFADCHSbits.CH0SA=2; //relie l'entre positive du channels 0 AN2 ADPCFGbits.PCFG2=0; //Dfinir l'entre AN2 comme entre analogique ADPCFGbits.PCFG3=0; //Dfinir l'entre AN3 comme entre analogique //efface le flag des interruptions ADC IFS0bits.ADIF = 0; //autorise les interruptions sur ADC IEC0bits.ADIE = 1; //Lance le convertisseur numrique analogique ADCON1bits.ADON = 1; }UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

53

4.5.2.2.Dclaration du prototype de la fonction Penser mettre le prototype de la fonction dans fonction.h afin que tous les fichiers associs au projet aient accs cette fonction. Dans fonction.h void init_ADC(void) ;

4.5.2.3.Ecriture des routines dinterruptions associes La routine dinterruption enregistre les donnes converties puis efface le flag associ linterruption. Il faudra dclarer en variable globale int Potentiometre et TempSensor. Nous utilisons le mode double buffer, il faudra donc faire attention lire les donnes dans le bon buffer void __attribute__((__interrupt__)) _ADCInterrupt(void) { if(ADCON2bits.BUFS==1) { Potentiometer = ADCBUF0; TempSensor = ADCBUF1; } else { Potentiometer = ADCBUF8; TempSensor = ADCBUF9; } IFS0bits.ADIF = 0; } 4.5.2.4.Ecriture de la fonction principale (main.c) Dans la fonction main, nous afficherons en continu la valeur du potentiomtre et la valeur de la temprature par la liaison RS232 dans hyperterminal. Pour ce faire il faudra initialiser la liaison srie avec tous les paramtres tudis auparavant. Pour convertir les donnes de lADC en donnes affichables il faut crer une fonction de conversion ( adc2tabchar fichier adc2tabchar.c). La conversion Analogique numrique est sur 10 bits et la plage d'volution de la tension analogique d'entre est de 5V soit une rsolution de 5/(2^10-1)=0,004888V pour la variation d'un LSB Pour 1V aprs conversion 1/0,004888V soit 204,6 = 204 =0xCC Pour 0,1V aprs conversion 0,1/0,004888V soit 20,46=20= 0x14 Pour 0,01V aprs conversion 0,01/0,004888V soit 2,046=2= 0x2 Il suffit de comparer le nombre que nous voulons convertir en caractre par rapport ces trois seuils. On ralise une boucle tant que le nombre est suprieur 2. Dans cette boucle tant que le nombre est suprieur au seuil de 204 alors on incrmente les units de 1 et on soustrait 204

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

54

au nombre. La mme mthode est utilise pour incrmenter les diximes et les centimes avec les seuils respectifs de 20 et 2. /*Fonction convertissant le rsultat de l'ADC en une suite de caractres affichables sur cran. Cette fonction t crite pour Vref-=0 et Vref+=5V. le tableau pass en paramtre rcupre les donnes de la faon suivante : Tab[0]=entier Tab[1]=dixime Tab[3]=centime */ void adc2tabchar(unsigned int resultatConv,char *Tab) { unsigned char unite = 0; unsigned char dixieme = 0; unsigned char centieme = 0; //reset values

/* Conversion Analogique numrique sur 10 bits, La plage d'volution de la tension analogique d'entre est de 5V soit une rsolution de Rsolution= 5/(2^10-1)=0,004888V pour la variation d'un LSB Pour 1V aprs conversion 1/0,004888V soit 204,6 = 204 =0xCC Pour 0,1V aprs conversion 0,1/0,004888V soit 20,46=20= 0x14 Pour 0,01V aprs conversion 0,01/0,004888V soit 2,046=2= 0x2 */ while (resultatConv > 2) { if(resultatConv > 204) //test si suprieur 1Volt { unite++; //incrmente les units resultatConv -= 204; //soustraction d1 Volt au nombre } else if(resultatConv > 20 && resultatConv 2 && resultatConv =750) //le curseur est positionn la deuxime ligne { cpt_msec=msec-750; } else { cpt_msec=msec+250; } while(msec!=cpt_msec); } while(*affiche!=0x00) //tant que le pointeur sur le tableau ne rencontre pas la fin de la chaine de caractre { while(SPI1STATbits.SPITBF != 0); //tant que le Buffer d'mission est plein SPI1BUF = *affiche++; if(msec>=750) { cpt_msec=msec-750; } else { cpt_msec=msec+250; } while(msec!=cpt_msec); }}

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

63

4.6.2.3.Dclaration du prototype des fonctions Penser mettre le prototype de la fonction dans fonction.h afin que tous les fichiers associs au projet aient accs cette fonction. Dans fonction.h void init_timer1(void); void init_SPI(void); void affiche_lcd(int ligne,unsigned char *affiche);void init_timer1(void) ; 4.6.2.4.Ecriture de la fonction principale (main.c) La programme principal lancera laffichage du tableau premier_affiche, puis ne fera plus rien. #include "define.h" int msec,sec,min,heure,affiche; unsigned char premier_affiche[]="UTBM POWERED"; int main ( void ) { init_timer1(); init_SPI(); while(sec!=2); //attente de 2seconde pour initialisation de l'afficheur LCD affiche_lcd(1,premier_affiche); while(1); } 4.6.3. Simulation Le module SPI ne peut pas tre simul sous MPLAB IDE. Apres avoir compil le projet, programmer la carte de dveloppement et vrifier que le message saffiche correctement. Pour aller un peu plus loin dans lutilisation de lafficheur LCD, vous pouvez dvelopper une application qui affiche lhorloge courante, la valeur du potentiomtre et la temprature sur lcran LCD. Le rglage de lhorloge peut se faire avec les boutons INT0 et INT1. Un tel projet a t dvelopp dans le dossier projetLCD. Mais maintenant que vous avez cr tous les fichiers dinitialisations des priphriques, vous verrez que les temps de dveloppement sont rduits.

5. ConclusionGrce tous ces minis modules nous avons pu tour tour configurer les priphriques les plus usits dans le monde des microcontrleurs. Toutes les fonctionnalits ne sont pas dcrites mais elles vous permettent dj de lancer une application. Le dtail de chaque priphrique se trouve dans la documentation officielle de Microchip.

UTBM TR57 Automne 2006 Eric OBSER & Vincent HAEGELIN dSPIC30F4011 & PICOS 30

64

6. Le noyau temps-rel PICOS6.1. Prsentation Les fonctionnalits de la carte dsPIC que nous venons de dtailler laissent entrevoir la mise en uvre de projets riches et varis, combinant lutilisation et la mise en uvre de diffrents ports de communication, et de priphriques multiples : affichage, contrle moteur, etc Le contrle des diffrents priphriques devenant ais laide des blocs crs prcdemment, on comprend que le dfi devient de russir les faire fonctionner ensemble, de manire fiable, et pourquoi pas en intgrant des contraintes temps-rel. Nous avons donc des lments contrler qui ne fonctionnent pas tous la mme cadence (cf les temps de latence de lafficheur), dont les fonctions sont complmentaires et qui peuvent facilement tre amenes simbriquer entre elles. Un des moyens les plus simples pour mettre en uvre rapidement un contrle efficace et organis de ces lments est le recours lusage dun noyau temps rel. Concrtement, un noyau temps-rel est un ensemble de procdures et de fonctions cohrent appels services, qui selon le niveau de dveloppement et de complexit, vont grer la cohabitation de diffrentes tches, grer lallocation des ressources matrielles, grer les liens entre les diffrentes tches, etc 6.1.1. Les avantages dun noyau temps-rel Un noyau temps-rel prsente donc lavantage de simplifier pour le dveloppeur la mise en place de mcanismes de synchronisation, de priorits entre diffrentes fonctions. Lusage dun noyau temps-rel normalis est aussi garant dune certaine suret de fonctionnement : le code du noyau a t test, vrifi, prouv : on conoit donc plus facilement un programme fiable en se basant sur un code dont la justesse a t prouve. Dautre part, utiliser un noyau tempsrel impose aussi un cadre et un certain nombre de rgles qui forcent le dveloppeur travailler proprement ce qui facilit