Bonjour, l'environnement Arduino, il faut le reconnaître, est génial pour débuter
avec les microcontrôleurs, c'est simple à utiliser, c'est pratique.
Toutefois, lorsqu'on a un tout petit peu plus d'expérience, on a
souvent envie de passer à des programmes qu'on écrit intégralement en C.
Et alors, il se pose quelques
difficultés que j'aimerais essayer d'expliquer aujourd'hui.
Tout d'abord, j'aimerais vous rappeler que le
mot Arduino a en fait trois significations
assez différentes : Premièrement, il s'agit d'une
carte à microcontrôleurs, vous la connaissez bien.
Deuxièmement, il s'agit d'un environnement de programmation, il existe
d'ailleurs des environnements similaires à
l'environnement Arduino pour d'autres microcontrôleurs.
Nous allons aujourd'hui utiliser l'environnement
Energia pour les processeurs MSP 430.
Et la troisième signification du mot Arduino, c'est les librairies Arduino,
c'est les appels, les fonctions, les procédures qui se trouvent dans la
librairie Arduino que vous connaissez bien, telles que Pin Mode, telles
que Digital Read, Digital Write et on l'appelle parfois le langage Arduino.
Alors regardons le programme le plus simple
qu'on a déjà utilisé à plusieurs reprises.
Alors, vous connaissez bien ce programme, voilà comment il est écrit,
il y a la procédure Setup qui initialise la patte en sortie, et on fait
successivement dans la boucle loop un
digital write pour allumer la diode lumineuse,
une attente, un digital write pour
éteindre la diode lumineuse et une attente.
Je vais garder l'essentiel de ce programme pour
qu'on puisse bien voir ce qui se passe.
Nous allons le compiler, nous allons ensuite exécuter, plus exactement,
le téléverser, et on voit effectivement que la petite lampe clignote.
Vous savez que nous n'aimons pas beaucoup écrire
les programmes de cette manière-là, qui d'ailleurs nécessite des
commentaires, parce que ce n'est pas facile de
comprendre à quoi correspond tel ou tel digital write.
Nous préférons cette manière d'écrire où on définit Led1On avec son digital
write, et à l'intérieur du programme il suffit d'appeler cette définition.
Et là, vous voyez que j'ai même enlevé les
commentaires qui, à mon avis, ne sont plus véritablement utiles.
Le programme, évidemment, marche de la même manière.
Je vous propose de commencer par modifier un petit peu
ce programme pour le rendre un petit peu plus compliqué.
On va ici lui ajouter la lecture du bouton-poussoir de telle
manière que l'on puisse lancer le clignotement en pressant sur le bouton.
Alors, naïvement, j'ai initialisé la
patte du bouton poussoir en input, j'ai fait un digital read
de ce, de cette patte, et vous allez voir que le programme ne fonctionne pas.
La lampe est allumée, je presse sur le bouton, il ne se passe rien, si je caresse
les pattes ici, il se passe des choses, c'est vraiment assez mystérieux.
Alors bien sûr, on sait de quoi il s'agit, il faut modifier le programme de cette
manière-là : j'ai mis ici INPUT_PULLUP pour le mode
d'utilisation du bouton-poussoir, de telle manière qu'il y ait donc cette résistance
de tirage qui donne un état stable lorsqu'on ne presse pas sur le bouton.
J'ai également profité de définir correctement l'appel
Push 1 On et j'ai également hum, ajouté
l'inversion de cette lecture digitalread de telle manière que lorsque
le bouton est pressé et qu'on a donc un état logique zéro à
l'entrée qui est donnée par le câblage, on obtienne une condition vraie pour
que ce if puisse avoir un sens.
Et cette fois, le programme devrait fonctionner.
On voit que lorsque je presse sur
le bouton, ça se met effectivement à clignoter.
Essayons maintenant de remplacer tous ces appels Pin mode, Digital read,
Digital write par des accès directs au registre du microcontrôleur.
On voit ici qu'on a définit les bits dans le port un, pour la led d'une part, pour
le bouton-poussoir d'autre part, on a définit Led on/Led off avec un sept
bits sur le bit correspondant, avec un clear
bit sur le bit correspondant, on a utilisé
la lecture de P1 In avec masquage du
bit du bouton-poussoir pour la lecture du bouton-poussoir.
Le programme principal, évidemment, ne change pas,
la boucle principale est totalement identique à ce
qu'on avait tout à l'heure, par contre dans
le setup j'ai agi directement sur P1 Dir
pour mettre la led en sortie, j'ai profité de l'éteindre au début du programme et
j'ai également enclenché la résistance de pull-up en
agissant sur P1REN et j'ai indiqué qu'il s'agissait
d'une résistance de tirage vers le haut, donc pull-up hum en
agi, en mettant un un dans le bit correspondant de P1OUT.
Alors ce programme devrait fonctionner tout à fait comme l'autre.
Regardons que tout à l'heure on avait 714 octets pour ce
programme, je le compile, on a maintenant, on le verra très
exactement au moment du téléversement, on a seulement 410
octets pour un programme qui fait rigoureusement la même chose.
Quand on presse sur le bouton, la lampe s'allume.
Donc on voit que c'est relativement intéressant,
on a gagné de la place en mémoire.
Or, il resterait maintenant une dernière étape, celle de s'affranchir du setup et
loop et d'écrire directement le programme principal main.
Essayons de le faire.
Voilà comment ce programme pourrait se présenter, avec le main qui contient cette
fameuse instruction pour l'initialisation du watchdog
timer, ce qui était précédemment dans le setup, une
boucle infinie while un, et ce qui se trouvait précédemment dans le loop.
Alors on va voir si ça marche.
Alors ma lampe est éteinte, c'est bon
signe, je presse sur le bouton, elle s'allume, mais ça ne clignote pas.
Pourquoi?
Eh bien, nous avons commis une erreur grave, nous avons oublié que l'appel
delay était aussi un appel propre à
l'environnement Arduino, et que pour qu'il fonctionne
l'environnement Arduino doit initialiser un certain
nombre de choses, en l'occurrence des timer,
et que comme nous avons écrit nous-mêmes
la routine principale, le main, ces initialisations
n'ont pas eu lieu et le programme n'a pas marché.
Alors nous allons devoir réécrire nous-mêmes le, la procédure delay.
Alors ici je l'ai appelé Attente MS comme j'ai l'habitude de
le faire, mais on comprend bien qu'il s'agit de la même fonctionnalité.
Donc on a cette routine, avec donc une variable volatile pour que elle soit, hum.
que la boucle, ici centrale, s'exécute effectivement quand bien
même elle est vide, ce qui va prendre un
petit peu de temps, et alors mon programme principal
ici avec ces attentes, et cette fois il devrait fonctionner.
Je presse sur le bouton, ça clignote.
Alors, ne tombez pas dans le piège, vous devez choisir.
Soit vous utilisez l'environnement Arduino et vous utilisez les procédures setup et
loop, soit vous vous affranchissez de
l'environnement Arduino, vous accédez directement les
registres du processeur, vous écrivez la procédure main et une boucle infinie
while un, mais alors vous n'avez plus le droit d'utiliser les appels Arduino.