Le listing 2 contient les configurations dans le cas de la plate-forme
projet. Il est écrit en PERL et contient les deux parties suivantes :
● a. les répertoires qui contiennent les bibliothèques ;
● b. les options qui seront passées au compilateur.
3.
hardware.h : ce fichier est inclus lors de la compilation d’une application. Il sert à définir des constantes et des en-têtes (
headers).
4.
PlatformC.nc : ce fichier ne sert qu’à fournir une implémentation de l’Init, qui sera appelée automatiquement lors du démarrage de la plate-forme. Il permet de fournir un comportement automatique à ce moment, avant le lancement de l’application elle-même.
|
#include "hardware.h"
configuration PlatformC {
provides interface Init;
}
implementation {
components PlatformP, Msp430ClockC;
Init = PlatformP;
PlatformP.Msp430ClockInit -> Msp430ClockC.Init;
}
|
Listing 3 : PlatformC
5.
PlatformP.nc : ce fichier contient l’initialisation des divers composants qui seront utilisés dans cette plate-forme.
|
#include "hardware.h"
module PlatformP {
provides interface Init;
uses interface Init as Msp430ClockInit;
uses interface Init as LedsInit;
}
implementation {
command error_t Init.init() {
call Msp430ClockInit.init();
|
|
call LedsInit.init();
return SUCCESS;
}
default command error_t LedsInit.init() { return SUCCESS; }
}
|
Listing 4 : PlatformP
PlatformP implémente l’interface Init pour lancer l’initialisation de l’horloge interne du MSP430 ainsi que l’initialisation de LED.
|
|
|
6.4 Exemple pratique : contrôle des ports numériques
|
Les ports d’entrée/sortie numériques (
General Purpose Input-Output, GPIO) sont probablement les périphériques les plus simples d’accès : nous allons les exploiter pour contrôler l’allumage et l’extinction de LED (Figure 6), puis pour afficher du texte sur un afficheur LCD compatible HD44780 (Figure 9).
|

|
|
Figure 6 : Câblage des LED
|
La figure 6 présente le câblage physique de deux LED de la carte aux bornes du microcontrôleur. Au niveau de leur implémentation dans TinyOS, il faut créer le fichier suivant, imposé par
LedsC.nc :
|
#include "hardware.h"
configuration PlatformLedsC {
provides interface GeneralIO as Led0;
provides interface GeneralIO as Led1;
provides interface GeneralIO as Led2;
uses interface Init;
}
implementation {
components HplMsp430GeneralIOC as GeneralIOC,
new Msp430GpioC() as Led0Impl,
new Msp430GpioC() as Led1Impl;
components new NoPinC() as Led2Impl;
components PlatformP;
Init = PlatformP.LedsInit; // Raccorde l’event init à celui de PlatformP
Led0 = Led0Impl;
Led0Impl -> GeneralIOC.Port16;
Led1 = Led1Impl;
Led1Impl -> GeneralIOC.Port17;
Led2 = Led2Impl; // No led2 on board
}
|
Listing 5 : PlatformLedsC
Cette configuration permet de préciser le branchement matériel pour chaque LED définie par le pilote TinyOS. Les 5 dernières lignes définissent que led0 est raccordé au Port16 (noté P1.6 dans la documentation (
datasheet) du MSP430) et led1 est raccordé au Port17 (noté P1.7). Le cas de led2 est particulier car le pilote Leds définit une troisième LED absente du montage physique. Celle-ci est connectée sur NoPinC signifiant son absence.
Un exemple d’utilisation des LED est l’application
apps/Blink, qui peut fonctionner sans avoir besoin de la moindre modification.
|
Note
|
| Dans le cas d’une plate-forme exploitant moins de
3 LED, il faut utiliser NoPinC, comme présenté plus haut, pour désactiver les LED absentes. Dans le cas où la carte contiendrait plus de 3 LED, il faut copier les fichiers tos/system/LedsC.nc et tos/system/LedsP.nc afin d’ajouter les LED manquantes dans le pilote officiel. |
|
|
|
6.5 Exploitation d’un LCD
|
Le protocole d’un afficheur LCD à base de contrôleur HD44780 est bien documenté
2. Dans sa version la plus simple, l’implémentation du protocole ne nécessite que 4 bits pour les données à transmettre et 2 bits pour le contrôle de flux.
|
#include "hardware.h"
configuration PlatformLcdC {
provides interface GeneralIO as LcdData0;
provides interface GeneralIO as LcdData1;
provides interface GeneralIO as LcdData2;
provides interface GeneralIO as LcdData3;
provides interface GeneralIO as LcdE;
provides interface GeneralIO as LcdRS;
uses interface Init;
}
implementation {
components HplMsp430GeneralIOC as GeneralIOC,
new Msp430GpioC() as LcdData0Impl,
new Msp430GpioC() as LcdData1Impl,
new Msp430GpioC() as LcdData2Impl,
new Msp430GpioC() as LcdData3Impl,
new Msp430GpioC() as LcdEImpl,
new Msp430GpioC() as LcdRSImpl;
components PlatformP;
Init = PlatformP.LcdInit;
LcdData0 = LcdData0Impl;
LcdData0Impl -> GeneralIOC.Port24;
LcdData1 = LcdData1Impl;
LcdData1Impl -> GeneralIOC.Port25;
LcdData2 = LcdData2Impl;
LcdData2Impl -> GeneralIOC.Port26;
LcdData3 = LcdData3Impl;
LcdData3Impl -> GeneralIOC.Port27;
LcdE = LcdEImpl;
LcdEImpl -> GeneralIOC.Port23;
LcdRS = LcdRSImpl;
LcdRSImpl -> GeneralIOC.Port22;
}
|
Listing 6 : PlatformLcdC
Le listing 6 montre le fichier de configuration. Celui-ci est globalement équivalent à celui des LED, si ce n’est par le volume de broches défini. En effet, avec TinyOS, il n’est pas possible d’accéder à un port complet, mais uniquement aux broches individuelles. Il utilise le même type de ressources permettant ainsi d’émuler l’écriture des données sur le port.
De ce fait, l’écriture sur le port se fait de façon un peu fastidieuse par le code proposé dans le listing 7.