dimanche 29 janvier 2012

Faire clignoter des LEDs avec le Launchpad (MSP430)

Voici un petit exercice d'exploration de mon nouveau Launchpad de Texas Instruments:  faire clignoter 6 LEDs l'une à la suite de l'autre, question de comprendre comment modifier l'état de chaque sortie numérique du microcontrôleur.

Je dois dire que je suis encore à la recherche d'une source de documentation qui m'expliquerait clairement les bases de la programmation de mon Launchpad.  Le site de TI explique comment le commander et comment installer les logiciels, et ensuite ça devient plutôt confus.  Les tutoriels sur internet  ne sont pas si nombreux, et réfèrent parfois à des fichiers qui ne sont plus disponibles sur le site de TI!

Le Launchpad MSP430 est muni d'entrées-sorties numériques numérotées P1.0 à P1.7, puis P2.0 à P2.5 .  Mon but était de faire clignoter l'une après l'autre 6 LEDs branchées aux ports P1.0 , P1.1 , P1.2 , P1.3, P1.4, et P2.5.

Dans un premier temps, il faut activer les sorties.  Sur Arduino, il s'agit d'écrire "pinMode(13, OUTPUT);" si on veut, par exemple, que le port numérique numéro 13 soit défini comme une sortie.

Pour le MSP430, c'est un petit peu plus compliqué:  les 8 sorties de la sortie P1 dépendent de l'état de chaque bit d'un nombre binaire stocké dans la variable P1DIR:

  • Si P1DIR vaut 00000000, alors tous les ports P1 sont des entrées.
  • Si P1DIR vaut 00000001, alors seul le port P1.0 est une sortie.
  • Si P1DIR vaut 00000010, alors seul le port P1.1 est une sortie.
  • Si P1DIR vaut 00001111, alors les ports P1.0 , P1.1, P1.2  et P1.3 sont des sorties.
C'est le même principe pour régler l'état (haut ou bas de chaque sortie).  Sur Arduino, on écrit "digitalWrite(13, HIGH);" ou ""digitalWrite(13, LOW);".  Sur le Launchpad, on règle à 0 ou 1 chaque bit d'un nombre binaire:
  • Si P1OUT vaut 00010000, alors le port P1.4 est haut, tous les autres sont bas
  • Si P1OUT vaut 11111111 alors tous les ports P1 sont hauts
  • Si P1OUT vaut 10101010 alors les ports P1.1, P1.3, P1.5 et P1.7 sont hauts.
Mais dans le programme, ce nombre doit être écrit en hexadécimal (du moins je n'ai pas trouvé de façon d'utiliser directement la version binaire).  Pour ce faire, on peut utiliser un des nombreux convertisseurs disponibles sur le web.  Ainsi, pour allumer la LED reliée à P1.0, le nombre binaire 00000001 devient 0x01.  Pour allumer la LED reliée à P1.4, le nombre binaire 00010000 devient 0x10...

L'avantage, c'est qu'on peut déterminer l'état des 8 ports en même temps au moyen d'une directive très courte.  L'inconvénient (irritant majeur en ce qui me concerne), c'est que l'écriture et la lecture du programme par un être humain devient assez arride.

Quand je programme mon Arduino, ou quand je lis un sketch Arduino réalisé par quelqu'un d'autre, j'ai l'impression de lire des instructions en Anglais qui ne sont pas très éloignées de la communication humaine:
        digitalWrite(13, HIGH);
        delay(1000);
        digitalWrite(13, LOW); 
        delay(1000); 
...Un peu comme si je disais à quelqu'un "SVP, pourrais-tu allumer la lumière numéro 13?  Attend un peu... Maintenant, éteint-là, et attend encore...

Alors que P1OUT = 0x10; suivi d'une instruction de calcul répétitif car il n'existe même pas de fonction "delay", ça me semble beaucoup moins clair...

Je continue donc d'en arriver à la même conclusion:  je préfère mon Arduino!

Ci-dessous, mon programme complet pour faire clignoter 6 LEDs:




/****************************************************************
6 LEDs clignotent en alternance.
*****************************************************************/

#include  

void delai(void)
 {
    volatile unsigned int i;
    i = 50000;        // Delai
    do (i--);
    while (i != 0);
 }


void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;         // Stop watchdog timer

  P1DIR |= 0xFF;  // toutes les sorties 1.x sont output car FF 
                  // est l'équivalent de 11111111
  P2DIR |= 0xFF;  // toutes les sorties 2.x sont output car FF 
                  // est l'équivalent de 11111111
    
  for (;;)
  {
    
    P1OUT = 0x01;       // Équivalent de 00000001  Seule la sortie 
                        // 1.0 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();

    P1OUT = 0x02;       // Équivalent de 00000010  Seule la sortie 
                        // 1.1 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();

    P1OUT = 0x04;       // Équivalent de 00000100  Seule la sortie 
                        // 1.2 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();

    P1OUT = 0x08;       // Équivalent de 00001000  Seule la sortie 
                        // 1.3 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();
    P1OUT = 0x10;       // Équivalent de 00010000  Seule la sortie 
                        // 1.4 est haute, les autres sont basses
    P2OUT = 0x00;       // Toutes les sorties 2.x sont basses
    delai();
    P1OUT = 0x00;       // Toutes les sorties 1.x sont basses
    P2OUT = 0x20;       // La sortie 2.5 est haute
    delai();
                  
  }
}








