
Dans cet article, nous vous proposons une petite introduction à la programmation d’une très célèbre famille de microcontrôleurs d’Atmel. AVR est le terme utilisé par Atmel pour désigner le cœur du processeur et la famille de microcontrôleurs les implémentant. La plateforme Arduino est d’ailleurs basée sur l’architecture des microcontrôleurs Atmel Atmega, mais nous allons découvrir cette plateforme en dehors de l’aspect Arduino, avec ses propres outils de développement. Il n’est pas important d’avoir déjà touché à un microcontrôleur avant de s’attaquer à cet article, même si un petite connaissance de l’Arduino vous aidera probablement.
Prérequis
Vous n’avez besoin que de connaissances de base pour installer et utiliser des programmes sur votre ordinateur. Vous devez avoir une idée de ce qu’est une platine Labdec qui est un dispositif qui permet de réaliser le prototype d’un circuit électronique et de le tester. L’avantage de ce système est d’être totalement réutilisable, car il ne nécessite pas de soudure. Ce dernier point distingue les platines Labdec des stripboards (ou veroboards), des perfboards ou des circuits imprimés qui sont, eux, utilisés pour réaliser des prototypes permanents et que l’on sera donc moins à même de démonter. On peut de plus câbler sur une platine Labdec une grande variété de composants afin de réaliser des circuits électroniques, du plus simple circuit jusqu’au microprocesseur. Il serait également avisé d’avoir ne serait-ce qu’un multimètre électronique ! Et n’hésitez par à utiliser Google pour trouver les réponses aux questions auxquelles nous n’aurions pas répondu dans ce tutoriel. Mais tout cela ne vous servira que si vous passez de la théorie à la pratique, ce qui ne sera pas l’objet de cet article.
Un microcontrôleur, ça sert à quoi ?
Nous ne pourrons pas répondre entièrement à cette question, tellement il y aurait à dire. Mais voici une explication simple, réductive, mais qui vous donne un aperçu de ses fonctions :
- Un microcontrôleur prend quelque chose en entrée
- Il prend une décision par rapport à un programme que vous avez entré dans sa mémoire
- Il va produire un résultat en sortie
Mais les plateforme actuelles basées sur des microcontrôleurs (comme l’Arduino) sont de véritables petits ordinateurs prenant des tas d’entrées possibles, dialoguant entre eux par wifi, affichant des éléments sur des écrans LCD, etc. Les programmes peuvent être relativement complexes… Mais ce n’est pas le but en réalité !
Même si les microcontrôleurs sont relativement puissants et qu’on peut les travestir en ordinateur, le but est normalement d’être des interfaces autonomes qui délègue aux ordinateurs plus complexes les tâches de calculs. Une autre façon de voir les choses, c’est de considérer les microcontrôleurs comme des périphériques de vos PC. Vous souhaitez mesurer en temps réel la température et l’humidité de votre serre et déclencher un arrosage. Parfait, le microcontrôleur s’en chargera. Mais vous pouvez aussi lui confier la tâche d’envoyer périodiquement par wifi les données relevées à un ordinateur qui va analyser en logique flou le cycle des variations et commander au microcontrôleur des arrosages plus « intelligents ». J’espère que vous comprenez où je veux en venir. Analyser un signal vidéo et faire de la détection de mouvement, c’est déjà limite pour un microcontrôleur (même si certains sont très puissants – leur prix l’est également). Mais faire une analyse des visages avec reconnaissance faciale vous demanderait d’étoffer sérieusement le kit de développement de votre microcontrôleur !

