mardi 11 mai 2010

Comment démarrer avec un AVR? Les outils de programmation

   Lorsque l'on veut se lancer dans la programmation d'un microcontrôleur particulier, il arrive le moment fatidique ou il faut se lancer et "griller" son programme dans la puce.

 Souvent, on se pose la question de savoir quelle interface utiliser, avec quel programme, avant de se poser la question de savoir ce qu'il faut réellement inscrire dans le composant pour que ce montage fonctionne comme prévu.. 

Je vais tenter dans cet article de répondre à ces 3 points concernant les AVR.
Je n'ai pas la prétention d'être exhaustif tellement il existe de solutions diverses et variées, mais au moins de présenter quelques interface et quelques logiciels à portée de l'amateur.

L'interface de programmation

Tous les AVR possèdent différents modes de programmation plus ou moins adaptés selon la situation et le montage à réaliser:

- la programmation in-Situ ou ISP
C'est de loin le mode de programmation le plus simple et le plus répandu.
Sauf 1 ou 2 cas très particuliers, tous les AVR acceptent ce mode de programmation. Il utilise pour cela 4 broches du microcontrôleur, le Reset et généralement MOSI, MISO et SCK, les broches dédiées au port SPI. 

Il convient toutefois de vérifier cela dans la datasheet du microcontrôleur à programmer. En effet, l'atmega128 utilise le second port SPI pour la programmation et on peut facilement se tromper. Ca n'est pas bien grave....mais ça ne marche pas et il faut ressortir le fer à souder ou revoir le typon pour router correctement les signaux.

Comme son nom l'indique, ce mode de programmation permet de programmer le composant sur son montage final. Atmel a instauré un standard de connecteur à 6 broches (les 4 signaux et l'alimentation) que 99,9% des programmateurs respectent. Prévoyez simplement un bout de barette sécable 2 rangées au pas de 2,54mm et votre composant est prêt à être programmé.

- la programmation parallèle

C'est la méthode de programmation de grand-papa (ou de certains concurrents jusqu'à il y a peu).

