Documente Academic
Documente Profesional
Documente Cultură
JUILLOT Guillaume
2 septembre 2003
Table des matieres
Introduction 3
Le mot de la fin 29
A Schema de lATmega128 31
B Conversion hexadecimal/binaire/decimal 33
B.0.1 Convention decriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1
2 TABLE DES MATIERES
C Aide a la programmation 35
C.1 Type de donnees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
C.2 Gestion des entrees/sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
C.3 Interruptions externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
C.4 Timer/Counter0 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
C.5 Timer/Counter2 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
C.6 Timer/Counter1 et 3 (16 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
C.7 Interruptions pour Timers/Counters . . . . . . . . . . . . . . . . . . . . . . . . . . 37
C.8 Generation de PWM sur OC0 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . 37
C.9 Generation de PWM sur OC2 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . 38
C.10 PWM sur OC1A, OC1B, OC1C, OC3A, OC3B et OC3C (de 8 a 10 bits) . . . . . 38
C.11 USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Index 43
Introduction
Ce document a ete ecrit dans le cadre de la coupe 2003 de robotique e=M6. Il a pour but
de vous presenter toutes les phases de developpement dun projet sur les microcontroleurs de la
famille AVR de chez ATMEL.
Cette presentation est decomposee en quatre parties. La premiere sera une description aussi
complete que possible des possibilites quoffrent les microcontroleurs choisis. Suivront les rudi-
ments de la programmation en C et en assembleur, a laide du compilateur Imagecraft. Un aspect
important est la simulation du programme, qui se fera a laide de AVR Studio 4 dans la troisieme
partie du present document. Je terminerai en presentant la mise en pratique du programme en
limplementant sur le microcontroleur.
Les exemples donnes seront valables pour un ATmega128. Il est possible quils ne soient plus
valables pour un autre microcontroleur. Dans tous les cas il est vivement recommande
davoir une datasheet complete de lATmega128 sous les yeux pour mieux pouvoir
suivre les exemples. Utilisez egalement la datasheet dun autre microcontroleur si vous souhaitez
adapte les exemples au microcontroleur de votre choix.
3
4 INTRODUCTION
Chapitre I
Les entrees/sorties sont regroupees par huit et le groupement de huit pattes ainsi forme est
appele port et se voit attribue une lettre. Par exemple, les broches 44 a 51 forment le port A.
1 PWM = Pulse Width Modulation, cest un signal rectangulaire caracterise par le rapport cyclique
5
6 CHAPITRE I. LES MICROCONTROLEURS AVR POUR LES NULS
Chaque patte est ensuite numerotee selon sa position au sein de ce port. Par exemple, la broche
46 est appelee PA52 . Trois registres3 servent a gerer les entrees/sorties :
DDRx4 : indique quelles sont les pattes considerees comme des entrees et celles considerees
comme des sorties. Si le nieme bit de DDRx (note DDxn) est a 1, alors la nieme patte du
port x (notee Pxn) est considere comme une sortie. Si DDxn est a 0, alors Pxn est consideree
comme une entree.
PORTx : la valeur du nieme bit de PORTx (note PORTxn) definit la valeur de sortie de
Pxn. Si PORTxn=1, alors Pxn=+Vcc, si PORTxn=0, alors Pxn=Gnd.
PINx : la valeur du nieme bit de PINx (note PINxn) est la valeur qui est appliquee a lentree
du microcontroleur. Par exemple, si on applique +Vcc a Pxn, alors PINxn=1.
La plupart des pattes possedent des fonctions peripheriques qui inhibent lutilisation en tant
quentrees/sorties. Si lon utilise les fonctions peripheriques, il ne faut en aucun cas modifier les
bits DDRxn, PORTxn et PINxn correspondants.
Ces Timers/Counters peuvent donc avoir plusieurs utilisations. Dabord, le programmeur peut
savoir le temps ecoule depuis quil a lance le Timer/Counter. Ou encore, linterruption de passage
de MAX a 0 peut etre utilisee pour temporisation, et commencer ou arreter un programme au
bout dun certain temps. La derniere utilisation, tres utile en robotique pour la commande de ser-
vomoteurs, est la generation de signaux PWM. En effet, si la patte OCn change de valeur lorsque
le TCNTn atteint la valeur du comparateur OCRn, on obtient sur OCn un signal alternativement
a 1 puis a 0 avec des duree a 0 et a 1 reglables. On a bien OCn qui est un signal PWM dont on
peut definir le rapport cyclique en mettant la bonne valeur dans OCRn.
Certains compteurs fonctionnent sur 16 bits. Ils presentent plusieurs avantages : ils peuvent
compter plus loin donc plus longtemps ; lors dune utilisation pour generer du PWM, la resolution
est plus elevee ; et surtout ils possedent deux comparateurs dont les seuils peuvent etre regles
differement, ce qui permet dobtenir sur les pattes OCnA et OCnB deux signaux PWM de
meme frequence mais de rapport cyclique different a laide dun seul Timer/Counter. Dans le
2 Les plus perspicaces auront remarque que lordre des numeros sur le port A est inverse par rapport aux numeros
des pattes. En realite, cela depend du port, certains sont dans le bon sens, dautres non. Voir dans la datasheet.
3 Un registre est une variable interne de huit bits, utilisee pour definir le comportement du microcontroleur ou
cas de Timer/Counter sur 16 bits, le registre TCNTn se decompose en deux registres TCNTnL et
TCNTnH tandis que OCRn se decompose en OCRnAL et OCRnAH pour le premier comparateur
et OCRnBL, OCRnBH pour le deuxieme comparateur.
Par exemple, lATmega128 possede un CAN fonctionnant sur 10 bits. Ce CAN peut convertir
jusqua 8 signaux analogiques par intermittence. Le temps maximum de conversion est de 260s
mais peut etre diminue en reduisant la resolution (nombre de bits du codage). Lechelle de tension
en entree est par defaut [0, V cc] mais peut etre passee a [0, Vref ] ou Vref V cc est une tension
appliquee a la patte Aref (no 62). A noter que les CAN peuvent etre configures pour ne faire
quune conversion ou pour convertir en continu la tension analogique, la conversion etant alors
reguilerement mise a jour selon la duree de conversion.
Les donnees sont transmises par trames de 7 a 13 bits. La trame a le format suivant :
D D D D D D D D D D D
(IDLE) D St 0 D 1 D 2 D 3 D 4 D [5] D [6] D [7] D [8] D [P] Sp1 [Sp2] D (St/IDLE)
D D D D D D D D D D D
Les elements entre crochets sont facultatifs, leur presence est definie par le developpeur. Le bit
de parite permet de verifier rapidement sil y a eu une erreur de transmission mais nest pas fiable
a 100%.
Le recepteur : des detection sur la patte RXDn dun bit Start valide (cest-a-dire a 0), chaque
bit de la trame est alors echantillone selon la frequence configuree ou selon lhorloge sur XCK,
et stocke dans un registre temporaire jusqua reception de la trame complete. Ensuite, la
valeur recue est deplacee dans le registre UDR accessible par le programme. Une interruption
peut etre declenchee lors de la fin de reception pour prevenir quune trame est arrivee. Si le
programme na pas lu une trame lorsquune deuxieme trame arrive, la premiere trame est
perdue. Si la transmission sest mal deroulee, par exemple si la trame est non conforme, si le
bit de parite nest pas correct ou si des donnees recues nont pas ete lues, divers drapeaux7
passent a 1 et les donnees erronees sont effacees.
Le generateur dhorloge : lors dune utilisation en mode synchrone, un generateur est declare
matre et lautre esclave. Le matre genere le signal dhorloge selon le debit souhaite et len-
voit sur la patte XCK du microcontroleur. Lhorloge esclave recoit ce signal dhorloge sur
sa patte XCK et lutilise pour echantilloner les trames ou les emettre au bon rythme. En
mode asynchrone, lUSART en reception se charge de synchroniser son horloge sur la trame
arrivante.
La configuration doit etre faite avant toute tentative denvoi de donnees et ne devra pas etre
changee tant que des donnees restent a emettre/recevoir. Il faut bien veiller a ce que la configuration
soit toujours identique sur les deux microcontroleurs pour le format de la trame, le debit et quen
mode synchrone les deux pattes SCK soient reliees et quun USART soit en matre et lautre en
esclave.
A noter que le retour au programme principal se fait via la commande assembleur reti et non
via ret comme pour un retour depuis une sous-fonction classique.
La programmation des
microcontroleurs en C
Normalement, a ce niveau, vous vous dtes : Que ca a lair bien les microcontroleurs, ce
doit etre trop dur a programmer. Et bien, vous vous trompez ! Evidement si lon etait oblige de
programmer en assembleur, ce serait galere. Mais heureusement, les microcontroleurs AVR ont
lavantage de disposer de moultes compilateurs, ce qui permet de programmer en C, ce qui est,
vous lavouerez, tout de meme plus facile.
Parmis ces compilateurs, il y a entre autres1 : GCC AVR - compilateur sous license GNU
cest-a-dire libre dutilisation ; Imagecraft - alias ICC AVR ; et CodeVision AVR. Si GCC AVR est
gratuit, il a le gros desavantage de fonctionner sans interface graphique mais a laide de MakeFile.
Les aficionados de la programmation en C sous Linux ne seront guere genes mais moi si. Cest
pourquoi jai choisi dutiliser une version de demonstration dImagecraft, les limitations de cette
demo netant guere genant pour de petits projets.
Pour les adeptes de Linux, reportez-vous aux rapports de mes predecesseurs a cette adresse :
http://resel.enst-bretagne.fr/club/em6/site_2002/index.php3?corps=doc.
Si vous etes prets, nous allons pouvoir commencer. Un projet est souvent compose de plusieurs
fichiers quil faut regroupe. Pour cela, on cree un ... Project ! Dans le menu Project, choisissez
New. Creez un repertoire ou vous voulez que le projet soit stocke puis donnez-lui son nom2 . Pour
lexemple qui suit, vous prendrez comme repertoire debut et comme nom de projet debut. Ouvrez
le projet ainsi cree via Project/Open. Ensuite faites File/New et vous pouvez commencer a ecrire
du code.
Maintenant que tout est pret pour commencer a programmer, je vous propose de faire un
programme qui consiste a faire clignoter une LED3 . Dabord, choisissons ou sera connecte cette
1 Voir sur http://www.avrfreaks.net pour plus de details
2 ICC AVR ne gere pas les noms de fichiers longs. Pour creer un projet dans un repertoire donc le chemin
dacces contient des caracteres illicites pour des noms de fichiers courts, il faut donner dans la case Nom du fichier
larborescence complete en format nom de fichier court. Par exemple C:\mesdoc~1\codeav~1\debut.prj
3 LED est le sigle anglais pour Diode Electro-Luminescente, cest une petite ampoule.
11
12 CHAPITRE II. LA PROGRAMMATION DES MICROCONTROLEURS EN C
Nous avons vu dans le paragraphe sur les entrees/sorties, en page 5, que les pattes pouvaient
servir a la fois dentree ou de sortie. Ici il faut dire au microcontroleur que la patte PA0 est une
sortie. Il faut donc mettre le bit 0 de DDRA a 1. La premiere instruction de notre programme est
donc :
DDRA=0x01;
En effet 0x indique que le nombre est en hexadecimal. Donc 0x01=00000001 en binaire6 . On
voit bien7 que le bit 0 de DDRA est mis a 1. PA0 est desormais une sortie pour le microcontroleur.
Le point-virgule ; sert a indiquer que linstruction est finie.
Certains doivent se dire que cest genial, que le compilateur comprend tout de suite ce que
DDRA signifie. Et bien non. En realite le registre DRRA, comme tous les registres, est un endroit
de la memoire dont lemplacement change selon le microcontroleur sur lequel on travaille. Il faut
donc preciser au compilateur quel microcontroleur est utilise afin quil puisse remplacer DDRA par
son adresse memoire. Heureusement pour nous, pas besoin de redefinir a chaque fois les adresses de
tous les registres utilises, il suffit de mettre au tout debut du programme, avant mema la fonction
main, la declaration suivante :
#include <iom128v.h>
La commande #include permet dinserer dans le programme sur lequel on travaille des portions
de code definis dans un autre fichier, en loccurence iom182v.h
Maintenant il faut allumer la LED. Pour cela, il faut mettre a 1 le bit 0 de PORTA. Ce qui se
fait via :
PORTA=0x01;
Etant donnee la vitesse dexecution8 , il faut patienter un peu avant deteindre la LED. On
utilise pour cela une boucle qui ne fait rien :
for(i=0;i<10000;i++);
La boucle for compte depuis i=0 tant que i<10000 en faisant i++ , cest-a-dire en augmentant i
de 1 a chaque boucle. i ne tombe pas du ciel et doit etre declare au debut de la fonction afin que
le compilateur sache ce quest i. On mettra donc la declaration suivante avant DDRA=0x01 ; :
int i ;
4 Souvenez-vous, PA0 est la patte no 0 du port A, numerote 51
5 int = entier en anglais
6 Voir en annexe, page 33 pour la conversion hexadedimal/binaire/decimal
7 Les bits sont numerotes de droite a gauche. En effet, le bit 0 est le bit le moins important et est donc mis le
plus a droite, tout comme les unites sont places a droite des dizaines, eux-memes a droite des centaines...
8 A 16 MHz, il faut 62.5ns pour faire linstruction precedente.
II.2. LA SEPARATION DE CODE EN PLUSIEURS FICHIERS ET QUELQUES
FONCTIONS UTILES 13
Ainsi le compilateur sait que i est un entier.
PORTA=0x00 ;
f o r ( i =0; i <10000; i ++);
Il faut maintenant recommencer a allumer, attendre, eteindre, attendre... Pour cela, on englobe
les 4 dernieres instructions dans un bloc :
while ( 1 ) {
les 4 instructions
}
Il reste a finir la fonction main par } et le programme est termine. Voici le programme au
complet :
Sauvegardez le code (File/Save) dans le fichier code.c par exemple. Ensuite, indiquez quel
microcontroleur est utilise via le menu Project/Option/Target/Device Configuration. Indi-
quez maintenant que le fichier code.c fait partie du projet en cliquant doit sur Files dans la partie
droite de votre ecran et en selectionnant Add Files... Il ne reste plus qua compile a laide de
la touche F9 ou via le menu Project/Make Project. Si aucune erreur napparait dans le bas de
votre ecran, vous avez programme votre premier projet sur microcontroleur AVR. Felicitations !
Vous pouvez passer a la simulation, en page 19, ou alors en apprendre plus sur la programmation
C en continuant ci-dessous.
x|=(1<<n);
En effet, linstruction x|=y realise linstruction x=(x OU y), car | est la traduction de OU en C.
On peut de meme ecrire x+=3 pour augmenter x de 3. Ensuite (x<<m) rajoute m zeros a la fin
de x et enleve les m premiers bits au debut de x. Ainsi par exemple par exemple (6<<3) devient
00110000 car 6 en binaire est 00000110.
Une macro10 ne se termine pas par un point-virgule car celui-ci sera mis par le developpeur
dans son programme lors de lappel de cet macro. Il est possible de faire une macro sur plusieurs
lignes selon le format suivant :
Cette fois des ; sont mis car, je le rappele, le compilateur ne fait que remplacer le nom de la macro
par sa definition.
#endif
9 Loperation OU se fait bit a bit avec les regles suivantes : (0 OU 0)=0 ; (0 OU 1)=1 ; (1 OU 0)=1 ; (1 OU 1)=1
10 Une macro est une fonction ecrite a laide dun #define
II.3. LES INTERRUPTIONS AVEC IMAGECRAFT AVR 15
Enregistrez ce fichier sous le nom fonctions utiles.h dans le repertoire debut. Pourquoi .h
alors quavant cetait debut.c ? Et bien parce que la regle veut que les fichiers secondaires soient
dans un header. Mais dans un header, on ne peut ecrire que des #define et non du code. Dans
ce cas, on separe les #define quon met dans un .h et les portions de code quon met dans un .c
qui porte le meme nom que le .h.
Ensuite clic droit sur Header dans la partie droite de votre ecran puis Add Files... pour
ajouter les fonctions utiles au projet. Puis il faut dire au programme principal quil a le droit
dutiliser ce fichier. Cela se fait en mettant :
#include fonctions utiles.h
juste apres les autres #include. Les plus observateurs auront remarque que lont a mis des guille-
mets au lieu de <> comme a la page 12. Les <> signifient que le fichier se trouve dans le repertoire
ou est installe le compilateur alors que les guillemets indiquent que le fichier est dans le meme
repertoire que le projet.
On peut maintenant utiliser les macros SET BIT et CLEAR BIT dans la fonction main. Par
exemple :
SET BIT(DDRA,0);
pour mettre a 1 le bit 0 de DDRA.
Lors du declenchement dune interruption, le programme principal est interrompu et une cer-
taine fonction sexecute. Dans notre cas, cette fonction va allumer la LED, appelons-la allume si
vous le voulez bien. Si tous les #include ont ete correctement fait, la fonction secrit facilement
par :
void a l l u m e ( )
{ SET BIT (PORTA, 0 ) ; }
Il faut maintenant dire au compilateur que cest cette fonction qui doit etre appelees lors de
linterruption externe. Pour cela, Imagecraft possede la declaration :
#pragma interrupt handler nom de la fonction:iv nom de linterruption.
#pragma i n t e r r u p t h a n d l e r a l l u m e : iv INT0
void a l l u m e ( )
{
SET BIT (PORTA, 0 ) ;
}
Les valeurs attribuees a EICRA, EICRB, EIMSK, TIMSK et ETIMSK sont trouvees dapres
la datasheet. asm(sei) est explique dans le paragraphe suivant. Le compilateur se charge de
terminer la fonction traitant une interruption par linstruction reti au lieu dun ret habituel,
le developpeur na rien a se soucie. Dans lexemple donne, le microcontroleur execute sans cesse
linstruction while(1), cest-a-dire ne fait rien. Des que la patte PD0 passe a 1, la fonction allume()
est appelee. Lorsquelle se termine, le microcontroleur retourne ou il setait arrete, cest-a-dire a
linstruction while(1).
communication USART sans avoir a ouvrir la datasheet du microcontroleur pour trouver quels
registres doivent etre initialises et avec quelles valeurs.
Jai remarque quelques problemes avec le compilateur au sujet de la gestion des entiers longs.
En effet, si les operations sur les int et les float ne posent aucuns problemes, il nen est pas de meme
pour les long. Si vous souhaitez faire des calculs sur de grands entiers, preferez donc lutilisation
de float partout. Ce probleme est facilement reperable grace a la simulation des programmes, ce
que je vais vous presenter dans le chapitre suivant.
18 CHAPITRE II. LA PROGRAMMATION DES MICROCONTROLEURS EN C
Chapitre III
Apres avoir ecrit son code, on aimerait bien voir comment les instructions senchanent pour
voir si tout fonctionne comme prevu. Cela se fait grace a AVR Studio 4, logiciel gratuit developpe
par ATMEL. Courrez le telcharger sur http://www.atmel.com/atmel/products/prod203.htm
puis installez-le.
1 Si ce nest pas la premiere fois que vous ouvrez le fichier, AVR Studio 4 vous signale que ce fichier est deja
associe a un projet et vous demande si vous voulez ouvrir ce projet. Repondez oui a moins que vous ne vouliez
retomber sur la fenetre affichee ci-dessus.
19
20 CHAPITRE III. LA SIMULATION DES PROGAMMES
III.2 Workspace
Cest la que vous pouvez voir letat de votre microcontroleur. Vous pouvez ainsi voir les valeurs
de tous les registres du microcontroleur mais aussi les modifier en temps reel. A cote de chaque
registre se trouvent des cases symbolisant les bits du registre. La premiere case est le bit 7 du
registre2 et ainsi de suite. Si la case est coloriee, le bit est a 1, il est a 0 sinon. Dans lexemple
donne, PORTA=0x21, soit le bit 0 et 5 a 1.
2 Rappelez-vous que les bits sont representes dans lordre inverse : page 12
III.3. PROGRAMME EN COURS 21
Un autre outil important de cette fenetre est la Stop Watch. Cest un chronometre quon remet
a zero en cliquant droit dessus et en choisissant Reset StopWatch. Cela permet de savoir le temps
ecoule entre deux instructions quelconques. Attention, le calcul est fait a une certaine frequence
dhorloge, visible juste au-dessus de la Stop Watch. La frequence de lhorloge peut etre modifiee
via le menu Debug/AVR Simulation Options.
Cest la quon peut suivre ou en est le programme dans son deroulement. La prochaine instruc-
tion a etre executee est indiquee par la fleche jaune. Cest ici quon peut placer des Breakpoints3 .
Pour mettre un Breakpoint ou en enlever un, il suffit de faire un clic droit sur linstruction ou lon
souhaite installer/enlever un Breakpoint puis de choisir Toggle Breakpoint.
Un autre outil tres utile accessible depuis cette fenetre est de pouvoir suivre en temps reel la
valeur des variables du programme. Pour cela, on selectionne cette variable, on clique droit et on
choisit Add To Watch. Cest ce qui a ete fait dans lexemple pour la variable i.
Run : Permet dexecuter le programme. Dans ce mode, le Workspace et la fenetre Watch sont
inacessibles. Ce mode se termine soit en cliquant sur Break, soit lorsque le logiciel rencontre
un Breakpoint. Ce mode est tres utile pour sortir de boucles dattente de longue duree en
mettant un Breakpoint sur la premiere instruction apres la boucle. Associe a la Stop Watch,
on peut savoir la duree de la boule (cf. page 21).
Break : Permet dinterrompre lexecution du programme lors quon est en mode Run ou AutoStep.
Reset : Comme son nom lindique, recommence le programme depuis le debut.
Step Into : Mode pas-a-pas. Execute la seule instruction indiquee par la fleche jaune. Si cette
instruction fait appel a une sous-fonction, la fenetre du programme en cours souvre sur cette
sous-fonction et le developpeur peut executer les instructions de cette sous-fonction en mode
pas-a-pas.
Step Over : Mode pas-a-pas egalement, mais a la difference de Step Into sil y a appel dune
sous-fonction, celle-ci est executee entierement sans que le developpeur ne puisse suivre son
deroulement.
Step Out : Termine la fonction en cours dexecution puis retourne au programme qui la appelee
en redonnant la main au developpeur.
Run To Cursor : Execute le programme jusquau curseur4 .
AutoStep : Equivalent a Run mais ici le developpeur voit le Workspace et la fenetre Watch.
Le deroulement est plus lent quen mode Run mais on peut voir ce qui se passe dans le
microcontroleur ou les variables du programme.
Si tout marche comme il faut sur le papier et sur la simulation, passons aux choses serieuses et
voyons ce que ca donne dans la realite. Et bien cest la que les choses se gatent et je dois avouer
que le chemin jusquau microcontroleur fonctionnel est long et seme dembuches. Mais avec ce
document, tout devrait aller (enfin, jespere). Construisons donc une carte pour programmer cet
ATmega128. Cette programmation ce fera via un cable AVR ISP, disponible chez de nombreux
fournisseurs de materiel electronique.
IV.1 Lalimentation
Le microcontroleur est alimente en 0V - 5V, aussi stable que possible. Evidement, on relie les
masses ensemble sur le 0V dune part, et les Vcc ensemble sur le 5V dautre part. De plus, doivent
etre aussi reliees a Vcc deux pattes : AV cc - lalimentation du convertisseur analogique-numerique
- et P EN - inutilise pour la programmation via AVR ISP.
IV.2 Lhorloge
Plusieurs solutions soffrent a vous pour cadencer le microcontroleur. On verra plus loin com-
ment indiquer au microcontroleur la solution choisie, en page 27
Locillateur interne : Certains microcontroleurs de la famille AVR possedent un oscillateur in-
terne, par exemple lATmega128 en possede quatre fonctionnant a 1, 2, 4 ou 8 MHz. Cette
solution offre lavantage detre facile a mettre en oeuvre (rien a faire) mais a linconvenient
davoir une frequence instable selon la tension dalimentation, la temperature, etc... et sur-
tout de ne pas pouvoir fonctionner jusquau 16 MHz maximum de lATmega128.
Lhorloge externe : Il suffit de fournir un signal carre sur la patte XTAL1, mais encore faut-il
pouvoir le generer ce signal.
Loscillateur RC externe : Cette solution presente lavantage de pouvoir aller plus haut en
frequence (jusque 12 MHz sur lATmega128) et de choisir des frequences autres que celles de
loscillateur interne mais presente encore le gros inconvenient detre instable en temperature
et tension dalimentation.
Le quartz ou le resonnateur : Cest la solution pour etre precis, stable et atteindre les 16 MHz
mais peut presenter des difficultes de mise en oeuvre. Les quartz a deux pattes se branche sur
XTAL1 et XTAL2 avec deux condensateurs entre chaque pattes et la masse, comme indique
sur le schema ci-dessous.
23
CHAPITRE IV. LIMPLEMENTATION REELLE SUR LE
24 MICROCONTROLEUR
Et cest ces capacites qui posent problemes. Selon leur valeur, le quartz peut fonctionner
ou non. Et leur valeur, identique pour les deux condensateurs, depend du quartz, du micro-
controleur et des pistes qui rejoignent le tout. Et pour verifier si le quartz fonctionne, loscil-
loscope nest daucune utilite puisquil rajoute des capacites parasites, il est donc necessaire
dutiliser un analyseur logique. En pratique, 22pF semble etre une valeur qui marche bien,
mais si ce nest le cas, il va falloir tester plusieurs valeurs jusqua ce que ca fonctionne.
En tous cas, limitez au maximum la longueur des pistes entre les condensateurs, le quartz
et le microcontroleur. Certains quartz a 4 pattes ainsi que les resonnateurs possedent deja
des capacites integrees mais fonctionneront a des frequences moins precises et seront plus
instables. Pour plus de renseignements, se reporter a http://www.avrfreaks.com/Freaks/
Articles/ColinOFlynn/intro.php.
Fig. IV.2 Connecteur du cable AVR ISP, a brancher sur la carte de microcontroleur, vue 2D
broches napporte rien, on utilisera le connecteur 6 broches. Et vu que ce dessin nest pas tres
clair, en voila un plus beau :
IV.3. LE PORT DE PROGRAMMATION 25
Fig. IV.3 Connecteur du cable AVR ISP, a brancher sur la carte de microcontroleur, vue 3D
Si vous comptez utiliser les broches SCK, PDI et PDO du microcontroleur pour les brancher a
quelquechose dautre, une petite precaution simpose. Soit deconnecter ce quelquechose au moment
de la programmation, soit faire le montage suivant pour chaque broche :
Fig. IV.5 Connection des pattes PDI et PDO au connecteur AVR ISP
Ca y est, la carte est prete, tout est soude, alors allons-y. Nous allons implementer le programme
debut fait dans la partie sur la programmation en C, en page 11. Pour cela, il faut bien sur brancher
le cable AVR ISP sur lordinateur, lautre cote sur la carte electronique, puis lancer AVR Studio
4 1 et charger le projet debut comme indique a la page 19. Enfin, mettez sous alimentation votre
montage. ATTENTION : il faut imperativement brancher le cable AVR ISP avant dalimenter
le circuit, sous peine de voir la cable griller. Maintenant, sous AVR Studio 4, cliquez sur le bouton
suivant :
et un menu compose de 6 onglets apparait. Voici les onglets, que nous allons regarder maintenant :
Program : Choisissez dans Device le microcontroleur que vous utilisez. Indiquez ensuite que
vous programmez le microcontroleur via ISP. Les menus Flash et EEPROM permettent de
1 ou AVR Studio 3, dapres ma remarque au debut du chapitre 3, page 19, linterface etant sensiblement la meme
IV.4. COMMENT IMPLEMENTER NOTRE PROGRAMME DANS LE
MICROCONTROLEUR 27
Voila, vous savez tout ce que vous avez besoin de savoir pour faire un projet sur les micro-
controleurs AVR dATMEL. Je tiens a remercier tout ceux qui mont aide et soutenu lors de la
decouverte de ces microcontroleurs. Parmi eux, les membres de mon equipe : Francois BARRE,
Vincent BORREL, Guillaume DUPUY, Thomas LEFEVRE, Arnaud LESUEUR, Jean-Baptiste
RICHARD et Benjamin SARDA ainsi que les anciens de la robotique a lENST Bretagne : Pascal
LEGRAND, Samuel MESCOFF, Sebastien ROY, Luc SORGUE et Nicolas TORNERI.
Si vous avez des commentaires, suggestions ou si vous avez un texte a rajouter a ce document,
je me ferai un plaisir den tenir compte. Envoyez-moi un simple mail a
juillot_guillaume@hotmail.com
29
30 LE MOT DE LA FIN
Annexe A
Schema de lATmega128
31
32 ANNEXE A. SCHEMA DE LATMEGA128
Annexe B
Conversion
hexadecimal/binaire/decimal
Conversion binaire/hexadecimal
3. Et pour finir on colle ensemble les deux symboles hexadecimal pour trouver la conversion.
Suivez les etapes en sens inverse pour convertir un nombre hexadecimal en binaire.
33
ANNEXE B. CONVERSION HEXADECIMAL/BINAIRE/DECIMAL
0x.0 0x.1 0x.2 0x.3 0x.4 0x.5 0x.6 0x.7 0x.8 0x.9 0x.A 0x.B 0x.C 0x.D 0x.E 0x.F
0x0. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0x1. 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
0x2. 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
0x3. 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
0x4. 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
0x5. 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
0x6. 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
0x7. 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
0x8. 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
Conversion hexadecimal/decimal
0x9. 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
0xA. 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
0xB. 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
0xC. 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
0xD. 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
0xE. 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
0xF. 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
34
Annexe C
Aide a la programmation
35
36 ANNEXE C. AIDE A LA PROGRAMMATION
OCRnAH, OCRnAL
utilises pour generer des interruptions en cours de comptage
OCRnBH, OCRnBL
(voir C.7)
OCRnCH, OCRnCL
OCRnxH
forment par concatenation OCRnx=65536*OCRnxH+OCRnxL
OCRnxL
OCRnx
rapport cyclique nx = ou resolution {8, 9, 10} selon la configuration choisie
2resolution
TCCRnA, Timer Counter Control Register A
bit 7 6 5 4 3 2 1 0
TCCRnA COMnA COMnB COMnC WGMn
WGMn Resolution
COMnx Description
01 8 bits
00 OCnx non utilise
10 9 bits
10 OCnx utilise
11 10 bits
C.11 USART
Dans ce qui suit, n vaut 0 ou 1 selon lUSART considere. Format de la trame : voir page 7
UDRn, USARTn Data Register : destination des donnees recues ou origine des donnees a
envoyer
UCSRnA, USARTn Control and Status Register A : non utilise pour la configuration
UCSRnB, USARTn Control and Status Register B
bit 7 6 5 4 3 2 1 0
UCSRnB RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n
RXCIEn : a 1 pour permettre le declenchement dune interruption lors dune reception
terminee
TCCIEn : a 1 pour permettre le declenchement dune interruption lors dune emission ter-
minee
UDRIEn : a 1 pour permettre le declenchement dune interruption lorsque lemetteur est
pret a emettre
RXENn : a 1 pour autoriser la reception
TXENn : a 1 pour autoriser lemission
UCSZn2 : a 1 pour indiquer une trame de 9 bits, a 0 si 8 bits ou moins
RXB8n : 9eme a la reception si utilisation dune trame de 9 bits. A lire avant UDRn
TXB8n : 9eme a lemission si utilisation dune trame de 9 bits. A ecrire avant UDRn
UBRRnH
forment par concatenation UBRRn=65536*UBRRnH+UBRRnL
UBRRnL
UBRRn, USARTn Baud Rate Register : valeur maximale = 0x0FFF
Calcul du debit Calcul de
Mode
en bits/s (bps) UBRRn
f f
Asynchrone U BRRn = BAU D = 1
16(U BRRn + 1) 16 BAU D
f f
Synchrone U BRRn = BAU D = 1
2(U BRRn + 1) 2 BAU D
41
42 ADRESSES INTERNET UTILES
Index
Mise en pratique, 23
alimentation, 23
configurer le microcontroleur, 27
horloge, 23
implementation du programme dans le
microcontroleur, 27
port de programmation, 24
quartz, 23
SCK, MISO, MOSI, PDI, PDO, 25
soudure des composants, 26
Mode deconomie denergie, voir Sleep Mode
Port, 5
PWM, 6
43