Programmer les microcontr�leurs AVR avec GCC, libc 1.0.4

ArticleCategory: [Choose a category, do not translate this]

Hardware

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to fr Iznogood

AboutTheAuthor:[A small biography about the author]

Guido aime Linux car c'est r�ellement un bon syst�me pour d�velopper son propre mat�riel.

Abstract:[Here you write a little summary]

Le microcontr�leur RISC 8 bits AVR d'Atmel est un microcontr�leur tr�s commun. Ce microcontr�leur est un circuit avec une EEPROM, une Ram, un convertisseur Analogique vers Num�rique, beaucoup d'entr�es/sorties num�riques, des compteurs, un UART pour les communications RS232 et bien d'autres choses.

Le meilleur est n�anmoins qu'un environnement complet de programmation est disponible sous Linux: Vous pouvez programmer ce microcontr�leur en C en utilisant GCC.

J'ai d�j� �crit un article en Mars 2000 sur le m�me sujet. Beaucoup de choses ont chang� dans le d�veloppement d'avr-libc et le microcontr�leur AT90S4433 utilis� en 2002 n'est plus fabriqu� par Atmel. Cet article est donc une mise � jour de celui de Mars 2002. Je vais utiliser libc-1.0.4 et le microcontr�leur ATmega8.

Cet article n'est qu'une introduction et dans une prochaine s�rie d'articles, nous construirons des circuits int�ressants mais bas� cette fois sur l'ATmega8.

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

Introduction

Plusieurs personnes ont �t� int�ress�es dans la programmation d'un microcontr�leur, article �crit en 2002. N�anmoins la premi�re �tape pour installer l'environnement de d�veloppement et son lancement est le plus difficile. Si quelque chose ne fonctionne pas correctement, alors vous n'avez aucune aide pour conna�tre l'origine du d�faut. Est-ce le c�ble de programmation? Est-ce le circuit qui est en cause? Une installation incorrecte? Un port parall�le d�sactiv� dans le bios? Les modules de noyau pour ppdev mal compil�s? Il peut y avoir un tas de raisons pour que les choses aillent mal.

Pour rendre l'entr�e dans le monde excitant des microcontr�leurs plus facile, shop.tuxgraphics.org vous offre maintenant un CD bootable avec un manuel et le mat�riel de programmation. Tout ce dont vous avez besoin est de d�marrer depuis le CD et tout est configur�, pr�t � fonctionner. Aucune installation logicielle n'est n�cessaire et rien n'est modifi� sur votre ordinateur.

J'utilise moi aussi ce CD depuis longtemps car les circuits que je construis survivent � plusieurs g�n�rations de noyaux et d'installations de logiciels sur mon PC. Si, plus tard, je veux mettre � jour quelques logiciels de microcontr�leurs, je n'ai alors pas � me demander si le fonctionnement de mon environnement de d�veloppement sur mon Linux est encore fonctionnel. Je d�marre simplement depuis le CD et tout est pr�t � fonctionner.

Ind�pendement de ce CD, je vais expliquer l'installation de l'environnement de d�veloppement GCC avr dans les paragraphes suivants. Si vous avez le CD de tuxgraphics continuez alors avec le chapitre "Un petit projet de test".

Installation logicielle: Ce dont vous avez besoin

Pour utiliser l'environnement de d�veloppement GNU C, vous avez besoin des logiciels suivants:

binutils-2.15.tar.bz2 Disponibles depuis:
ftp://ftp.gnu.org/gnu/binutils/
ou tout miroir. I.e:
ftp://gatekeeper.dec.com/pub/GNU/binutils/
gcc-core-3.4.2.tar.bz2 Disponible depuis: ftp://ftp.gnu.org/gnu/gcc/
ou tout miroir. I.e:
ftp://gatekeeper.dec.com/pub/GNU/gcc/
avr-libc-1.0.4.tar.bz2.tar La biblioth�que C pour AVR est disponible depuis: http://savannah.nongnu.org/projects/avr-libc/
uisp-20040311.tar.bz2 Le logiciel de programmation AVR est disponible depuis: http://savannah.nongnu.org/projects/uisp


Nous allons installer tous les programmes sur /usr/local/avr. Cela permet de garder le programme s�par� de votre compilateur C Linux. Cr�ez ce r�pertoire avec la commande:
    mkdir /usr/local/avr 

Vous pouvez d�j� l'ajouter � votre PATH:
mkdir /usr/local/avr/bin
export PATH=/usr/local/avr/bin:${PATH}

