WinAVR n'est pas juste un logiciel, c'est un pack regroupant plusieurs outils indispensables à la programmation C. Il intègre le compilateur AVR-GCC, AVR-libc: les librairies essentielles de AVR-GCC, AVR-as: l'assembleur, AVRdude : l'interface de programmation, AVRice : l'interface de programmation ICE, AVR-gdb: le débugeur, programmers notepad : l'éditeur et plein d'autres Ce pack a été fait pour être utilisé uniquement sous Windows.
Le Makefile est un fichier qui se met dans le même répertoire que votre programme pour définir les “règles” de compilation. Un makefile d'exemple se trouve dans le répertoire C:\WinAVR\sample\ Il est un impératif d'avoir ce fichier dans le répertoire contenant le source de votre programme. Vous pouvez aussi créer un fichier makefile avec l'assistant MFile founit dans WinAVR. Il suffira de choisir vos différentes options dans le menu Makefile et d'enregistrer le fichier dans le répertoire de votre projet.
La compilation se fait grâce à la commande make all ex : c:\test\make all test.c si vous n'avez pas de makefile dans le répertoire vous aurez une erreur du type :
make.exe: *** No rule to make target 'all '. Stop.
La commande make peut s'exécuter avec plusieurs paramètres All, clear, coff , extcoff, programm, fichier.s all: est le mode par défaut, il compile le fichier et crée le .hex. clear: supprime en plus tous les fichiers temporaires. coff: crée un fichier au format COFF pour la simulation avec AVRSTUDIO jusqu'à la version 4.06. extcoff: comme coff sauf que c'est pour Avrstudio à partir de la version 4.07 programm: Fait le transfère du .hex dans le µcontrôleur grâce à avrdude, qu'il faut configurer avant. fichier.s: Si vous tapez make test.S le compilateur générera juste le fichier Assembleur
Faite un copie avant tout du makefile qui se trouve dans C:\WinAVR\sample\ dans un répertoire de test comme … c:\test\ :) pour être sûr de ne pas modifier l'original par inadvertance. Pour l'éditer, utilisez “Programmers Notepad2” qui se trouve (depuis que vous avez fait l'installation) dans c:\WinAVR\pn\pn.exe où plus simple cliquez sur le raccourcis qui se trouve normalement sur le bureau “Programmers Notepad [WinAVR]”
# MCU name
Une fois ouvert allez à la ligne # MCU name et choisisez le microcontroleur que vous allez utiliser en modifiant MCU = atmega128 par MCU = at90s8535 pour un 8535 ou at90s2313 at90s8515 atmega8 attiny22 etc etc.
# Output format. (can be srec, ihex, binary)
C'est le format final du fichier à charger dans le micro par defaut laissez FORMAT = ihex
# Target file name (without extension).
C'est le nom de votre fichier.c mais sans le .c, dans notre exemple, notre fichier est test.c donc on remplacera par TARGET = test
# List C source files here. (C dependencies are automatically generated.)
Ici vous pouvez rajouter d'autres fichiers .c à compiler en même temps.
ex : SRC = $(TARGET).c foo.c
Compilera en même temps le fichier foo.c.
Dans la derniere version il y a apparemment un bug (si s'en n'est pas un, merci de me corriger)
Vous avez :
# List C source files here. (C dependencies are automatically generated.) SRC = # List C++ source files here. (C dependencies are automatically generated.) CPPSRC = main.cpp
qu'il faut remplacer par :
# List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c # List C++ source files here. (C dependencies are automatically generated.) CPPSRC =
# List Assembler source files here.
Ici vous pouvez rajouter un fichier en assembleur mais qui doit avoir l'extension .S avec un S majuscule. ex : ASRC = myasmfile.S
# Optimization level, can be [0, 1, 2, 3, s].
Permet de définir le niveau d'optimisation. Je n'ai pas encore mis le nez dedans donc par defaut sur s …
OPT = s
Démarrer Programmers Notepad qui se trouve dans sur le bureau “Programmers Notepad [WinAVR]” ou alors dans le répertoire c:\WinAVR\pn\pn.exe).
Créer un répertoire de test ex: C:\WinAVR\test\ copier y le makefile qui se trouve dans C:\WinAVR\sample\
Dans PN (Programmers Notepad), File→New→C/C++, File→Save AS … allez dans le répertoire C:\WinAVR\test\ et enregistrer le fichier en test.c. Copier ce code dedans :
#include <avr/io.h> #include <avr/delay.h> void main (void) { unsigned char counter; DRB = 0xFF; //met le portb en sortie while (1) { PORTB |= 1<<2; //met le bit 2 du PORTB au niveau haut counter = 0; //attend (10 * 120000) cycles = attend 1200000 cycles while (counter != 5) { _delay_loop_2(30000); //attend (30000 x 4) cycles = attend 120000 cycles counter++; } PORTB &= ~(1<<2); //met le bit 2 du PORTB au niveau bas counter = 0; //attend (10 * 120000) cycles = attend 1200000 cycles while (counter != 5) { _delay_loop_2(30000); //attend (30000 x 4) cycles = attend 120000 cycles counter++; } } return 1; }
Tools→[WinAVR] Make All, Si vous avez cette erreur “make.exe: No rule to make target `main.o', needed by `main.elf'. Stop.” c'est normal. Vous n'avez pas configuré le Makefile comme je vous l'ai dis avant ! :) Donc File→Open : Makefile Allez à la ligne “# Target file name (without extension).” et remplacez “TARGET = main” par “TARGET = test” et sauvegardez le. Cliquez sur l'onglet test.c et compilez le.
Compiling: test.c avr-gcc -c -mmcu=atmega128 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.lst -std=gnu99 -Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.d test.c -o test.o test.c:4: warning: return type of `main' is not `int' test.c: In function `main': test.c:7: error: `DRB' undeclared (first use in this function) test.c:7: error: (Each undeclared identifier is reported only once test.c:7: error: for each function it appears in.) test.c:19: error: parse error before '}' token test.c:29: error: parse error before '}' token make.exe: *** [test.o] Error 1
Vous devriez avoir ces erreurs. Le fait de cliquer sur un ligne d'erreur envoie le curseur automatiquement à la bonne ligne.
test.c:7: error: `DRB' undeclared (first use in this function)
Oups faute de frappe c'est pas DRB mais DDRB, donc à changer. Recompilez.
Errors: none
WAOU ! Ca marche mais …il y a encore des Warnings.
Compiling: test.c avr-gcc -c -mmcu=atmega128 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.lst -std=gnu99 -Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.d test.c -o test.o test.c:4: warning: return type of `main' is not `int' test.c: In function `main': test.c:31: warning: `return' with a value, in function returning void
test.c:4: warning: return type of `main' is not `int'
Return revoie 1 alors que void main (void) dit qu'il ne revoie rien donc on change en int main (void).
test.c:31: warning: `return' with a value, in function returning void Pour que la dernière accolade soit prise en compte vous devez faire un saut de ligne après ...
Recompilez. Et voilà c'est fini.
Allez dans Tools→Option : Tools.
Sélectionnez (None - global Tools)
Add
et Complétez
Name | Command | Folder | Parameters | Capture Output? | This tool will modify.. | Save: | Clear Output? | Use Built in Parser. |
Make Extcoff | make | %d | extcoff | Main | No | None | No | Yes |
Make Coff | make | %d | coff | Main | No | None | No | Yes |
Depuis la réalisation de ce tutorial des modifications ont été apportées à WinAVR ainsi qu'à AVR Studio. Si vous utilisez une version récente d'AVR Studio (4.10+) lisez ceci et ignorez la suite du tutorial.
Faites un Make All, pour vérfier qu'il n'y ait pas d'erreurs.
Faites un Make Coff, si vous avez AVR Studio 4.06 ou inférieur.
Faites un Make ExtCoff, si vous avez AVR Studio 4.07 ou supérieur.
Ouvrez test.cof avec AVR Studio et choisissez ATMEGA128 quand il faut choisir le microcontrôleur. Faites un Make All, pour vérfier qu'il n'y ait pas d'erreurs. Faites un Make Coff, si vous avez AVR Studio 4.06 ou inférieur. Faites un Make ExtCoff, si vous avez AVR Studio 4.07 ou supérieur.
Ouvrez test.cof avec AVR Studio et choisissez ATMEGA128 quand il faut choisir le microcontrôleur.