Bonjour à toutes et à tous.
Certain(e)s d’entre vous ont sûrement connu ce site par l’intermédiaire de mon tutoriel sur la configuration de Code::Blocks pour programmer des PIC. Mais comme il s’agit d’un article très spécifique, avec un matériel et des logiciels adaptés, le but du présent article sera donc d’introduire des bases plus générales de la programmation de systèmes embarqués, à commencer par la présentation des outils nécessaires à la programmation de microcontrôleurs.
Mise à jour du 10/01/2020 : Dans l’article, la distinction est faite entre Atmel et Microchip. En 2015, année de publication de l’article, il s’agissait alors de deux entités différentes. Depuis 2016, Atmel a été racheté par Microchip. Même si cela ne change pas grand chose au niveau des produits, merci de prendre cet aspect en compte.
Le microcontrôleur
À la base, nous avons un microcontrôleur, qui est un composant électronique jouant le rôle d’un ordinateur à une échelle très réduite. Pour chaque microcontrôleur, son fabricant propose généralement un kit de développement permettant de relier ce microcontrôleur à l’ordinateur servant à le programmer.
En effet, contrairement au développement informatique en général, le développement ne se fait pas directement sur le microcontrôleur, ses ressources étant trop limitées pour y implémenter à la fois le programme et tous les outils logiciels pour le développer, comme le compilateur ou l’éditeur de code. Nous devons donc déporter ce développement sur une plate-forme possédant les ressources nécessaires pour accomplir cette tâche. On parle alors de compilation croisée, puisqu’on écrit et compile du code pour une autre plate-forme que celle sur laquelle on développe.
Pour ce qui est du choix du microcontrôleur, il se fait en fonction des besoins du projet à réaliser. Le budget peut également être un facteur déterminant.
Les fabricants ne manquent pas et il existe des microcontrôleurs pour toutes sortes d’usage. Microchip propose des microcontrôleurs assez généralistes, les fameux microcontrôleurs PIC. Ils sont peu chers mais assez chaotiques dans leur fonctionnement. On les utilise généralement pour l’apprentissage de la programmation de microcontrôleurs ou des questions de budget.
Ensuite, on trouve Atmel et ses microcontrôleurs 8 bits AVR. Ils sont généralement de meilleure qualité que les PIC pour un coût à peu près équivalent. Ils sont d’ailleurs à la base des fameuses cartes Arduino, utilisées essentiellement pour l’apprentissage de l’embarqué et pour le développement de nombreux projets amateurs. À noter qu’il existe une version PIC d’Arduino, moins connue, nommée Pinguino.
Il existe une autre architecture de microcontrôleurs, très courante mais non spécifique à un seul fabricant, qui est le 8051. Initialement créé par Intel en 1980, cette architecture a été beaucoup reprise par de nombreux constructeurs et est encore très utilisée aujourd’hui.
On peut également trouver d’autres architectures de microcontrôleurs comme les MSP430 de Texas instruments, les PSoC de Cypress, les 6800 et 68000 de Freescale (anciennement Motorola et appartenant désormais à NXP), les STM8 de STMicroelectronics ou les Z80 de Zilog (que l’on trouvait notamment, sous forme dérivée, dans la fameuse console portable GameBoy).
Enfin, il existe l’architecture ARM. À l’instar de 8051, cette architecture est intégrée par la plupart des fabricants de circuits intégrés et est présente dans bons nombre de produits technologiques du grand public (dans les smartphones et les tablettes, entre beaucoup d’autres). À ce jour, c’est certainement l’architecture la plus utilisée dans les systèmes embarqués, mais sa prise en main n’est pas adaptée à des débutants dans le domaine de l’embarqué.
Read The [EFF!]ing Manual
Le développement embarqué c’est également pas mal de temps à se documenter, au moins pour comprendre le fonctionnement du matériel que l’on utilise. C’est pour cela que je vous encourage à lire la documentation du matériel et des outils que vous utiliserez. Pour cela, l’anglais est indispensable puisque la grande majorité des documents sont en anglais.
Cela dit, n’hésitez pas non plus à demander de l’aide sur des forums comme Developpez.net. ;-)
Le langage de programmation
Hormis avec quelques rares exceptions comme les compilateurs mikroBasic ou mikroPascal de MikroElektronika, si vous voulez vous lancer à corps perdu dans le domaine de l’embarqué tout en espérant y trouver suffisamment d’informations pour progresser facilement, il vous faudra passer par l’apprentissage du C, si vous ne maîtrisez pas déjà ce langage.
Pour acquérir les bases du langage C rapidement, je ne peux que vous conseiller de trouver des cours sur internet comme Le C en 20 heures. Vous pouvez également chercher du côté d’OpenClassrooms ou de Developpez.com.
Même si ce n’est pas obligatoire, il est également préférable d’acquérir au moins quelques bases en assembleur.
L’éditeur de code
Les outils pour l’écriture de code restent généralement les mêmes que pour du développement logiciel général, allant du simple bloc-notes à l’environnement de développement intégré. Mais, lors de l’écriture, on tiendra compte des limites de la cible de programmation. En bref, la programmation embarquée exige beaucoup plus de rigueur concernant la gestion des ressources, de la taille mémoire, de la pile, du tas, des exceptions, etc. Mais cela fera l’objet d’autres tutoriels.
Pour en revenir aux éditeurs, on pourra utiliser des outils conventionnels disposant d’extensions spécialisées pour le développement de la cible choisie, voire proposant des outils supplémentaires pour mieux répondre aux contraintes des microcontrôleurs. Je pense notamment à Code::Blocks ou Eclipse.
Mais, de manière générale, chaque fabricant de microcontrôleurs proposera un outil spécifique à son matériel, voire un outil fait maison. C’est le cas par exemple de Microchip avec MPLAB, Atmel avec Atmel Studio, ARM avec MDK-ARM, etc. Pour chaque matériel, on trouvera au moins un outil de développement qui sera soit directement développé par le constructeur, soit développé par des sociétés externes. Ce dernier cas est valable, par exemple, pour la société IAR Systems qui propose des outils de développement ciblant plusieurs architectures d’autres constructeurs – techniquement c’est le même outil mais avec une version spécifique pour chaque architecture.
Il s’agit généralement d’outils propriétaires et/ou payants. Les amateurs de logiciels gratuits et/ou libres seront facilement rebutés et préféreront s’orienter vers d’autres alternatives, dont le monde du logiciel libre ne manque pas. Par exemple, pour les PIC, il existe l’outil Piklab dédié à cette famille de microcontrôleurs ou encore MCU 8051 IDE dédié aux microcontrôleurs à base de 8051.
Le compilateur
Une fois le programme écrit, il nous faut le compiler. Le fabricant du microcontrôleur utilisé proposera un compilateur spécifique à son matériel, allant généralement de pair avec l’outil de développement. C’est le cas, par exemple, pour le compilateur XC qui accompagne l’outil MPLAB X, le compilateur Keil pour MDK-ARM ou le compilateur IAR pour l’outil du même nom.
Côté logiciel libre, on trouvera un bon nombre de compilateurs, généralement dérivés du compilateur GCC. On peut par exemple citer AVR-GCC pour les microcontrôleurs AVR, GNU ARM pour les architectures ARM ou MSP430 GCC pour les microcontrôleurs MSP430 de Texas Instruments.
Il existe aussi le compilateur SDCC, dont j’ai déjà parlé dans un précédent tutoriel, qui a la particularité de cibler plusieurs plate-formes. Parmi ces cibles supportées, on peut compter plusieurs microcontrôleurs 8051, le Z80 de Zilog, des HC08 de Freescale ou encore les fameux PIC de Microchip (extension non libre). Je vous invite à vous référer au site du compilateur pour connaître les architectures supportées.
Le programmateur et le débogueur
Une fois le programme compilé, il faut pouvoir l’inscrire dans la mémoire du microcontrôleur ciblé. Pour cela, il faut un outil matériel communément appelé un programmateur.
Là encore, on trouvera différents programmateurs pour chaque cible, les premiers étant fournis par les fabricants du microcontrôleur, les autres étant souvent le fait de passionnés d’électronique proposant une alternative moins chère aux programmateurs commerciaux, qui peuvent souvent se révéler assez chers.
Pour les PIC, la référence est le PICKit, actuellement dans sa version 3. Pour les microcontrôleurs AVR, ce sera plutôt le AVRISP mkII.
Ces programmateurs sont proposés par le constructeur, mais il existe des alternatives intéressantes, comme le usbpicprog pour les cibles PIC. Il est libre, compact (54 x 28 x 14 mm) et il est assez simple à utiliser. Normalement vous pouvez le construire vous-même mais il est possible d’en commander sur le site pour pas cher (20€ pièce, plus les frais de port qui sont raisonnables).
Côté AVR on se tournera plutôt du côté de l’USBtinyISP, créé par Adafruit (auquel je vous recommande chaudement de vous intéresser, leur travaux sont tout à fait remarquables). Initialement vendu en kit, il est possible de le commander déjà monté, et son coût est à peu près équivalent au usbpicprog.
Attention ! Il est important de faire la distinction entre un programmateur et un débogueur. On retiendra que le programmateur permet de manipuler les données de la mémoire du microcontrôleur, tandis que le débogueur permet d’exécuter le programme et de superviser son fonctionnement en temps réel depuis un ordinateur. Si les deux peuvent être intégrés dans le même outil, ce n’est pas toujours le cas, donc faites attention à vérifier si l’outil que vous choisissez correspond à vos besoins.
Le simulateur
Il peut arriver que l’on ne dispose pas du matériel requis pour travailler directement sur la cible de programmation, ou que l’on préfère simuler le fonctionnement du programme pour éviter d’endommager le microcontrôleur. Dans ces cas-là, on peut utiliser un programme qui va simuler l’exécution du programme que l’on souhaite tester.
Microchip et Atmel ont intégré un simulateur dans leur outil de développement. Les alternatives libres ne manquent pas non plus et on pourra trouver GPSim pour PIC et Simulavr pour AVR. Le compilateur SDCC comprend également un simulateur, nommé µCsim, qui gère essentiellement les cibles 8051.
Retenez cependant qu’un programme qui fonctionne sans problème avec un simulateur n’implique pas forcément que le programme fonctionnera aussi bien sur un microcontrôleur.
Conclusion
J’espère avoir apporté assez d’éléments pour vous permettre d’appréhender les bases du développement sur microcontrôleurs. Bien entendu tout cela est valable surtout si vous souhaitez partir du plus bas niveau, en sélectionnant vous-même le microcontrôleur et les outils associés.
Mais, si tout cela vous rebute, vous pouvez aussi bien vous orienter vers une solution comme Arduino, parfaitement adaptée aux débutants en embarqué. D’autant qu’une communauté très forte s’est bâtie autour de ce système et vous n’aurez donc aucun mal à trouver de l’aide pour progresser.
Cependant, le côté simpliste de la plate-forme risque de vous imposer de passer à quelque chose de plus ardu à un moment donné. Auquel cas, ou si vous souhaitez essayer d’autres architectures par pure curiosité, je vous invite à choisir parmi les cibles évoqués dans cet article. Si vous voulez rester sur du matériel AVR, sachez qu’il est également possible de programmer directement le microcontrôleur de la carte Arduino via les broches ISP prévues à cet effet. Il vous faudra cependant utiliser un programmateur comme un de ceux évoqués plus haut.
N’hésitez pas à poser des questions en commentaires si certains points ne sont pas clairs ou si vous souhaitez obtenir davantage d’informations.
Sur ce, je vous laisse et vous dis à bientôt.
Nicolas SAN AGUSTIN
BELFETHI Ahmed
/ 2018-01-07, 15:15:56Bonjour Nicolas. Votre article m’a beaucoup plu.Il est tres explicite et
très clair.Il est agréable à lire.Sincère.Bref…Dommage que votre site n’est
pas assez plein si j’ose dire, mais, vu votre age, ce n’est pas pas mal.Votre
passion pour la technologie est comme la mienne pour l’électronique et
la langue française que j’adore!Malheuresement, dans ce bas monde, ceux
ou celles qui peuvent contribuer au bien-etre de l’humanité manquent
terriblement de moyens! Financiers surtout! Enfin…
Nicolas SAN AGUSTIN
/ 2018-02-12, 10:21:09Bonjour Ahmed et merci pour votre commentaire encourageant. :)
J’aimerais écrire davantage sur ce blog, partager un peu plus de mes expériences, mais je fais en fonction de mon temps libre et de ma motivation (et comme mon temps libre n’est pas toujours régulier, la motivation ne dure que quelques temps).
Il y a bien d’autres sujets que j’aimerais aborder sur ce blog, que ce soit d’électronique, d’informatique ou d’expériences personnelles (pas trop personnelles). Depuis quelques jours je sens la motivation revenir, j’en profiterai sûrement pour reprendre l’écriture.
En attendant, je vous souhaite bon courage et bonne continuation dans vos projets ;)
Marc Breton
/ 2018-11-19, 21:47:32merci infiniment pour tout c’est précieux conseils, je vous tient au courant pour ma programmation. Marc Breton un élève au bout du rouleau.
Hayat AGGOUR
/ 2020-10-27, 00:53:52Merci pour ce précieux document, Article bien réussi claire et net, Je vous félicite!
Nicolas SAN AGUSTIN
/ 2020-11-26, 11:42:01Merci à vous, c’est encourageant ! :)
Brahim baadi
/ 2020-12-10, 23:31:34Merci beaucoup pour ces idées, je suis passionné de domaine de l’électronique et la programmation embarqué je veux savoir la différence entre un microcontrôleur accompagné d’ éeprom sur même carte électronique et un microcontrôleur sans éeprom ?
Nicolas SAN AGUSTIN
/ 2020-12-11, 00:06:48Merci pour votre commentaire.
L’EEPROM est une mémoire qui va servir à stocker des données de manière persistante, c’est-à-dire que ce qui est inscrit dedans ne va pas s’effacer à l’extinction du microcontrôleur. C’est assez pratique, par exemple, pour enregistrer des données de configuration personnalisées.
Certains microcontrôleurs ont une EEPROM intégrée. Ce n’est pas indispensable, seulement si vous y voyez une utilité. D’autant qu’il existe d’autres types de mémoires non-volatiles qui peuvent potentiellement être plus efficaces. C’est à voir en fonction de vos besoins.
J’espère avoir répondu à votre question suffisamment clairement.
Jean-baptiste Guilhem
/ 2023-03-26, 21:15:24Bonjour,
Merci pour tous ces conseils et information.
Pour un faire de la programmation d’un microcontrôleur MC9S908AC60 de freescale peut-on me conseiller pour le choix d’un environnement et du logiciel le plus adapté permettant cela.
Merci de m’informer
Cordialement
Nicolas SAN AGUSTIN
/ 2023-03-26, 21:23:44Bonjour,
Si c’est un Freescale, c’est probablement géré par NXP. NXP a plusieurs environnements de développements, dont un basé sur Eclipse, un IDE libre et gratuit : MCUXpresso.
Probablement que le MC9S908AC60 est géré par cet IDE.
En espérant que ça vous aura été utile.
Cordialement
Jean-baptiste Guilhem
/ 2023-03-27, 11:09:26Bonjour,
Merci pour votre retour rapide.
Je regarde tout cela.
Merci
Cordialement