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.