Wednesday, 30 October 2013

Brûler un firmeware sur une puce ATMEGA8

J'utilise un ISP (In-System Programming) bas de gamme (usbasp) mais qui fait parfaitement bien l’affaire.

Pour référence, je met la connectique:

Pour faire simple on va brancher le connecteur USB sur l'ordinateur pour qu'il alimente le µC et au travers du connecteur ISP.
On peut alors vérifier au moyen d'un multimètre si on a bien 5V entre les pin 7 et 8 de l'ISP et entre les pin 7 et 8 du µC (Atmega8) également.


Maintenant on va tester si le programmateur fonctionne, et donc s'il voit le µC qui lui est connecté par l'ISP.

Par exemple en lisant la mémoire flash de l'atmega8
sudo avrdude -p m8 -P /dev/parport0 -c usbasp -U flash:r:-:i -E noreset

Il devrait répondre ainsi :
avrdude: WARNING: -E option not supported by this programmer type
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: reading flash memory:
Reading | ################################################## | 100% 3.16s
avrdude: writing output file "<stdout>"
:00000001FF
avrdude: safemode: Fuses OK
avrdude done.  Thank you. 


Super !! Ça fonctionne !

Un peu d'explication :
sudo, car on a besoin d'accéder à la ressource matérielle du port parallèle. 
-p m8, indique le modèle de µC.  
-P /dev/parport0, spécifie le port sur lequel est connecté le programmateur (port parallèle).  
-c usbasp, indique le nom du programmateur.  
-U flash:r:-:i 
-E noreset, pour s'adresser à la mémoire flash du µC en mode lecture.
 
Programatin de la Puce : 
Reste à programmer le µC pour y mettre le fichier .hex 
sudo avrdude -p m8 -c usbasp -U flash:w:/"PATH"/"FILE".hex 

Ce qui renvoie :
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "/"PATH"/"FILE".hex"
avrdude: input file /"PATH"/"FILE".hex auto detected as Intel Hex
avrdude: writing flash (1898 bytes):
Writing | ################################################## | 100% 1.16s
avrdude: 1898 bytes of flash written
avrdude: verifying flash memory against /"PATH"/"FILE".hex:
avrdude: load data flash data from input file /"PATH"/"FILE".hex:
avrdude: input file /"PATH"/"FILE".hex auto detected as Intel Hex
avrdude: input file /"PATH"/"FILE".hex contains 1898 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.81s
avrdude: verifying ...
avrdude: 1898 bytes of flash verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you. 
Super !! 

Mais... Il manque une étape cruciale, la programmation des bits fusibles. En effet, sans cela l'oscillateur @12Mhz du montage ne sera pas pris en compte par le µC qui continuera d'utiliser son oscillateur interne.

Les valeurs appropriée pour mon projet sont:
ATMEGA8 builds: high byte = 0xc9, low byte = 0x9f 
 
Donc j'envoie la ligne suivante: 
sudo avrdude -p m8 -P /dev/parport0 -c usbasp -Uhfuse:w:0xc9:m -Ulfuse:w:0x9f:m 

Ce qui donne :
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: reading input file "0xc9"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.01s
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xc9:
avrdude: load data hfuse data from input file 0xc9:
avrdude: input file 0xc9 contains 1 bytes
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0x9f"
avrdude: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.01s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x9f:
avrdude: load data lfuse data from input file 0x9f:
avrdude: input file 0x9f contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: safemode: Fuses OK
avrdude done.  Thank you.
 
Il ne reste plus qu'à tester....

No comments:

Post a Comment