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é
Programmateur | AVRDUDE |
---|---|
Atmel STK500 | stk500 |
Atmel JTAGICE mkII mode ISP | jtag2isp |
Atmel JTAGE ICE mkII mode DebugWire | jtage2dw |
Atmel AVR ISP mkII | avrisp2 |
Autre | Voir 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
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
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
Commande | Effet |
---|---|
continue | Continue jusqu'au prochaint point d'arrêt |
break main.c:26 | Met un point d'arrêt à la ligne 26 de main.c |
break initADC | Met un point d'arrêt sur la fonction initADC |
print variable | Affiche la variable si le programme est à l'arrêt |
set variable hello = 12 | Met 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.
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
Description | Liens |
---|---|
Calculateur de fusible | http://www.engbedded.com/fusecalc/ |
Comprendre les registres d'entrée/sortie | http://iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial/ |
AVR-GCC for OSX | https://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 $