Table of Contents

Programmation de microprocesseur avec AVR-GCC et AVRDUDE

Premier programme

Squelette de base pour les programmes AVR à créer dans un fichier main.c

main.c
#include<stdint.h> // Ajout des types int#_t et uint#_t, # vaut 8 , 16 ou 32
#include<avr/io.h> // Utilisation des entrées sorties
#define F_CPU 1000000UL	// 1MHZ, réglage de la fréquence du CPU
#include<util/delay.h> // Gestion des temporisations
 
int main(void)
{
    return(0);
}

Câblage

Pour le câblage, se référer à cette page : pinout

Compilation et programmation

Les commandes ci-dessous compile le fichier main.c en fichier main.elf, puis convertisse le fichier elf en fichier hex qui est ensuite programmé dans notre micro-processeur.

Bien sur, il faut adapter les options au type de microprocesseur et au programmateur utilisé

uPGCCAVRDUDE
ATtiny85attiny85t85
Autrevoir : le manuelVoir le manuel
ProgrammateurAVRDUDE
Atmel STK500stk500
Atmel JTAGICE mkII mode ISPjtag2isp
Atmel JTAGE ICE mkII mode DebugWirejtage2dw
Atmel AVR ISP mkIIavrisp2
AutreVoir le manuel
avr-gcc -mmcu=attiny85 -o main.elf main.c
avr-objcopy -O ihex -R .eeprom main.elf main.hex
avrdude -p t85 -c stk500 -P /dev/ttyUSB0 -U flash:w:main.hex

Déboguage

Debug-wire est une norme de communication basée sur le one-wire permettant une programmation basique ainsi que le déboguage de la série ATtiny.

Initialisation

Pour l'enclencher, il faut modifier la valeur des fusibles de configurations à l'aide d'un programmateur ISP comme le STK500

Le STK500 ne gère pas le mode debug-wire, il faudra ensuite utiliser le JTAGICEmkII

Exemple pour l'Attiny85, avec utilisation de l'horloge interne 8MHz sans divisions et debug-wire activé.

avrdude -p t85 -c stk500 -P /dev/ttyUSB0 -U lfuse:w:0xfe:m -U hfuse:w:0x9f:m -U efuse:w:0xff:m 

Pour le câblage, se référer à cette page : pinout

Compilation et programmation

Pour permettre l'utilisation de GDB, il faut activer les symboles de débugage (-g) et désactivé les optimisations du compilateur.
La désactivation des optimisations empêche le fonctionnement normal des fonctions de <util/delay.h> comme _delay_us()
avr-gcc -g -mmcu=attiny85 -o main.elf main.c
objcopy -O ihex -R .eeprom main.elf main.hex
avrdude -c jtag2dw -P usb -p t85 -U flash:w:main.hex

Si l'upload ne fonctionne pas, un redémarrage de l'Attiny peut aider.

Déboguage

Pour débuguer, il faut tout d'abord lance avarice :

avarice -2 -w -P attiny85 --jtag usb :4242

Puis, dans un autre terminal, on lance avr-gdb:

avr-gdb main.elf

Dans l'invite de commande gdb, on peut connecter gdb à avarice avec la commande:

target remote :4242

Commande GDB

CommandeEffet
continueContinue jusqu'au prochaint point d'arrêt
break main.c:26Met un point d'arrêt à la ligne 26 de main.c
break initADCMet un point d'arrêt sur la fonction initADC
print variableAffiche la variable si le programme est à l'arrêt
set variable hello = 12Met la variable hello à la valeur 12

Tutoriel : http://beej.us/guide/bggdb/ Info : http://avr.2057.n7.nabble.com/avr-gdb-use-td6037.html

Désactivation de DebugWire

Avec le mode debugWire, on ne peux pas lire les fusibles. Pour désactiver le mode debugWire, il faut connecter le programmateur JTAGICE mkII en mode ISP, soit :

Pour le câblage, se référer à cette page : pinout

Mainteant, si on essaie de programmer de désactiver debugWire :

avrdude -c jtag2isp  -P usb:070000004DAA  -p t85 -U hfuse:w:0xdf:m

On obtient le message suivant :

avrdude: jtagmkII_setparm(): bad response to set parameter command: RSP_FAILED
avrdude: jtagmkII_getsync(): ISP activation failed, trying debugWire
avrdude: Target prepared for ISP, signed off.
avrdude: Please restart avrdude without power-cycling the target.
 
avrdude done.  Thank you.
AVRDUDE a désactiver provisoirement debugWire, il ne faut pas redémarrer la processeur

On peut donc relancer la commande pour programmer le fusible hfuse.

avrdude -c jtag2isp  -P usb:070000004DAA  -p t85 -U hfuse:w:0xdf:m

Source : http://www.nongnu.org/avrdude/user-manual/avrdude_20.html

Liens utiles

DescriptionLiens
Calculateur de fusiblehttp://www.engbedded.com/fusecalc/
Comprendre les registres d'entrée/sortiehttp://iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial/
AVR-GCC for OSXhttps://obdev.at/products/crosspack/download.html

FAQ

see error “multiple definition of `_floatsisf'” look especially to the position of the -lm flag

$ avr-gcc -mmcu=attiny85 -o main.elf main.c
/usr/local/CrossPack-AVR-20130212/lib/gcc/avr/4.6.2/../../../../avr/lib/avr25/libc.a(floatsisf.o):../../../libm/fplib/floatsisf.S:46: multiple definition of `__floatsisf'
/usr/local/CrossPack-AVR-20130212/lib/gcc/avr/4.6.2/avr25/libgcc.a(_si_to_sf.o):/Users/cs/Developer/Repos/Microcontroller/CrossPack-AVR/compile/avr-gcc-4.6.2/build-objects/avr/avr25/libgcc/../../.././gcc/fp-bit.c:1336: first defined here
collect2: ld returned 1 exit status
 
$ avr-gcc -mmcu=attiny85 -lm -o main.elf main.c
/usr/local/CrossPack-AVR-20130212/lib/gcc/avr/4.6.2/../../../../avr/lib/avr25/libc.a(floatsisf.o):../../../libm/fplib/floatsisf.S:46: multiple definition of `__floatsisf'
/usr/local/CrossPack-AVR-20130212/lib/gcc/avr/4.6.2/avr25/libgcc.a(_si_to_sf.o):/Users/cs/Developer/Repos/Microcontroller/CrossPack-AVR/compile/avr-gcc-4.6.2/build-objects/avr/avr25/libgcc/../../.././gcc/fp-bit.c:1336: first defined here
collect2: ld returned 1 exit status
 
$ avr-gcc -mmcu=attiny85 -o main.elf main.c -lm
$