Installation logicielle de: GNU binutils

Le paquet binutils fournit tous les utilitaires bas niveau n�cessaires pour construire les fichiers objets. J'ai inclus un assembleur AVR (avr-as), un linker (avr-ld), des outils de traitement de biblioth�ques (avr-ranlib, avr-ar), les programmes pour g�n�rer les fichiers objets chargeables dans l'EEPROM du microcontr�leur (avr-objcopy), un d�sassembleur (avr-objdump) et des utilitaires tels que avr-strip et avr-size.

Lancez les commandes suivantes pour construire et installer les binutils :
tar jxvf binutils-2.15.tar.bz2
cd binutils-2.15/
mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls
make

# comme root:
make install


Ajoutez la ligne /usr/local/avr/lib au fichier /etc/ld.so.conf et lancez la commande /sbin/ldconfig pour reconstruire le cache linker.

Installation logicielle: AVR gcc

avr-gcc sera notre compilateur C.

Lancez la commande suivante pour le construire et l'installer:
tar jxvf gcc-core-3.4.2.tar.bz2
cd gcc-3.4.2

mkdir obj-avr
cd obj-avr
../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c

make

# comme root:
make install

Installation logicielle: La biblioth�que C AVR

La biblioth�que C est maintenant assez stable compar�e � celle que j'ai pr�sent� en Mars 2002.
Lancez la commande suivante pour la construire et l'installer:
tar jxvf avr-libc-1.0.4.tar.bz2.tar
cd avr-libc-1.0.4
PREFIX=/usr/local/avr
export PREFIX
sh -x ./doconf
./domake

cd build
#comme root:
make install

Installation logicielle: Le Programmateur

Le logiciel du Programmateur charge le code objet sp�cialement pr�par� dans l'EEPROM de notre microcontr�leur.

Le programmateur uisp pour Linux est tr�s bon. Il peut �tre utilis� directement depuis un Makefile. Vous avez simplement � ajouter une r�gle "make load", ce qui vous permet de compiler et charger le logiciel en une passe.

uisp est install� comme suit:
tar jxvf uisp-20040311.tar.bz2.tar
cd uisp-20040311
./configure --prefix=/usr/local/avr
make

# comme root:
make install

Un petit projet de test

Nous allons d�buter avec un petit circuit de test que vous pourrez �tendre plus tard.

Ce circuit peut aussi �tre utilis� comme un simple environnement de test pour du logiciel plus complexe. Vous pouvez facilement tester le logiciel charg� et lier des capteurs ou un �quipement de mesure.

Notre programme de test, pr�sent� ici, ne fera que clignoter une LED.

Mat�riel n�cessaire

[test circuit]
Vous avez besoin des composants list�s dans la table ci-dessous. Bien qu'il soit un microcontr�leur commun, il peut ne pas �tre disponible dans la boutique du coin mais il le sera chez des distributeurs d'�lectronique plus gros comme www.conrad.de (allemagne), www.selectronic.fr (france), digikey.com (US, CA), etc...
Vous pouvez aussi obtenir le kit complet ou seulement le microcontr�leur sur shop.tuxgraphics.org
1 x ATmega8 version DIP, processeur Atmel 8 bit Avr risc.
1 x 28 broches 7.5mm support de CI
Le support 28 broches est un peu plus difficile � obtenir. Ces supports 28 broches sont souvent � 14mm de large mais nous avons besoin d'un support � 7.5mm.
1 x r�sistance 10K (code couleur: marron,noir,orange)
1 x r�sistance 1K (code couleur: marron,noir, rouge)
1 x condensateur �lectrolytique 10uF
Quelques c�bles
1 x LED
une plaque pr�-perc�e
Ce qui suit est n�cessaire pour le programmateur (ce n'est pas n�cessaire si vous avez le "kit de programmation AVR Linux de tuxgraphics):
1 x connecteur DB25 � brancher sur le port parall�le.
Tout type de connecteur/support � 5 broches pour le programmateur. Je recommande l'utilisation de connecteurs tulipes (similaires aux supports de circuits) et d'en d�tacher 5 broches.
1 x r�sistance 220 Ohms (code couleur: rouge, rouge, marron)
3 x r�sistance 470 Ohms (code couleur: jaune, violet, marron)
En plus des composants ci-dessus, vous avez besoin d'une alimentation DC de 5V �lectroniquement stabilis�e ou vous pouvez utiliser une pile de 4.5V comme alimentation.

Vous avez probablement remarqu� que nous n'avons pas besoin de quartz. C'est parce que l'ATmega8 poss�de maintenant un oscillateur int�gr�. Cet oscillateur peut �tre utilis� lorsque la gestion du temps n'est pas vitale. Si vous voulez n�anmoins construire un �quipement de mesure pr�cis ou si vous souhaitez utiliser l'interface UART/RS232 alors, vous avez besoin d'un quartz. Le type d'oscillateur utilis� peut �tre d�fini par les bits fusibles que vous pouvez modifier avec le programmateur. Par d�faut (configuration d'usine), l'oscillateur d'1Mhz est actif.

Fabriquer le mat�riel du programmateur

Les microcontr�leurs AVR permettent la programmation in situ (ISP). [Linux AVR programmer]
Cela signifie que vous n'avez pas besoin de retirer le microcontr�leur de la carte pour le programmer. Vous verrez que vous pouvez obtenir diff�rents mat�riels de programmation pour 50-150 Euro. N�anmoins, avec Linux, il est aussi possible de fabriquer un programmateur tr�s simple qui fait le travail. Vous avez besoin d'un port parall�le libre sur votre ordinateur et du c�ble suivant.

Notez que c'est un programmateur am�lior� compar� � celui pr�sent� dans l'article de Mars 2002. Nous pla�ons les r�sistances de protection dans le programmateur. Cela permettra de pr�server un peu d'espace et des composants sur la carte. Le c�blage pour le c�ble de programmation doit �tre comme suit:
broche sur pcb broche sur AVR r�sistance de protection broche sur port parall�le
5 Reset (1) -- Init (16)
4 MOSI (17) 470 Ohms D0 (2)
3 MISO (18) 220 Ohms Busy (11)
2 SCK (19) 470 Ohms Strobe (1)
1 GND -- GND (18)

Le c�ble ne doit pas faire plus de 70cm.

Les r�sistances de protection peuvent �tre plac�es dans le connecteur comme montr� sur l'image � droite.

�crire des programmes

L'ATmega8 peut �tre programm� en C pur avec l'aide de gcc. La connaissance de l'assembleur AVR peut �tre utile mais n'est pas n�cessaire.

La libc AVR est fournie avec avr-libc-user-manual-1.0.4.pdf (1139921 octets) qui documente toutes les fonctions disponibles en C. Sur le site d'Atmel (www.atmel.com, allez dans: avr products -> 8 bit risc-> Datasheets), vous pouvez y t�l�charger la documentation technique compl�te. Elle d�crit tous les registres et comment utiliser le CPU.

Une chose � garder en m�moire lors de l'utilisation d'un microcontr�leur est qu'il ne poss�de que peu d'octets en m�moire vive. Cela signifie que vous ne devez pas d�clarer de grandes structures de donn�es ou des cha�nes de caract�re. Votre programme ne doit pas utiliser des fonctions avec beaucoup de niveaux d'imbrications ou de r�cursions.

Rien de mieux qu'un peu de pratique � la place des grandes th�ories. Nous allons �crire un programme qui fait clignoter notre LED avec un intervalle de 0.5 secondes. Pas tr�s utile mais tr�s bon pour d�buter.

avr-libc a beaucoup chang�. Avant, vous positionniez un bit sur un port avec sbi et vous l'effaciez avec cbi. Ces fonctions sont maintenant obsol�tes. Je pr�sente d'abord la "bonne vieille m�thode":
    /* defines for future compatibility */
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void main(void)
{
/* INITIALIZE */
/* enable PC5 as output */
sbi(DDRC,PC5);


/* BLINK, BLINK ... */
while (1) {
/* led on, pin=0 */
cbi(PORTC,PC5);
delay_ms(500);
/* set output to 5V, LED off */
sbi(PORTC,PC5);
delay_ms(500);
}
}

L'exemple suivant fait exactement la m�me chose mais utilise la nouvelle syntaxe:
    void main(void)
{
/* INITIALIZE */
/* enable PC5 as output */
DDRC|= _BV(PC5);


/* BLINK, BLINK ... */

/* PC5 is 5 (see file include/avr/iom8.h) and _BV(PC5) is 00100000 */
while (1) {
/* led on, pin=0 */
PORTC&= ~_BV(PC5);
delay_ms(500);
/* set output to 5V, LED off */
PORTC|= _BV(PC5);
delay_ms(500);
}
}