Yves Pelletier (Twitter: @ElectroAmateur)

mardi 24 janvier 2012

Le Launchpad de TI, suite: réception et installation

J'ai bien reçu les deux exemplaires du Launchpad de Texas Instruments dont je parlais il y a quelques jours, livrés en moins de 48 heures par les bons soins de la compagnie FedEx.  Comme c'est toujours le cas avec ces services de messagerie, le livreur vient sonner à ma porte pendant que je suis au travail (donc absent de chez moi), et laisse une note à ma porte pour m'aviser qu'il me reste 5 jours pour aller récupérer le colis à un nébuleux comptoir situé à 20 km de chez moi, ouvert essentiellement pendant mes heures de travail, dans un quartier où je ne vais jamais...  (Si le colis avait été expédié par la poste, je l'aurais récupéré dans une boîte postale située à 30 secondes de marche de mon domicile).

J'ai eu le privilège de recevoir la toute nouvelle version du Launchpad, disponible depuis quelques semaines seulement, qui est accompagnée de deux microntrôleurs plus performants que ceux qui venaient avec la version précédente (les modèles MSP430G2553 et MSP430G2452), et doté de connecteurs mâles déjà soudés à la carte.  Oui:  des connecteurs mâles, donc pas question d'y brancher des shields pour Arduino.

Étape suivante:  télécharger le logiciel de développement Code Composer Studio.  C'est gratuit, mais il faut d'abord promettre que nous n'utiliserons pas le logiciel pour collaborer avec les cubains ou les iraniens!  Ils sont un peu paranos, chez Texas Instruments, je crois...

J'ai fait l'erreur de démarrer l'installation de la version complète de Code Composer Studio version 5.  Quelques minutes plus tard, j'ai vu qu'on me conseillait plutôt une version limitée de la version 4.  Trop tard:  l'installation ne pouvait pas être interrompue; elle s'est terminée plus de deux heures plus tard, occupant beaucoup trop d'espace sur mon disque dur!  Désinstallation de la version trop gourmande, installation de la version plus frugale (qui demande quand même 1 Go de RAM!):  on peut enfin commencer!

Comme le veut la tradition, mon premier projet consiste à faire clignoter les deux LEDs qui se trouvent sur la carte.  Il a fallu que je cherche un bon moment.  Oubliez les exemples clairs de l'environnement Arduino, facilement accessibles à partir d'un menu.  Pour le launchpad, il faut télécharger les fichiers d'exemple à part, en prenant soin de choisir la série qui correspond à notre numéro de microcontrôleur, et localiser le fichier "msp430g2xx3_1.c" (et je suis supposé trouver évident que  "Software Toggle" est la description d'une routine permettant de faire clignoter une LED)!!!

Ça fonctionne, bien sûr.  Le programme n'est pas très long, mais c'est beaucoup plus aride qu'un sketch d'Arduino:  les sorties sont numérotées en hexadécimal  ("P1DIR |= 0x01;"), la variable est un "volatile unsigned int",  le clignotement s'effectue au moyen d'un ou exclusif ("P1OUT ^= 0x01;")...

Je vais continuer d'explorer ça mais, pour l'instant, je continue de trouver mon Arduino beaucoup plus sympathique!

mardi 17 janvier 2012

Le Launchpad de Texas Instruments: un Arduino pour $4,30?

LaunchPad wireframeAvec plus d'un an de retard, je m'intéresse finalement au Launchpad de Texas Instruments:  une plate-forme de développement pour le microcontrôleur MSP430, offert au prix incroyable de $4,30 (frais de ports inclus!).  Pour mes lecteurs européens (vous êtes en majorité): $4,30 correspond à 3,38 euros!

Pour le prix de deux cafés, on obtient ainsi la carte (genre Arduino), accompagnée de deux microcontrôleurs, un câble USB et deux logiciels (Windows seulement).

De toute évidence, Texas Instrument s'attaque au marché des amateurs et tente de concurrencer l'Arduino (y parviendra-t-il?  Les avis semblent partagés).  Ironiquement, la page de commande de la boutique en ligne de Texas Instruments a été conçue en fonction d'une clientèle corporative:  pour vous inscrire (et commander le produit), vous devez obligatoirement inscrire le nom de votre compagnie, et même l'adresse de son site web...étrange façon d'accueillir les amateurs!

Je viens d'en commander deux.  Je vous en donnerai des nouvelles...

Ci-dessous, un employé de Texas Instrument nous montre avec enthousiasme le contenu de la boîte...



Yves Pelletier (Twitter: @ElectroAmateur)