Comment ça fonctionne ?
Pour ce tutoriel, nous discuterons plutôt de logique digitale. Mesurer une température, c’est mesurer un signal analogique. La logique digitale s’attaque plus à des Vrai/Faux (+5V/0V). Quand le signal mesuré (ou émis) est de 5V, on dit qu’il est « HIGH » (signal HAUT). Et quand il est « LOW » (Bas), alors il est à 0V. Pas de variation donc entre 0 et 5V, on ne mesure qu’une information binaire (0 ou 1).
Si vous connectez un bouton sur une ligne qui émet 5V et branchée sur une entrée numérique de votre microcontrôleur, alors vous allez mesurer un LOW en temps normal et un HIGH quand vous pressez le bouton.
Jetons un œil sur le processeur lui-même
Nous allons utiliser un ATmega168 (oui, je sais, on le trouve sur l’Arduino ;o). C’est une puce vraiment puissante, et très accessible financièrement.
Le brochage (pinout) ci-dessus montre ce que chacune des 28 broches sur la puce fait : Ces dernières ont souvent plusieurs fonctions. Les broches les plus communes sont :
- VCC, GND : +5V et la masse (Ground)
- AVCC, AGND : Il s’agit de l’alimentation du port A et du convertisseur Analogique Numérique (CAN). On peut le brancher sur une alimentation externe ou le brancher sur le VCC (en passant par un filtre low-pass c’est mieux).
- AREF : Le convertisseur A/D des uc ATMEGA accepte des signaux compris entre 0V et AREF. Pour fixer AREF, il y a 3 possibilités : soit AREF est choisi égal à une référence interne de 1V pour les Mega48/88/168 et 2V pour le MEGA8, soit AREF est égal à la tension d’alimentation VCC, ou encore, soit AREF est fourni par un composant extérieur connecté à la pin AREF. Encore une fois, c’est un histoire de CAN.
Pour utiliser un microcontrôleur, l’important est de disposer d’une bonne source d’alimentation stabilisée. Des plateformes comme l’Arduino peuvent se brancher à presque n’importe quoi car elles ont été correctement protégées à cet effet, mais si vous utilisez directement le microcontrôleur, vous devez prendre garde à ne pas lui donner une alimentation de mauvaise qualité.
Les 8 broches commençant par « PD » correspondent aux 8 bits du port D (entrée/sortie numérique). Vous disposez donc de 4 ports (A,B,C,D) de 8 bits pour travailler. On appellera cela des registres. Si vous avez fait un peu de programmation assembleur, cela va vous rappeler des choses. Le tout est de comprendre qu’un processeur ne se programme pas en C++ ou en Java. Il ne se programme pas non plus en Assembleur ! Il se programme en langage machine : c’est en gros une série d’octets (8 bits) qui correspondent à un programme. Tantôt un octet correspond à une instruction (exemple: MOVA), tantôt à une valeur (exemple: 56). Ainsi l’instruction MOVA pourrait être de valeur 45 et signifier (bouge la valeur dans le registre A), et la séquence serait « 45 56″. C’est édulcoré, mais c’est comme cela qu’on programme un processeur. Mais ces registres servent également à mesurer directement des valeurs ou à écrire également. Imaginez que vous avez 8 Leds et que vous voulez allumer la 3ième, la 4ième et la 8ième. Si vous les branchez sur le port A (de A0 à A7), vous pourrez envoyer la valeur 140 (10001100 en binaire). Vous comprenez pourquoi on dit que les broches ont plusieurs fonctions !
Vous trouverez plus d’informations sur ce processeur à cette adresse.
Programmation
Les microcontrôleurs de nouvelle génération ATMEGA peuvent être programmés de différentes façons :
- programmation « à l’ancienne » par un programmateur parallèle
- programmation ISP
- programmation par bootloader via la RS232
- programmation et débogage via la sonde JTAG
Ces caractéristiques sont maintenant devenues classiques chez les autres constructeurs. Par contre ATMEL fournit gratuitement son logiciel de développement avrstudio capable de :
- compiler un programmer en assembleur
- programmer avec avrprog ( in faut au préalable programmer le bootloader dans le
- microcontrôleur)
- simuler un programme
- débugger un programme par sonde JTAG avec 3 points d’arrêt hardware insérable.
Ne vous inquiétez donc pas, on ne vous demandera pas forcément de travailler en langage machine. C’est d’ailleurs tout l’intérêt de ces microcontrôleurs : ils disposent de fantastiques kit de développement, avec des compilateurs dans différents langages, des librairies qui traitent les chaines de caractères, les entrées-sorties, etc, jusqu’aux interfaces matérielles (écrans LCD, port ethernet, etc.).
L’ATmega168 est un microcontrôleur programmable et programmable à souhait ! Il a une mémoire interne de 16 Ko (c’est 4 fois moins que les vieux Amstrad CPC 464), ce qui peut paraitre faible, mais cela répond à de très nombreux besoins. Et on peut lui greffer une mémoire externe, mais cela fera l’objet d’autres articles.
Faites vos devoirs !
Vous voulez apprendre, ne vous contentez pas de lire. D’ailleurs, pas de vidéo pour ce tutoriel, il vous faudra le faire par vous même ! Il y a tant de différences entre la théorie et la pratique que si vous voulez vraiment connaitre ce microcontrôleur, vous devrez essayer. En attendant, rien ne vous empêche de lire la suite ;o)
Pour continuer, vous allez avoir besoin d’un ordinateur (comme c’est pratique, vous en avez un devant le nez – élémentaire mon cher Watson), qu’il soit sous Windows, Linux ou Mac, peu importe. Vous allez devoir installer des logiciels.
Le compilateur : L’AVR est doté d’une architecture RISC (peu d’instructions, mais souvent plus rapide ou moins cher). Mais nous utilisons une architecture plus complexe (CISC) avec nos ordinateurs. Nous allons donc utiliser un compilateur multiplateforme (cross-compiler) :
Autres logiciels :
- Il vous faut le programmateur : AVRdude. Selon les installations, vous l’avez probablement déjà installé. Il fonctionne en ligne de commande. Si vous utilisez un studio de développement, il sera intégré. Sinon, vous pouvez le télécharger ici.
Que faire avec tout ça ?
Vous pouvez déjà vous amuser avec le simulateur. Il y a de nombreux exemples disponibles sur internet, mais vous pouvez aussi étudier des projets complets.
Vous pouvez aussi utiliser une carte intégrant un tel composant (comme l’Arduino), ce qui vous délestera de la tâche difficile de mettre en place une alimentation et toutes les sécurités nécessaires. Mais c’est probablement durant cette mise en place que vous en apprendrez le plus.
Vous pouvez aussi installer les éléments nécessaires au hardware (alimentation, etc.) et réaliser correctement le brochage. L’équivalent du programme « Hello World » pour un microcontrôleur c’est de faire clignoter une LED. Cela nécessite un programme ! Il était pour moi important que vous soyez familiarisé avec ce microcontrôleur. En effet, quand on travaille sur l’Arduino, on masque une bonne partie du fonctionnement de la plateforme. Travailler sur le microcontrôleur, c’est revenir aux sources en quelque sorte. J’ai choisi l’ATmega168 pour qu’il vous soit familier car il est couramment utilisé sur l’Arduino.
Sources :