Graver un bootloader sur ATMEGA328P-PU

Pour ceux qui programment sur Arduino, l’envie vient tôt ou tard de porter le montage hors de la carte Arduino pour des raisons de consommation, de place ou de coût. De nombreux conseils et tutoriaux existent et après m’y être frotté, un de plus ne sera pas de trop, notamment si vous aussi vous n’avez pas trop compris cette histoire d’horloge interne et d’oscillateur externe …

Depuis le début

Pour rappel, l’ATMEGA328P-PU est la puce au coeur de l’Arduino UNO notamment (encadrée en rouge sur l’image plus bas, on repère l’encoche à droite de la puce pour l’orienter correctement). On peut la trouver facilement sur des sites marchands et moins cher sur EBay. Une fois réceptionnée, elle est vierge de toute donnée, programme ou bootloader. Le bootloader (ou séquence d’initialisation) est un petit morceau de code qui va permettre à l’Arduino de pouvoir communiquer avec l’extérieur et donc de charger ses propres programmes. Il servira également à s’initialiser et à lancer le programme que l’on aura chargé. Fonctionnellement, il peut être comparé au BIOS d’un ordinateur.

On doit donc graver cette séquence pour pouvoir utiliser l’ATMEGA. Mais un dernier choix reste à faire. L’arduino utilise une puce ATMEGA cadencée à 16MHz, ce qui requiert un oscillateur externe et quelques composants présent sur la carte UNO. L’ATMEGA possède en outre une horloge cadencée à 8MHz (datasheet sur le site d’Atmel). On doit donc choisir à quelle fréquence on souhaite utiliser l’ATMEGA avant de graver le bootloader. Pour des applications simples, 8MHz sont largement suffisants, et l’avantage est que la gravure de la séquence ne requiert aucun autre composant si ce n’est une carte Arduino. On choisit donc cette solution. Mais pour ceux qui voudrait quand même graver un bootloader 16Mhz de la même manière, je leur propose d’aller jeter un coup d’oeil à la dernière partie…

Les étapes

1 – Utiliser l’Arduino comme ISP (In System Programmer)

On charge un programme particulier dans l’Arduino pour qu’il devienne l’interface capable de graver notre ATMEGA. Connecté en USB, on charge le programme example ArduinoISP. Dans la version 04m3, on ne le modifie pas, malgré ce qu’on peut lire par ailleurs.

2 – Charger un nouveau matériel dans l’IDE Arduino

Le matériel ATMEGA autonome n’est pas listé par défaut dans les types de carte (menu Outils). On le rajoute en créant les dossiers hardware/breadboard dans le dossier dit « carnet de croquis ». Et dans ce dernier dossier, on copie/colle le fichier boards.txt. On redémarre l’IDE qui propose maintenant le matériel « ATMEGA328 on a breadboard (8MHz internal clock) » que l’on sélectionne.

3 – Réaliser le circuit

On relie l’ATMEGA à l’Arduino de la manière suivante

4 – Graver le bootloader

Après avoir choisi Outils/Programmateur/Arduino as ISP, on est prêt à graver le bootloader. L’opération s’effectue en quelques dizaines de secondes.

Et voilà, on dispose d’un ATMEGA prêt à recevoir des programmes dans le but d’être utilisé seul dans un circuit sans la carte UNO !

En cas de problème

Et voilà, vous avez malheureusement tenté de graver un bootloader 16MHz sur votre pauvre ATMEGA selon le schéma ci dessus (en choisissant une autre option que ATMEGA328 on a breadboard (8MHz internal clock)) . Et maintenant, toute nouvelle tentative se solde par un :

avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.

Une petite explication: certains réglages de l’ATMEGA sont établis par le biais de fusibles. Votre dernière tentative a réglé le fusible correspondant à « horloge externe à 16Mhz » et a échoué à la gravure du bootloader. Mais ce premier réglage reste et toute nouvelle tentative de communiquer avec lui à 8Mhz ne fonctionne pas. Il faut donc à nouveau régler le fusible et pour cela, on utilise un oscillateur 16MHz sur les broches 9 et 10 de l’ATMEGA. En dépannage, un oscillateur seul peut fonctionner (sans les condensateurs) selon le schéma suivant. Ensuite on relance l’écriture du bootloader correspondant à l’option  ATMEGA328 on a breadboard (8MHz internal clock) qui s’écrit sur l’ATMEGA correctement. C’est comme ça que je me suis convaincu, en tout cas, ça fonctionne !

Quelques références

On trouvera des informations complémentaires ici:

http://arduino.cc/en/Main/Standalone

http://arduino.cc/en/Tutorial/ArduinoToBreadboard

Un commentaire Ajouter un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *