Programmer les fusibles d’un microcontrôleur AVR d’Atmel

Cet article traite des fusibles sur un Atmega328, pour tout autre microcontrôleur se référer à sa documentation.
Le programmateur utilisé pour cet article est un usbtiny.

1- Présentation

Les fusibles permettent de configurer le microcontrôleur. Ils sont partagés en 3 registres low, high et extended disposant de leur propre espace mémoire.
Chaque registre est représenté par un octet dont chaque bit correspond à un fusible (paramètre). Le fusible est programmé sur un bit de niveau 0 et déprogrammé sur un bit de niveau 1.
Le registre « low fuse » comporte les fusibles sur les horloges, le registre « high fuse » les fusibles d’options et le registre « extended fuse » les fusibles sur la tension de coupure. Les fusibles changent d’un microcontrôleur à l’autre.

Précaution

Certains fusibles sont critiques, on les retrouve dans le registre « high fuse » et s’appelle RSTDISBL et SPIEN. Le premier permet de désactiver la fonction reset sur la pin 1 empêchant l’initialisation d’une programmation par SPI au bénéfice de son utilisation pour un autre usage. Le second empêche la programmation par l’interface SPI, il n’est pas possible de modifier ce fusible en utilisant ce même protocole.

En surbrillance les fusibles à ne pas modifier sous peine de mauvaise surprise :

1 1 0 1 1 0 0 1 = 0xD9
RSTDISBL DWEN SPIEN WDTON EESAVE BOOTSZ1 BOOTSZ0 BBOTRST HFUSE

Au bal masqué…

Le registre « extended fuse » supporte seulement 3 fusibles. Ils indiquent le seuil de tension en dessous duquel le microcontrôleur se coupera.
Il reste donc 5 bits inutilisés sur l’octet et suivant leur valeur poseront des problèmes lors de la vérification d’écriture. Ainsi il est nécessaire de fournir un masque qui permettra au programmateur de lire uniquement les bits nécessaires.
Pour les fusibles « extended fuse », ce masque est 0×07. Les bits à l’état logique 0 seront masqués. Pour les autres registres, l’octet étant complètement utilisé la valeur de leur masque est 0xFF.

2- Fonctionnement

Par défaut l’atmega328 sort d’usine avec une horloge cadencé à 1Mhz ce qui est relativement faible pour de nombreuses applications. Pourtant l’horloge interne est à 8Mhz.La faute à un fusible qui divise l’horloge (interne ou externe) par 8 à des fins d’économie d’énergie.
Ce fusible est gérée comme tout ce qui touche aux horloges par le registre « low fuse » sous le nom CKDIV8. Il est nécessaire de le mettre 1.

2-1 Lire les fusibles du microcontrôleur

Affichage du résultat en décimal (base 2) – argument b

sudo avrdude -p m328p -c usbtiny -U lfuse:r:-:b -q -q # retourne 0b1101010

Affichage du résultat en hexadecimal (base 16) – argument h

sudo avrdude -p m328p -c usbtiny -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h # retourne 0xD9 0xE6 0xF3

Sur le résultat binaire le bit de poids fort est à 0, il correspond au diviseur par 8 qu’il faut désactiver.

0 1 1 0 0 0 1 0 = 0×62
CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0 LFUSE

Piège : Si avrdude retourne l’erreur avrdude : initilization failed, rc=-1 laissant penser une erreur de connexion, cela peut également provenir du registre « lfuse » configurer en horloge externe. Dans ce cas il est nécessaire de câbler un quartz ou un résonateur aux bornes du microcontroleur afin de le programmer.

Certains programmateurs comme l’USBAsp permettent de commuter différentes vitesses pour palier ce problème.

2-2 Ecrire les fusibles du microcontrôleur

Pour désactiver le diviseur par 8 CKDIV8 il faut réécrire l’octet du registre « lfuse » soit en utilisant la numérotation binaire :

sudo avrdude -p m328p -c usbtiny -U lfuse:w:0b11100010:m -q -q # on passe le bit 7 à 1 rendant inactif CKDIV8

ou en utilisant la numérotation hexadécimal :

sudo avrdude -p m328p -c usbtiny -U lfuse:w:0xE2:m 

L’argument « m » en fin de commande indique à avrdude de prendre la valeur le précédent comme données à écrire. En temps normal on y place le nom du fichier contenant les données.

Ressource: Il existe un calculateur de fusible en ligne


So, what do you think ?

You must be logged in to post a comment.