Le petit bout de code ci-dessus montre comme il est facile d'�crire un programme. Vous voyez seulement le programme principal, la fonction delay_ms est incluse dans le listing complet (avrm8ledtest.c). Pour utiliser la broche PC5 comme sortie, vous avez besoin d'initialiser le bit PC5 dans le registre de direction de donn�es pour le port C (DDRC). Apr�s ceci, vous pouvez mettre PC5 � 0V avec la fonction cbi(PORTC,PC5) (clear bit PC5) ou � 5V avec sbi(PORTC,PC5) (set bit PC5). La valeur de "PC5" est d�finie dans iom8.h qui est incluse par io.h. Vous n'avez pas � vous en inqui�ter. Si vous avez d�j� �crit des programmes pour multi-utilisateurs / des syst�mes multi-t�ches tels que Linux, vous savez qu'il ne faut jamais programmer une boucle sans fin non bloqu�e. Cela serait une perte de temps CPU et cela ralentirait de beaucoup le syst�me. Dans le cas de l'AVR, c'est diff�rent. Nous n'avons pas plusieurs t�ches et il n'y a pas d'autre programme. Il n'y a m�me pas de syst�me d'exploitation. Il est consid�r� comme normal d'occuper des boucles ind�finiment.

Compiler et charger

Avant de d�marrer, assurez-vous que /usr/local/avr/bin est dans le PATH. Si n�cessaire, �ditez votre .bash_profile ou .tcshrc et ajoutez:

export PATH=/usr/local/avr/bin:${PATH} (pour bash)
setenv PATH /usr/local/atmel/bin:${PATH} (pour tcsh)

Nous utilisons le port parall�le et uisp pour programmer l'AVR. Uisp utilise l'interface ppdev du noyau. Vous devez donc avoir les modules de noyau suivants charg�s:
    # /sbin/lsmod
parport_pc
ppdev
parport
Contr�lez avec la commande /sbin/lsmod qu'ils sont charg�s et si ce n'est pas le cas, chargez-les (comme root) avec:
    modprobe parport
modprobe parport_pc
modprobe ppdev

Une bonne id�e est d'ex�cuter ces commandes automatiquement au d�marrage. Vous pouvez les ajouter comme un script rc (i.e. pour Redhat /etc/rc.d/rc.local).
Pour utiliser l'interface ppdev comme utilisateur normal, root doit vous donner l'acc�s en �criture en lan�ant la commande suivante une fois

chmod 666 /dev/parport0

Assurez-vous aussi qu'aucun d�mon d'impression ne fonctionne sur le port parall�le. Si vous en avez un qui tourne, arr�tez-le avant de connecter le c�ble de programmation. Maintenant, tout est pr�t pour compiler et programmer notre microcontr�leur.

Le paquet pour notre programme de test, (avrm8ledtest-0.1.tar.gz) inclut un make file. Tout ce que vous avez � faire est de saisir:

make
make load

Cela compilera et chargera le logiciel. Je ne vais pas entrer dans les d�tails de toutes les commandes. Vous pouvez les voir dans le Makefile et elles sont toujours identiques. Je ne peux pas toutes me les rappeler. J'ai juste besoin de savoir utiliser "make load". Si vous voulez �crire un programme diff�rent, remplacez alors toutes les occurences de avrm8ledtest dans le Makefile avec le nom de votre programme.

Quelques binutils int�ressants

Quelques binutils sont plus int�ressant que le processus de compilation actuel.
Ces utilitaires n'ont n�anmoins pas beaucoup chang� depuis Mars 2002. Jetez un coup d'oeil au chapitre "Quelques "binutils" int�ressants" sur l'article231 de Mars 2002.

Id�es et suggestions

L'ATmega8 est compatible � l'AT90S4433 pour la plupart des utilisations. Vous devez programmer les bits fusible pour utiliser l'oscillateur externe et les circuits pr�c�demment pr�sent�s devraient fonctionner avec quelques changements mineurs. Malheureusement, je n'ai pas encore le temps de re-tester tous les circuits pour l'ATmega8. Si vous voulez la s�curit�, utilisez l'AT90S4433 pour les vieux articles. Si vous n'avez pas peur de trouver et r�gler des probl�mes, tentez alors l'ATmega8 avec les vieux articles/circuits.

Vous avez ici une liste des pr�c�dents articles sur des circuits:

Notez que le programmateur pr�sent� ici inclus d�j� les r�sistances de protection qui ont �t� plac�es sur la carte dans les pr�c�dents articles avec des circuits. Pour utiliser le nouveau programmateur avec les anciennes cartes, vous avez simplement � remplacer les r�sistances de protection sur la carte avec des fils.

R�f�rences