Celle-ci monopolise une grande partie des broches du microcontrôleur et requiert une haute tension (tout est relatif, il s'agit de 12V) à envoyer à l'AVR.

Cette programmation implique tout d'abord de pouvoir extraire le composant de son montage pour le mettre sur le programmateur. C'est donc une programmation à réserver aux composants montés sur support ou à une programmation avant soudure.

Personnellement, je n'ai jamais eu affaire à ce type de programmateur. Il a cependant un intérêt pour les plus petits des AtTiny. En effet, la programmation ISP requiert que la broche Reset soit disponible pour entrer en mode programmation. Cependant, sur certains modèles, il est possible de la désactiver pour l'utiliser comme GPIO. Seule la programmation parallèle peut effectuer cette opération.

Cela est assez logique, car demander  à la programmation ISP de désactiver le Reset reviendrait à vous 
demander de scier la branche sur laquelle vous êtes assis.


- la programmation JTAG

Ce mode est réservé aux plus gros modèles de la gamme, à partir de 40 broches.
Plus qu'un mode de programmation, le JTAG est également une interface de débuggage extrêmement pratique pour chercher l'erreur dans un programme.
Tout comme la programmation ISP, la programmation JTAG peut être désactivée pour pouvoir utiliser les broches dédiées dans un montage. Atmel a fait les choses assez bien dans ce domaine puisqu'une interface de programmation ne peut pas se désactiver elle-même, ce qui évite de rendre un composant inutilisable par une fausse manip'.

- la programmation DebugWire

Dernière-née des interfaces de programmation, c'est la plus pratique. En effet, elle ne requiert qu'une broche, le Reset pour programmer et débugger l'AVR.
Hélas, et pour des raisons obscures, Atmel a gardé ce protocole propriétaire et il faut impérativement acheter un programmateur certifié pour l'utiliser. 

Le matériel de programmation

Vous trouverez beaucoup de programmateurs d'AVR comportant comme coeur.....un AVR. Mais alors comment programmer cet AVR? Avec un programmateur pardi. Avant que vous ne partiez découragés devant le dilemne de l'oeuf et de la poule appliqué à l'électronique, sachez qu'il est possible de se fabriquer un programmateur d'AVR à partir d'une poignée de composants que tout amateur d'électronique se doit de posséder ou au pire n'aura aucun mal à se procurer.

- Le programmateur sur port parallèle

C'est le premier programmateur que tout débutant en AVR se doit de posséder. A la base, Atmel en fournissait un dans son kit de développement STK200. C'est pourquoi la plupart de ces programmateurs sont compatibles avec ce vénérable ancêtre. Bien qu'il soit sur port parallèle, c'est un programmateur ISP. 
En tout et pour tout, ce programmateur qu'un circuit intégré et quelques composants passifs. Il est donc réalisable avec un investissement minimum, soudé sur une plaque d'essai voire même en soudant à la volée les 
 composants pour les plus téméraires.

Bien que le port parallèle ait disparu de l'arrière de nos PC, il est bien souvent disponible à l'intérieur du PC, sous forme d'un connecteur HE-10. Il est alors possible d'acheter un adaptateur pour avoir la subd-25 à l'arrière du PC ou de se raccorder directement sur la carte-mère. 
Pour les possesseurs de portables par contre, vous pouve tout de suite oublier ce modèle. Bien qu'il existe de très rares convertisseurs USB-parallèle, ceux-ci se contentent bien souvent d'émuler le strict nécessaire pour faire fonctionner une imprimante, et rien de plus.

- le programmateur série Ponyprog

Encore une fois, c'est un programmateur ISP, uniquement compatible avec le logiciel Ponyprog. Bien que les schémas présents sur le site de l'auteur soient un peu trompeurs, celui-ci fonctionne avec la plupart des AVR. Il suffit simplement de relier les signaux du connecteur de sortie à 10 broches aux broches correspondantes de l'AVR.
Ce programmateur a le défaut de tirer son énergie du port série, ou d'une alimentation externe. Dans le premier cas, cela risque de ne pas fonctionner, les constructeurs étant relativement peu scrupuleux de la norme RS-232 (qui fixe les niveaux électriques du port série). Dans le second cas, cela implique de monopoliser une prise de courant uniquement pour un programmateur qui ne consomme pas grand-chose. 
Quoiqu'il en soit, je considère personnellement ces deux programmateurs comme des points de départ vers un modèle plus évolué, tel que ceux que nous allons maintenant découvrir

- le programmateur ISP AVR910

Ce programmateur est entièrement documenté dans une application note d'Atmel, l'AVR910. Il en existe des tas de variantes plus ou moins similaires. Celui-ci ne comporte que deux composants majeurs, un AVR et un convertisseur de niveau MAX232 ou équivalent.
Le MAX232 sert juste de relais entre les signaux RS-232 du port série et les signaux TTL de l'AVR. Ce dernier reçoit des ordres du PC au format série et les re-transcrit en commandes SPI pour la programmation de l'AVR-cible.
Voilà pourquoi il est important de disposer d'un des deux programmateurs ci-dessus. Pour pouvoir programmer l'AVR du programmateur. Remarquez qu'il est bien sur possible d'acheter un programmateur compatible AVR910 un peu partout et qu'il est même de bon ton d'en choisir un dôté du port USB. Sur ces derniers, le MAX232 est "remplacé" par un convertisseur USB-série de type FT232 ou CP2102.

- les clones d'AVR-JTAGICE

L'AVR-JTAGICE pour AVR-JTAG In Circuit Emulator est un programmateur USB ou série vendu il y a quelques années par Atmel, mais heureusement toujours d'actualité.

Il a, à la base, le mauvais goût d'être totalement inabordable. Atmel, comme beaucoup d'autres constructeurs (Altera, Lattice, pour ne citer qu'eux) a choisi de vendre son matériel hors de prix. L'AVR-JTAGICE se négociait autour de 300 euros, le rendant non seulement inaccessible aux programmateurs amateurs, mais également aux petites entreprises soucieuses de ne pas dépenser trop dans des outils de développement susceptibles de ne pas être immédiatement rentabilisés.

Ce choix de l'offre officielle onéreuse est à mon avis une redoutable erreur, non seulement de la part d'Atmel mais des autres fondeurs qui pratiquent cette politique. A quoi bon vendre aussi cher un programmateur qui finalement ne comporte pas grand-chose en interne puisque de toutes façons, les clients qui l'achètent achèteront des microcontrôleurs de la marque ensuite. Microchip a bien compris cette évidence en bradant ses kits de développement.

A la décharge d'Atmel, il faut bien admettre qu'un JTAG-ICE surpasse, et de loin, les possibilités d'un debugger Microchip. Le débogage se fait sur le programme réel, les breakpoints ne surchargent pas la pile, et il est possible de lire ou écrire n'importe quel registre interne de l'AVR à tout moment.

Il y a quelques temps, les clones de JTAG-ICE ont fait leur apparition, et il faut bien admettre que les logiciels de programmation n'y voient que du feu. Le clone est reconnu comme un programmateur officiel et accepte même les mises à jour de firmware de l'original.

Comme je l'ai dit plus haut, le JTAG est réservé aux gros modèles de la gamme. Pour un projet complexe, il est d'une aide extraordinaire pour finaliser un programme. 

J'ai construit mon premier clone car je bloquais sur un point particulier. Tout semblait bien fonctionner sur le papier et en simulation, mais arrivé sur la maquette, mon afficheur 7 segments clignotait désespérément, rendant la lecture de mon chronomètre très désagréable. En seulement quelques minutes, et en exécutant mon programme en pas-à-pas sur le montage, j'ai enfin découvert le bug qui m'échappait depuis si longtemps. La variable qui déterminait le digit à afficher comptait un pas trop loin, provoquant à chaque cycle l'extinction de tout mon afficheur et faisant écrouler mon joli multiplexage.

 Au niveau hardware, le clone de JTAG-ICE n'est pas plus compliqué qu'un AVR910, un convertisseur RS232-TTL et un AVR. La distinction se fait sur les signaux de sortie et sur la taille de l'AVR et du programme interne.

Il est possible de trouver assez facilement des schémas de programmateurs "universels", assurant à la fois la programmation ISP et l'accès JTAG. Je les trouve néanmoins inutilement complexes, puisqu'ils comportent en général un AVR pour chaque tâche, autant avoir deux programmateurs indépendants.

Les logiciels de programmation

Ici encore il y a l'embarras du choix. A défaut d'être exhaustif, voici les logiciels majeurs pour programmer un AVR. Je parle ici simplement du fait de transférer un programme déja compilé vers un  AVR ainsi que la configuration hardware. Les outils pour développer son propre programme feront l'objet d'un prochain tutoriel.

L'environnement de développement officiel, AVR studio (sur lequel nous revindrons également) propose  un programmateur intégré. Normalement, vous ne devriez avoir besoin que de celui-ci. J'ai tout de même rencontré des problèmes pour faire fonctionner un programmateur AVR910 avec. J'ai découvert récemment qu'il pourrait s'agir d'un problème bénin. Dès vérification de la solution potentielle, je ne manquerai pas de corriger ce tutoriel.

Pour les mordus de l'OpenSource,  le plus connu des logiciels de programmation est avrdude. Il s'agit d'un outil à l'ancienne, en ligne de commande. Pour un débutant, ce n'est pas toujours le plus simple. Fort heureusement, il existe des interfaces graphiques qui viennent se greffer par dessus l'outil en ligne de commande pour le rendre plus user-friendly. AvrDude s'utilise avec l'un ou l'autre des programmateurs décrit ci-dessus, à l'exception de celui de PonyProg

Ponyprog justement, permet également de programmer des AVR. Son avantage est de proposer une interface quasi-universelle de programmation. Par contre, il faudra monter un petit convertisseur de la sortie du Ponyprog vers le connecteur 6 broches de programmation. L'utilisation de ce connecteur n'est nullement obligatoire, mais elle vous simplifiera grandement la vie.

L'option bootloader

Certains AVR disposent d'un bootloader. Kesako?

Le bootloader est une section particulière du code qui permet de reprogrammer un AVR sans passer par une interface spécialisée. L'entrée dans le bootloader se fait grâce à une condition d'entrée particulière, qui peut être une commande particulière sur le port série, ou plus simplement le maintien d'un bouton appuyé au moment du Reset. C'est à vous de déterminer cette condition d'entrée.

A partir de là, le microcontrôleur est en mesure d'exécuter deux instructions particulières de son assembleur, à savoir SPM et LPM, qui permettent de lire et d'écrire la mémoire Flash, là ou est situé le programme.
L'utilisation du bootloader est particulièrement intéressante pour des systèmes devant être reprogrammés fréquemment et facilement. De plus, l'utilisation du bootloader permet de s'affranchir du connecteur de programmation, et de proposer une interface légère pour programmer le microcontrôleur

Quoiqu'il en soit, un programmateur sera tout de même nécessaire pour programmer le bootloader lui-même.

Concrètement, que programme-t-on sur un AVR?

Au maximum, il y a 4 "zones" mémoire à programmer sur un AVR:
- la mémoire Flash qui contient le programme
-l'EEPROM qui fait office de moyen de stockage souple, par exemple pour des paramètres utilisateur
- les Fuse bits qui permettent de configurer les modes de fonctionnement de l'AVR
- les Lock bits qui permettent de protéger le code d'une lecture ou d'une ré-écriture.

Même si il est possible, sur des applis simples, de ne programmer que la Flash, le moment de programmer les Fuse bits arrivera vite. En effet, ceux-ci s'avèrent vite primordiaux pour obtenir le comportement attendu de l'AVR. En reprenant un programme pré-compilé sur l'Internet, il faut toujours s'assurer que la personne qui met à disposition ce fichier mette aussi à disposition la configuration des fuse bits. 

Selon le modèle d'AVR, les fuse bits sont plus ou moins nombreux et permettent le réglage de plus ou moins d'options.

Parmi les plus courants, nous trouverons:
- CLKSEL: ces bits permettent de choisir le type d'horloge utilisé pour cadencer l'AVR, interne, externe, quartz ainsi que la vitesse pour le mode interne ou la gamme de fréquence de l'éventuel quartz externe. Par défaut, l'AVR fonctionne avec l'horloge interne à 1 MHz

- JTAGEN et ISPEN: comme leur nom l'indique, ces bit permettent d'activer l'interface de programmation correspondante. Le JTAGEN est particulièrement utile car il permet de libérer 4 broches du microcontrôleur si l'interface n'est pas utilisée.

- WDEN: ce bit permet d'utiliser ou non le watchdog.

- BODEN: idem pour la détection de sous-tension (Brown-Out Detector)
Il y en a bien d'autres, plus ou moins nombreux selon la référence. Consultez la datasheet pour leur description.

La mémoire EEPROM peut être considérée comme une mémoire utilisateur. Elle sera pratique pour stocker des données qui pourront être modifiées au cours de la vie du programme. 

Prenons l'exemple d'un système qui pilote des potentiomètres numériques, par exemple pour un pré-ampli audio. Quand vous redémarrez votre ampli, vous préfèrerez sans doute qu'il retrouve ses réglages d'avant mise en veille, pour ne pas avoir à tout re-régler avant d'écouter Britney Spears (c'est qu'un exemple hein, je ne vous force pas).

Dans ce cas, lorsque l'ordre de mise en veille arrivera, vous demanderez à l'AVR de mémoriser les positions courantes des potentiomètres dans l'EEPROM pour les restaurer au démarrage.

Enfin, les lock bits. Dans le cadre de développements personnels, vous n'en aurez pas besoin.
Ils prennent toute leur importance dans le cadre de développements pro que vous ne voudriez pas voir copiés. En effet, comme leur nom l'indique, les lock bits permettent de verrouiller les zones d'applicaton et de bootloader. 
Les différentes configurations permettent de limiter la lecture ou l'écriture de ces deux zones selon les valeurs choisies.

Conclusion

J'espère que ces infos vous auront aidé à y voir plus clair. Comme je l'ai dit, j'a omis des informations volontairement pour ne pas noyer les débutants sous un flot d'informations qui ne feraient que décourager la plupart.

Dans un prochain tutoriel, nous verrons comment écrire un programme simple pour aVR, en assembleur, et en C, toujours dans l'optique low-cost et facile d'accès.



1 commentaire:

  1. Bonjour,
    Je vous cite mon expérience perso avec l'AVR.
    J'ai commencé avec un programmateur AVR parallèle fait uniquement avec 5 résistances, aucun circuit intégré, ni alim externe et qui est géré par le soft Ponyprog (eh oui, celui-ci ne fonctionne pas qu'avec un bouchon série). Ca marche très très bien et ça m'a coûté 10 cents (le plus long avait été de savoir que ce genre de solution existe !). Vous pouvez même virer les résistances et faire un programmateur juste avec un connecteur sur le port // !

    J'ai joué pas mal avec ce programmateur sur des micros ATTiny puis sur ATMEga, tous acheté sur eBay. J'ai pu dénicher un lot de 100 (!) AtTiny 15 en CMS 8 broches, composant obsolète mais qui est génial pour faire des petites bricoles en assembleur. Niveau puissance & périphérique, il laisse sur place les PICs, il y a juste son convertisseur ADC (avec ampli x 20 interne svp!) qui est un peu bruité.

    Ensuite, j'ai flashé le bootloader sur des ATMega8 et ATMega16 pour créer des Arduino-à-moi avec mon programmateur parallèle à 10 cents. J'ai recompilé qq bootloader pour avoir les options oscillateur interne (2, 4, 8Mhz)=> plus besoin de quartz pour mon Arduino.
    Et j'ai profité du programmateur 10 cents pour flasher aussi le programmateur opensource USBASP (deuxième programmateur de chips Atmel donc)
    C'est un programmateur qui utilise un ATMega8 + qq composants passifs (diodes, quarz), qui se branche directement sur un port USB et qui permet la programmation ISP de n'importe quel uP Atmel. Le soft utilisé avec ce programmateur est avrdude (évoqué par l'auteur ci-dessus) utilisé dans une fenêtre DOS, c'est le plus pratique : les interfaces graphiques d'avrdude oblige à cliquer plein de fois alors que dans une fenêtre dos, il suffit de faire Alt+Tab puis return pour flasher un uP !

    Mon programmateur n°2 m'a donc coûté environ 40x plus cher que le n°1, soit 4€, le prix de l'Atmega8 ;) Le gros avantage est qu'il fonctionne sur l'USB donc sur mon portable et je n'ai plus besoin du port // sur mon vieux desktop bruyant. L'autre avantage du port USB est que je peux alimenter mes circuits directement avec son 5V, mine de rien, c'est pratique à l'usage.

    Niveau soft, j'utilise le compilateur C Gcc gratuit et l'assembleur & IDE AVR Studio.

    Voilà voilà, je vous ai expliqué un peu en vrac mon cheminement avec les uP Atmel, comment j'ai constitué une chaîne de développement qui ne coûte presque rien.

    Ah j'oubliais, j'ai commencé le PIC il y a 10 ans, en assembleur, puis avec le compilateur C HT-PIC. J'utilise encore les PICs mais pas sur des nouveaux projets, les AVR d'Atmel, c'est quand même nettement mieux, tant en terme d'outils de dév que puissance du uP !

    Le seul avantage du PIC, c'est que je peux "debugguer" les chips in-situ avec leur programmateur (c'est un peu usurpé, vu toutes les limitations du debugger !), ce que je ne peux pas faire avec les AVR, pour l'instant.

    Maintenant que j'apprends qu'on peut se construire un clone de JTAG-ICE, je vais peut-être m'y mettre. Si l'auteur du blog pouvait mettre un tutos détaillé sur ça, ce serait super !

    RépondreSupprimer