Le clignotant à LED, on peut dire que c'est le "Hello World" de la programmation embarquée. Ce tutoriel explique comment faire clignoter une LED avec REOBoard. Il est nécessaire d'avoir installé au moins l'un des deux environnements de développement recommandés. Des notions de programmation basique en C/C++ facilitent l'assimilation.

Utilisation des ports

Pour allumer une LED, il est nécessaire d'utiliser un port (parfois appelé GPIO pour General Purpose Input Output). Un port est un ensemble d'entrées / sorties configurables. En général, ce sont des ensembles de 8, 16, 32 ou 64 bits dépendant de l'architecture. Dans le cas des petits microcontrôleurs commes nous allons utiliser, ces ports sont en 8 ou 16 bits, ce qui signifie qu'il y a 8 ou 16 "pattes" qui peuvent être mise à l'état logique 0 (0V) ou 1 (tension d'alimentation, ici 3.3V). Le processeur utilisé sur la carte REOBoard est un MSP430 de Texas instruments. Il a des ports de 16 bits divisés en deux "sous-ports" de 8 bits.

Il était question plus haut d'entrée / sortie. Donc avant d'utiliser un port, il va falloir le configurer en entrée ou sortie, configurer sa direction. Pour cela, il y a un registre de contrôle qui permet de configurer chaque bit en entrée ou sortie séparément. Un 1 signifie sortie, un 0 signifie entrée. Attention: ceci peut être différent sur d'autres familles de processeurs. Nous allons utiliser le port 1. Son registre de configuration est P1DIR (pour direction). Les bits d'un port de n bits sont numérotés de 0 à n-1. Dans le cas de 8 bits, de 0 à 7. Il est plus facile d'utiliser la notation hexadécimale ou binaire (ici hexadécimale). Pour plus de détails, voir les pages Wikipedia.

Exemples d'utilisation

(A) P1DIR = 0x01; Configure le bit 0 du port 1 en sortie, tous les autres en entrée
(B) P1DIR |= 0x01; Configure le bit 0 du port 1 en sortie, sans changer les autres
(C) P1DIR = 0x05; Configure les bit 0 et 2 du port 1 en sortie, tous les autres en entrée
(D) P1DIR &= ~0x01; Configure le bit 0 du port 1 en entrée sans changer les autres
(E) P1DIR ^= 0x01; Change la direction du bit 0 du port 1 sans changer les autres

 

 

 

 

Ces opérations auront bien entendu le même effet sur n'importe quel registre.

Ensuite, nous pouvons mettre arbitrairement à 0 ou 1 tous les bits configurés en sortie. Exemple, en admettant que le (C) ci dessus a été exécuté:

(A) P1OUT = 0x01; Met le bit 0 à 1, met le bit 2 à 0 et ne change pas les autres car ils sont en entrée
(B) P1DIR |= 0x01; Met le bit 0 à 1, ne change ni le bit 2 ni les autres.
etc...  

 

Allumer une LED

Ce programme est extrêmement simple. Nous allons seulement créer une fonction de délai, sinon comme un processeur est très rapide, nous ne pourrions pas voir la LED s'allumer ni s'éteindre.

Par défaut, la fréquence du processeur est de 1 MHz environ. Nous allons créer une boucle qui compte et ne fait que cela. Une boucle prend du temps pour s'exécuter. Variable suivant le processeur, mais pour celui-ci c'est environ 10 cycles. La fréquence d'une boucle est donc d'environ 100 kHz. Si nous voulons faire un délai de 1 ms, nous devrons par conséquent compter jusqu'à 100. Alors nous allons définire MILLISECOND comme étant 100.

Voici le programme complet:

-------------------

//    Includes
#include <msp430F5659.h>

//    Constant definitions
#define MILLISECOND        100
//    Program protocols
void delay(unsigned short ms);

//    Main program
void main(void) {
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
    P2DIR = 0x01;
    while(1) {
        P2OUT ^= 0x01;
        delay(1000);
    }
}

//    Delay functions
void delay(unsigned short ms) {
    volatile unsigned short i, j;
    for(i = 0 ; i < ms ; ++i) {
        for(j = 0 ; j < MILLISECOND ; ++j);
    }
}

-------------------

On peut remarquer que la fonction delay permet de créer n'importe quel délai en millisecondes. Nous avons écrit delay(1000), ce qui correspondra à un délai de 1000 ms, donc 1 seconde.

LEDGreen320Ensuite, pour faire clignoter une LED, nous avons besoin... d'une LED. Une façon simple et rapide de faire ce qu'il nous faut est de souder une résistance à la place d'une de ses pattes. Ici, nous avons choisi 220 ohms. Comme la tension de cette diode est proche de 2V, il restera 1,3V pour 220 ohms, soit 6 mA environ. Comme le MSP430 peut délivrer 20 mA, il n'est pas nécessaire d'utiliser un transistor pour commuter cette diode.

LEDMount320Nous pouvons maintenant introduire l'assemblage dans un des connecteurs, entre les contacts P20 et GND. Si cela ne fonctionne pas, inversez. Comme il s'agit d'une diode, il n'y a aucun danger à l'inverser. Simplement, l'une des 2 solutions possibles ne fonctionnera pas.

Voilà, il suffit de compiler le programme et de le charger pour le faire fonctionner.

Il est évidemmet possibe de choisir n'importe quel autre port et n'importe quelle autre patte. Si vous voulez utiliser non pas le bit 0 du port P2 mais le bit 2, alors il faudra juste changer 0x01 en 0x04 et tout le reste sera inchangé.

Il est possible de modifier le programme à votre convenance pour faire fonctionner un nombre arbitraire de LEDs. Un bon exercice serait par exemple de mettre une rangée de 8 LEDs sur le port 2 et de les allumer en séquence.

Pour faire cela, il faudrait alors mettre tous les bits en sortie (P2DIR = 0xFF;) et allumer 1 bit à la fois.

 

Commentaires

Nous avons utilisé un délai pour faire fonctionner ce programme. C'est une approche très simple, mais qui a un gros inconvénient: le processeur est occupé à compter et ne peut rien faire d'autre pendant ce temps là. De plus, en supposant que l'on utilise un délai fixe, la période d'allumage et d'extinction dépendra des cycles nécessaires à allumer et éteindre la LED. Pour pallier ces inconvénients, nous allons introduire des timers dans le prochain chapitre.

 

Téllécharger le programme

Un sommaire de ces prmiers programmes est téléchargeable en fichier zip ici.