Skyduino:~#
Articles
tutoriel

[Tutoriel] Avrdude en ligne de commande

Bonjour à tous !

Aujourd’hui je vous est préparé un tutoriel qui va vous faire froid dans le dos, nous allons utiliser … la console ! (*FX: cri strident*)
La console n’est pas réservé aux « hackers », avec des lignes de caractères vert sur fond noir comme dans matrix.
C’est un outil extrêmement puissant que toute personnes touchant à l’informatique moderne doit savoir maitriser.

Je ne vais pas vous faire un cour sur comment utiliser la console, ni même vous apprendre à faire des scripts shell/bash ou des « makefile », pour ce tutoriel nous allons nous concentrer sur un sujet bien plus intéressant d’un point de vu « DIY ».
Nous allons utiliser la console en complément du logiciel avrdude pour programmer un micro-contrôleur (un ATmega1284p) avec un programme généré par l’IDE arduino (équivalent « bas niveau » de l’upload sur l’IDE arduino).

L’intérêt de savoir programmer un µc sans utiliser l’IDE arduino ?
Tout simplement de pourvoir un jour migrer vers des solutions « non arduino », ou alors « sauver » une carte arduino en cas de bug du bootloader.

Avant de commencer

Utilisateurs de windows, voici les liens d’installations de winAvr et MinGw :
http://winavr.sourceforge.net/download.html
https://sourceforge.net/downloads/mingw
Winavr contient le programme avrdude et minGW vous permettra d’utiliser des commandes console « unix » sous windows (vous verrez cela vous simplifiera la vie ;)).

Utilisateurs de linux ou *nix il vous faudra installer le paquet avrdude depuis les dépôts de votre distribution.

Pour les utilisateurs windows du programmateur « AVR Pocket » de sparkfun voici mon driver maison compatible windows vista/seven 32b et 64b :
Lien Google Documents

Pour les amis du manchots, comme toujours la vie est belle, vous n’aurez aucun drivers à installer ^^

Le matériel

Tout d’abord contrairement à un « upload » classique avec le bootloader arduino, nous allons ici utiliser un programmateur d’avr, dans mon cas un « AVR Pocket » de sparkfun.

Il va aussi falloir un câble de programmation ISP (ou ISCP)

Petit Bonus/Astuce, la breakout AVR de sparkfun, elle permet de convertir un câble ISP 10 broches vers un câble 6 broches ou vers un simple connecteur SIL pouvant être facilement câblé sur une breadboard, dans mon cas elle me sera utile pour minimiser mon câblage.

J’ai choisi comme carte « cible » une carte que j’avais fabriquer il y a déjà quelque temps, à l’époque ou je ne possédai pas encore de carte arduino

Pourquoi cette carte et pas une carte arduino ?
Tout simplement parce que j’ai bricoler les bootloaders de mes cartes arduino, que je n’est plus les .hex et que je ne veux pas les bricker en faisant une mauvaise sauvegarde 😉
Cette carte est basé sur un micro-contrôleur ATmega1284p, c’est en quelque sorte une version DIY de l’arduino « sanguino ».

Le câblage

La carte que j’avais fabriquer avait été pensé pour être facilement programmer que ce soit avec un bootloader série ou un programmateur ISP via la breakout AVR, le câblage est donc très simple.



Astuce : Comment savoir de quel coté du détrompeur brancher le câble.

Souvent sur les cartes possédant une connecteur ISP (sans corps plastique pour le détrompeur) se trouve un point ou un trais désignant le coté ou doit se trouver le détrompeur.

Avrdude

Avrdude est un programme permettant de programmer des micro-contrôleur AVR ainsi que d’autre micro-contrôleur utilisant un bootloader compatible.
Avrdude est utilisé par l’ide arduino lors de l’upload d’un skecth pour transmettre le programme à la carte arduino.

Pourquoi utiliser avrdude seul ?
Soyons franc il n’y a pas que arduino dans la vie, à un moment ou à un autre vous vous rendrez compte que le « core » arduino est trop limité et vous serez obligez d’utiliser du c « pure », soit sur une carte arduino, soit sur une carte fait maison.
C’est à ce moment que avrdude et avr-gcc rentre en jeu, avr-gcc permet de compiler votre programme, programme qui sera transformer en un fichier .hex contenant les instructions binaires de votre programme.
Pour programmer votre micro-contrôleur avrdude prendra en entré ce fichier .hex et l’enverra dans la mémoire flash du micro-contrôleur.
Avrdude est aussi capable de programmer la mémoire eeprom, les fusibles et calibrer les oscillateurs interne des micro-contrôleur avr.

Les arguments d’avrdude
Ouvrons d’abord une console (programmes -> MinGW shell sous windows ou ctrl+alt+t sous linux), puis entrant la commande « avrdude » pour vérifier le bon fonctionnement de notre installation.

skywodd@SkyLaptop ~
$ avrdude
Usage: avrdude.exe [options]
Options:
-p Required. Specify AVR device.
-b Override RS-232 baud rate.
-B Specify JTAG/STK500v2 bit clock period (us).
-C Specify location of configuration file.
-c Specify programmer type.
-D Disable auto erase for flash memory
-i ISP Clock Delay [in microseconds]
-P Specify connection port.
-F Override invalid signature check.
-e Perform a chip erase.
-O Perform RC oscillator calibration (see AVR053).
-U :r|w|v:[:format]
Memory operation specification.
Multiple -U options are allowed, each request
is performed in the order specified.
-n Do not write anything to the device.
-V Do not verify.
-u Disable safemode, default when running from a scrip
t.
-s Silent safemode operation, will not ask you if
fuses should be changed back.
-t Enter terminal mode.
-E [,] List programmer exit specifications.
-x Pass to programmer.
-y Count # erase cycles in EEPROM.
-Y Initialize erase cycle # in EEPROM.
-v Verbose output. -v -v for more.
-q Quell progress output. -q -q for less.
-? Display this usage.

avrdude version 5.10, URL:

skywodd@SkyLaptop ~
$

Avrdude est bien installer et prêt à être utilisé !

Maintenant intéressons nous aux arguments de avrdude, les arguments sont des paramètres venant modifier le comportement de la commande, ici avec avrdude, seul un certain de ces arguments (ou options) listé si dessus nous intéresses.

-p Required. Specify AVR device.
Permet de définir le micro-contrôleur que l’on souhaite programmer, paramètre obligatoire.
Astuce: les nom telle que atmegaxxxxxxx peuvent être écris en mxxxxxxx, exemple atmega328p -> m328p.

-b Override RS-232 baud rate.
Permet de définir la vitesse du port série, utile uniquement lors de l’utilisation d’un bootloader série (comme le bootloader arduino).

-C Specify location of configuration file.
Permet de choisir un fichier de configuration (avrdude.conf) différent de celui de base, utile sur les systèmes *nix pour cibler des micro-contrôleur récent.

-c Specify programmer type.
Permet de choisir le programmateur ou le bootloader à utiliser, paramètre obligatoire.
Exemple de programmateur « commun » :
usbtiny (avr pocket de sparkfun), ponyser (programmateur DIY sur port rs-232 (aka ponyprog), usbasp, avrisp, …
Exemple de bootloader « commun » :
arduino (no comment), stk500, stk500v2 (arduino mega2560), …

-P Specify connection port.
Permet de choisir le port série à utiliser lors de l’utilisation d’un bootloader série, ou le périphérique FTDI à utiliser dans le cadre d’une programmation « bitbang ».
(Au sujet de la programmation « bitbang » je vous conseil de lire ce très bon topic du forum arduino.cc : http://arduino.cc/forum/index.php/topic,78754.0.html)

-e Perform a chip erase.
Permet d’effacer la mémoire du micro-contrôleur.

-n Do not write anything to the device.
Ce paramètres fait entrer avrdude en mode « lecture seul », si vous travailler sur une carte « sensible » que vous ne souhaiter pas bricker, ce paramètre empêchera avrdude de faire quoi que ce soit pouvant modifier la mémoire du micro-contrôleur.

-V Do not verify.
Permet de passer la phase de vérification après la phase de programmation, de fait des erreurs de programmation peuvent avoir était commise, à utiliser avec précaution.

-v Verbose output. -v -v for more.
Permet d’afficher les messages de « debug » d’avrdude, utile lorsque la programmation ne marche pas et que avrdude « de base » n’affiche pas d’erreur.

-U :r|w|v:[:format]
Memory operation specification.
Multiple -U options are allowed, each request
is performed in the order specified.

Il s’agit de l’option la plus importante, elle permet d’exécuter une action sur le micro-contrôleur, cela peut être une écriture, une lecture ou une vérification.
memtype peut prendre les cibles suivante : flash (mémoire contenant le programme), eeprom, lfuse, hfuse, efuse.
r, w, v correspondent au action r -> read = lecture, w -> write = écriture, v -> verify = vérification.
filename correspond au nom du fichier .hex à utiliser pour l’action choisi, ce fichier doit ce trouver dans le répertoire de travail courant.
Dans le cas d’une lecture le fichier sera automatiquement crée, ou sur-récrit si déjà existant.

Exemple de ligne de commande avrdude AVEC un bootloader arduino (ici une carte arduino uno)
avrude -p m328p -c arduino -b 115200 -P COM4 -U flash:w:Blink.hex

Exemple de ligne de commande avrdude SANS bootloader, via un programmateur AVR Pocket
avrdude -p m1284p -c usbtiny -U flash:w:Blink.hex

Bien maintenant vous devriez pouvoir vous essayer à la programmation avrdude sans trop de problémes, comme vous pouvez le voir la console et les programmes CLI (command line interface) sont trés puissant, bien que un peu complexe parfois, ce que vous pourriez faire avec avrdude-gui par exemple n’est rien par rapport à ce que vous pourriez faire « à la main » avec avrude en ligne de commande.

Seulement certains lecteurs curieux ont du remarquer que j’ai parlé de « fusibles » et dans l’option -U de efuse, lfuse et hfuse ^^

Qu’est ce que les « fusibles » ?
Tout matériels possèdent des paramètres de fonctionnement, que ce soit un perceuse et sa vitesse de rotation, un ordinateur et son bios, etc …
Il en est de même sur les micro-contrôleurs, seulement il n’y a pas de menu, de vis, de bouton ou autre pour paramétrer un micro-contrôleur.
A la place il y a ce que l’on appèle des « fusibles », ce sont des valeurs en hexadécimal (3 sur les AVR) qui joue sur l’architecture et le fonctionnement interne du micro-contrôleur.
Par conséquence un fusibles mal calculé empêchera le bon fonctionnement du micro-contrôleur, heureusement il existe des « calculettes » spécialisé dans ce domaine 😉

En faisant un petit tour sur les liens du guide arduino vous tomberai sur un site, référence dans le domaine du calcul de fusibles, engbedded.com

A – Commençons d’abord par choisir un micro-contrôleur, prenons par exemple un atmega328p, grand classique des cartes arduino.

B – Chaque micro-contrôleur AVR supporte 3 types d’horloge, interne (intégré au µc, souvent un pont RC (condensateur / résistance), externe (générateur de signal, …) ou « crystal » (un quartz).
Le choix « crystal » est le plus répandu, sur la plus pars des cartes arduino il s’agit d’un quartz à 8 ou 16Mhz.

C – Chaque type d’horloge est caractérisé par une plage de fréquence de fonctionnement, à choisir suivant son application / montage.

D – Chaque type d’horloge est aussi caractérisé par un « start-up timer » ou « temps de démarage », celui ci est spécifié en nombre de cycle d’horloge + n millisecondes, à choisir selon la qualité de son générateur d’horloge, un générateur peu précis au démarage demandera un temps de démarrage long, un oscillateur à quartz au contraire demandera un temps très court avant de ce stabiliser.

E – Dans certain cas il est intéressant de retrouver le signal d’horloge sur la broche PB0, de manière à pouvoir synchroniser plusieurs µc, cette options est la pour ça.

F – Il arrive parfois qu’une application demande un timming très précis ne pouvant ce permettre le moindre écarts dans la fréquence d’horloge, cette options permet de diviser par 8 la fréquence d’horloge en interne, fréquence / 8 => + de précision et – d’écart dans les timming, mais aussi moins de puissance de calcul.

G – Le « reset boot vector » informe le micro-contrôleur de la présence d’un bootloader, celui ci sera donc exécuté avant le programme principal en utilisant l’adresse de démarage spécifié en (H).

H – Permet de choisir la taille et l’adresse de démarage dans le cas de l’utilisation d’un bootloader, cette zone sera protéger contre les sur-écritures lors de l’envoi d’un nouveau programme via le bootloader.

I – Permet de ne pas effacer la mémoire EEPROM lors d’un cycle de programmation ISP, utile si celle ci contient des données « importante ».

J – Active le « watch dog » ou « chien de garde », celui ci calcul le temps d »exécution d’une série d’instructions et reset le µc si celles ci prennent plus de temps que prévu, utile pour éviter une boucle infini, mais peut aussi rendre votre programme inutilisable, à utiliser avec précaution.

K – Décocher cette options empêchera toute reprogrammation futur du micro-contrôleur, en d’autre terme, si vous avez fait une erreur dans votre programme il sera impossible de le reprogrammer, seul un programmateur spécialisé de type HVSP (high voltage serial programming) peut faire « sauter » ce fusible, avec un programmateur « normal » votre µc serait bon à jeter.

L – Active le SWD (serial wire debug), utile si vous voulez débugger votre programme via un debuggeur d’avr.
Ce genre de debuggeur coute très chère (>50€ pour l’avr dragon et >200€ pour le MKISP) et le protocole SWD est gardé secret par ATmel, donc pour le moment aucun debuggeur AVR « DIY » SWD n’existe.

M (reset disable) – Permet de « gagner » un broche digital en désactivant la broche « reset », attention c’est un cadeau empoissonné !! désactiver le reset empêche toute reprogrammation, et fera à coup sur bugger votre programme, c’est une erreur classique avec le ATtiny45/85 par exemple, on désactive le reset pour gagner un broche et catastrophe impossible de faire quoi que ce soit par la suite donc, à par si vous possédez un programmeur HVSP n’activez pas cette options.

M (brown-out) – Permet de stopper le programme du micro-contrôleur en cas d’une défaillance de l’alimentation, si l’alimentation descend en dessous d’un certain seuil (4.3, 2.7 ou 1.8v au choix) le programme sera stopper et le micro-contrôleur redémarré, très utile pour les application fonctionnant sur pile.

Une fois votre configuration vérifié et prête vous n’aurez qu’as cliquez sur le bouton « apply setting » et descendre en bas de page :

Sur la gauche se trouve les valeurs de fusibles « en clair », et sur la droite la ligne de commande « -U » avrdude correspondante (plusieurs -U peuvent être fait via une même commande avrdude ;)).

J’en est finit avec ce tutoriel sur avrdude, maintenant vous devriez pouvoir programmer vos micro-contrôleurs « à la main » sans être limiter par l’ide arduino 😉

Discussion

9 réflexions sur “[Tutoriel] Avrdude en ligne de commande

  1. bonjour
    je cherche une solution pour programmer ma carte ARDUINO mega 2560 avec FLOWCODE AVR
    il ya des tuto sur le web mais ca ne marche pas a tu une solution pour moi . super et merci pour ton site

    Publié par ben | 9 janvier 2012, 9 h 49 min
    • Je connais pas du tout Flowcode, je serais vraiment d’aucune aide sur le sujet.
      Essaye de voir si flowcode n’aurait pas une option pour générer un fichier .hex, si il y une option dans ce style tu n’aurait qu’as utiliser avrdude pour l’envoyer sur ton arduino.

      Publié par skywodd | 9 janvier 2012, 19 h 15 min
  2. sur OpenSuSe les terminaux s’ouvre avec las combinaisons de touches Ctrl+Alt+F1…F6 (il y a 6 terminaux CLI et 3 GUI au total sur OpenSuSe)

    Publié par yui | 20 mars 2013, 23 h 01 min
  3. pas cool l’hortographe 😦

    Publié par simon | 8 septembre 2013, 13 h 41 min

Rétroliens/Pings

  1. Pingback: ARDUINO by tionebertahcnom - Pearltrees - 9 décembre 2011

  2. Pingback: Avrdude | Pearltrees - 11 janvier 2016

  3. Pingback: Avrdude | Pearltrees - 11 janvier 2016

  4. Pingback: ATTiny - Arduino | Pearltrees - 11 février 2016

  5. Pingback: Avrdude | Pearltrees - 7 novembre 2016

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.