Squelette de base pour les programmes AVR à créer dans un fichier 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); }
Pour le câblage, se référer à cette page : pinout
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
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.
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
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.
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 | 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
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
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 |
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 $