samedi 20 octobre 2018

Mesurer une température avec MPLAB Xpress Evaluation Board

Une caractéristique intéressante du MPLAB Xpress Evaluation Board que j'avais négligée jusqu'à maintenant, c'est qu'il comporte un capteur de température EMC1001.  Sur la carte, il s'agit d'un tout petit circuit intégré comportant 6 broches, identifié par la mention "U5", et situé un peu plus haut que l'interrupteur "S2". Ce capteur communique en I2C, et permet de mesurer une température située entre -25°C et 125°C avec une résolution de 0,25°C

Cette activité consiste à afficher la température à l'écran d'un ordinateur, dans un logiciel de communication série (j'ai utilisé comme référence principale ce tutoriel conçu par Microchip). Puisque le capteur de température se trouve déjà sur la carte, ce projet ne nécessite rien d'autre qu'un MPLAB Xpress Evaluation Board branché par USB à un ordinateur.

Création du projet dans MPLAB Xpress et réglages dans MCC

Nous commençons par créer un nouveau projet dans MPLAB Xpress.  Si vous êtes pressé, vous pouvez cliquer sur "Microchip Examples", puis sur "PIC16F18855" et ouvrir l'exemple intitulé "Temperature Sensor": félicitations, votre projet est terminé! 😊


Je propose plutôt de créer un nouveau projet autonome que nous construirons nous-mêmes à partir de zéro (Standalone Project).  On vous demandera ensuite de choisir votre modèle de microcontrôleur (c'est le PIC16F18855) et de choisir un titre pour votre projet.


Maintenant, que le nouveau projet est créé dans MPLAB Xpress, nous ouvrons le logiciel MPLAB Xpress Code Configurator qui, lui, est installé localement sur votre ordinateur (si ce n'est pas le cas, vous trouverez plus d'informations concernant l'installation de MCC dans ce précédent billet).

Aucun changement n'est requis dans la partie "System Module" de MCC. Par contre, puisque le capteur de température communique avec le microcontrôleur avec le protocole I2C, nous installons le module "MSSP2" dans la zone "Device Resources" (cliquez deux fois).  MSSP signifie "Master Synchronous Serial Port".


Par défaut, le module MSSP2 est déjà réglé "I2C Master": c'est ce que nous voulons.  Deux changements doivent toutefois être effectués dans ses paramètres: "Slew Rate Control" doit être réglé à "Standard Speed" et "Baud Rate Generator Value" doit être réglé à "0x4".


Puisque nous transmettrons des données par communication série, nous devons aussi installer un module EUSART.


Deux cases supplémentaires doivent être cochées dans les réglage du module EUSART: "Enable Transmit" et "Redirect STDIO to USART".  Par défaut, le baud rate est réglé à 9600, vous pouvez le modifier si vous souhaitez régler votre logiciel de communication série à une vitesse de transmission différente.



Dans la zone des cadenas au bas de la fenêtre, on choisit la broche 0 du port C pour EUSART TX (cette broche est liée à l'USB), la broche 3 du port C pour MSSP2 SDA2, et la broche 4 du port C pour MSSP2 SCL2 (car le capteur de température est branché à ces deux broches).


On clique ensuite sur le bouton "Generate" afin que les fichiers d'en-têtes soient créés et ajoutés au projet dans MPLAB Xpress.


Une fois de retour dans MPLAB Xpress, le script ci-dessous doit être collé dans le fichier main.c.  Pour la gestion de la communication i2c, ce script utilise plusieurs routines qui se trouvent dans le fichier "i2c2.c" qui a été généré par MPLAB Xpress Code Configurator.  Essentiellement, le programme obtient la température en degrés Celsius qui se trouve dans deux registres différents:  TEMP_HI pour la partie entière et TEMP_LO pour la partie fractionnaire (en quarts de degrés).  Cette valeur est ensuite envoyée à l'ordinateur par communication série USB.

On n'oublie pas, évidemment, de compiler le projet et le téléverser dans le microcontrôleur.

Un bug!!!

...sauf que ça ne fonctionne pas!  Ce script ne parvient jamais à sortir de la routine "EMC1001_Read"!

Après avoir soigneusement analysé l'exemple tout fait (et fonctionnel) fourni par Microchip et mon propre projet (qui devrait en principe être identique), j'ai fini par remarquer que le fichier "i2c2.c" généré par MCC avait été légèrement modifié dans l'exemple clé en main: pouvez-vous voir la différence?

Voici la version créée par MCC, qui ne fonctionne pas:



Et voici celle qui fonctionne grâce à une toute petite modification:


Bravo si vous avez détecté le point virgule qui a mystérieusement été ajouté à la fin de la ligne 684!  Ce point virgule a pour effet de désactiver la boucle while: l'instruction "PIR3bits.SSP2IF = true"  ne s'exécute qu'une seule fois plutôt que de façon répétitive jusqu'à ce que la condition soit satisfaite.

Il nous reste donc à effectuer cette modification pour que notre programme fonctionne.  Il faut donc ouvrir le fichier i2c2.c dans MPLAB Xpress...



...et ajouter ce point virgule à la fin de la ligne 684.


On recompile et téléverse à nouveau, et cette fois notre thermomètre est fonctionnel.

Il ne reste plus qu'à utiliser un logiciel de communications série (Tera Term, PuTTy, le moniteur série de l'IDE Arduino, etc.) pour voir le résultat.

Ici, la température augmente progressivement suite à un séjour de quelques minutes au congélateur:


On peut bien sûr ajouter un afficheur LCD pour que le dispositif soit autonome.

Yves Pelletier   (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire