Comment programmer un microcontrôleur AVR d'Atmel

Introduction

Cette page explique comment programmer un microcontrôleur AVR avec la méthode ISP à 6 broches (In System Programming, ce qui veux dire programmation à même le circuit).

ISP 6 Pins pinout: avr_isp-pinouts.html


Concepts

  • Fichier hex: Un fichier hex (nommé ainsi car le nom fini souvent par .hex) contient généralement le programme qui sera exécuté par le microcontrôleur. C'est ce qu'on se trouve à storer dans le microcontroleur.
  • Fuse bits ou bytes: Les fuses (de l'anglais, Fuse, qui veux dire Fusible), servent à modifier certains paramètres du microcontrôleur, indépendamment du programme. Cela permet par exemple d'activer l'utilisation d'un cristal plutot que l'oscillateur interne, ou bien, empêcher le microcontrôleur de fonctionner si le voltage est trop bas. Il faut faire bien attention de ne pas se trompber lorsqu'on configure les fuses pour ne pas rendre le microcontrôleur inutilisable.


Outils

Il faut tout d'abord un cable ISP reliant l'ordinateur au microcontrôleur. Voici quelques options:
  • AVR ISP d'Atmel.
    C'est ce que j'utilise le plus souvent. Atmel fournissent un logiciel pour Windows nommé Avr Studio. Sous Linux, l'adaptateur est supporté par plusieurs logiciels tels que uisp et avrdude.
  • AVRISP mkII d'Atmel.
    Il s'agit d'une version USB d'AVR ISP. Le logiciel d'Atmel, Avr Studio, le supporte évidemment. Sous linux, cet adaptateur fonctionne très bien avec avrdude.
  • PonyProg.
    Cet outil peut reprogrammer certains microcontrôleurs AVR via un port parallèle (Shéma inclus).
Atmel AVR ISP

Atmel AVR ISP

Atmel ISP mkII

Atmel ISP mkII




Exemples

Exemples utilisant UISP:
Tout d'abord, sachez que /dev/avr est un lien symbolique vers le port série auquel l'adaptateur est branché (eg: /dev/ttyS0). Aussi, n'oubliez pas de changer l'argument -dpart pour votre MCU si vous utilisez autre chose qu'un ATmega8.

Programmation des fuses d'un atmega8:
# uisp -dprog=stk500 -dpart=atmega8 -dserial=/dev/avr --wr_fuse_h=0xc9 --wr_fuses_l=0x9f

Programmation d'un fichier hex dans un atmega8:
# uisp -dprog=stk500 -dpart=atmega8 -dserial=/dev/avr --erase --upload --verify if=n64_to_wii.hex
Notes: --erase pour effacer la flash AVANT de programmer le fichier hex. --verify permet de relire le contenu de la flash pour s'assurer qu'il n'y a pas eu d'erreurs.

Exemples utilisant AVRDUDE et un ISP mkII USB:

Programmation des fuses d'un Atmega8:
# avrdude -p m8 -P usb -c avrispmkII -Uhfuse:w:0xc9:m -Ulfuse:w:0x9f:m
Notes: l'option -p précise le type de microcontrôleur à programmer. Pour obtenir la liste, essayez 'avrdude -p list -P usb -c avrispmkII' (comme 'list' est un type invalide, avrdude liste tout les types supportés).

Programmation d'un fichier hex dans un atmega8:
# avrdude -p m8 -P usb -c avrispmkII -Uflash:w:n64_to_wii.hex -B 1.0
Note: L'argument -B permet de contrôler le rythme de l'horloge de programmation (en microsecondes). Cette fréquence ne doit pas dépasser le quart de celle de l'horloge du CPU.


Trucs et astuces

Voici quelques détails qui échappent souvent aux débutants:

  • Alimentation: Généralement, l'outil de programmation (comme ceux ci-dessus) n'alimentent pas le microcontrôleur à être programmé. Il faut donc mettre le circuit sous tension.
  • Horloge: Pour que la programmation soit possible, le micro-contrôleur a besoin d'une horloge fonctionnelle. Lorsque la puce AVR est neuve, en raison des valeurs de "fuses" par défaut, une horloge à circuit RC interne est active. Si vous programmez les fuses pour l'emploi d'un oscillateur à cristal, il faut donc que ledit cristal soit présent pour que les opérations de programmation successives réussissent.