Vous êtes sur la page 1sur 45

La programmation des ATMEL AVR

JUILLOT Guillaume

2 septembre 2003
Table des matieres

Introduction 3

I Les microcontroleurs AVR pour les nuls 5


I.1 Quest-ce quun microcontroleur ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
I.2 Les entrees/sorties dun microcontroleur . . . . . . . . . . . . . . . . . . . . . . . . 5
I.3 Timers/Counters et generation de PWM . . . . . . . . . . . . . . . . . . . . . . . . 6
I.4 Convertisseurs analogique/numerique . . . . . . . . . . . . . . . . . . . . . . . . . . 7
I.5 Communication serie USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
I.6 Comparateur analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
I.7 Watchdog Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
I.8 Modes deconomie denergie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
I.9 Interruptions internes et externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

II La programmation des microcontroleurs en C 11


II.1 Debuter avec Imagecraft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
II.2 La separation de code en plusieurs fichiers et quelques fonctions utiles . . . . . . . 13
II.2.1 La definition de fonctions utiles a laide de #define . . . . . . . . . . . . . . 14
II.2.2 Rajouter un fichier a un projet . . . . . . . . . . . . . . . . . . . . . . . . . 14
II.3 Les interruptions avec ImageCraft AVR . . . . . . . . . . . . . . . . . . . . . . . . 15
II.4 Lassembleur dans un programme en C . . . . . . . . . . . . . . . . . . . . . . . . . 16
II.5 Quelques complements sur le compilateur ICC AVR . . . . . . . . . . . . . . . . . 16

III La simulation des progammes 19


III.1 Premiers pas avec AVR Studio 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
III.2 Workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
III.3 Programme en cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
III.4 Controle du deroulement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
III.5 Choix de la vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
III.6 Output view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

IV Limplementation reelle sur le microcontroleur 23


IV.1 Lalimentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
IV.2 Lhorloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
IV.3 Le port de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
IV.4 Comment implementer notre programme dans le microcontroleur . . . . . . . . . . 26

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

Adresses Internet utiles 41

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 microcontroleurs AVR pour


les nuls

Les microcontroleurs de la famille AVR dATMEL possedent de nombreuses caracteristiques


differentes, aussi bien en termes de vitesse, memoire, nombre dentres/sorties mais aussi au niveau
des fonctions particulieres qui sont disponibles. Il conviendra donc de choisir le microcontroleur
en fonction de lutilisation qui est a faire - par exemple, il est conseille deviter dutiliser un
ATmega128 si lon ne cherche qua generer un PWM1 .

I.1 Quest-ce quun microcontroleur ?


Un microcontroleur est compose dun microprocesseur, de memoire ROM pour stocker le
programme et dune memoire RAM volatile pour conserver les resultats intermediaires lors de
lexecution du programme.
Mais les microcontroleurs possedent des avantages incomparables pour linformatique em-
barquee par rapport aux microprocesseurs. Ce sont dabord les broches qui peuvent servirent
dentrees/sorties mais surtout toutes les fonctions peripheriques. En effet, selon le microcontroleur
considere, on peut trouver :
plusieurs Timers/Counters
Generation de signaux PWM
Nombreux convertisseurs analogiques/numeriques
Communication serie USART
Comparateur analogique
Watchdog Timer
Oscillateur RC interne
Modes deconomies denergie
Interruptions internes et externes

I.2 Les entrees/sorties dun microcontroleur


La plupart des pattes dun microcontroleur peuvent servir soit dentrees, soit de sorties, et ce
choix peut changer a tout instant comme le veut le developpeur.

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

(tempshaut /tempsbas ), cest-a-dire avec un temps a 1 different du temps a 0.

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.

I.3 Timers/Counters et generation de PWM


Les Timers/Counters, notes TCNTn ou n est le numero Timer/Counter, sont des compteurs
cadences selon une certaine frequence definie. Lorsquil atteint son maximum (MAX5 ), il passe a 0
et recommence a compter. Ce passage de MAX a 0 peut saccompagner dune interruption interne
(cf. Interruptions internes et externes en page 9).
A ces Timers/Counters se rajoutent un comparateur dont on peut definir le seuil a laide du
registre OCRn. Lorsque le TCNTn atteint la valeur de OCRn, alors la patte OCn change de va-
leur, passant de 0 a 1 ou de 1 a 0 selon la configuration puis retournant a la valeur initiale lorsque
TCNTn passe de MAX a 0.

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.

Plusieurs registres sont utilises pour configurer les Timers/Counters :


TCCRn, OCRn, ASSR, TIMSK et TIFR. Leurs configurations sont compliquees, il convient de
se reporter aux chapitres correspondants de la datasheet. La valeur du Timer/Counter, accessible
via le registre TCNTn, peut etre modifiee a tout instant afin de reinitialiser ma sequence a partir
dune certaine valeur, apres avoir atteint MAX, le compteur recommencera a 0. A noter que la
frequence de comptage peut etre un sous-multiple de la frequence du microcontroleur ou encore
etre imposee par une horloge externe connectee a une patte du microcontroleur.

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

pour savoir dans quel etat il se trouve.


4 x represente la lettre du port, par exemple DDRA ou DDRB ...
5 pour un compteur sur m bits, alors MAX = 2m 1
I.4. CONVERTISSEURS ANALOGIQUE/NUMERIQUE 7

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.

I.4 Convertisseurs analogique/numerique


Le monde reel etant continu, cest-a-dire analogique, tandis que les microcontroleurs fonc-
tionnent en numerique, il faut bien avoir une interface entre les deux : le convertisseur analogi-
que/numerique6 . Son fonctionnement est simple a comprendre : a intervalles de temps reguliers,
la tension analogique est mesuree puis arrondie afin de pouvoir etre convertie en numerique. La
conversion est donc dautant plus fidele que le nombre de bits du codage est eleve et est inversement
proportionnelle a la plage de tension analogique en entree. Les microcontroleurs de la famille AVR
possedent des convertisseurs embarques donc il nest pas necessaire den concevoir ou den acheter.

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.

I.5 Communication serie USART


USART est labrevation pour Universal Synchronous and Asynchronous serial Receiver and
Transmitter, cest un systeme de communication point-a-point tres flexible.

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

St : bit de depart, toujours a 0 Sp : bit(s) de fin, toujours a 1


n : bits de donnees
P : bit de parite IDLE : pas de transfert, la ligne doit etre a 1

Fig. I.1 Trame USART

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%.

LUSART se decompose en trois parties :


Lemetteur : se charge demettre sur la patte TXDn, a la frequence configuree, la trame selon la
valeur stockee dans le registre UDR ; il soccupe donc automatiquement de la generation des
bits Start, Stop et eventuellement Parity. Des interruptions peuvent etre declenchees lorsque
la transmission est terminee.
6 en abrege, CAN ou ADC en anglais pour Analog to Digital Converter
8 CHAPITRE I. LES MICROCONTROLEURS AVR POUR LES NULS

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.

I.6 Comparateur analogique


Outre les convertisseurs analogiques/numeriques, les microcontroleurs AVR possedent un com-
parateur analogique. Celui-ci compare les deux tensions appliquees aux pattes AIN0 et AIN1. Si
AIN 0 < AIN 1 alors le bit ACO (5eme bit du registre ACSR) passe a 1. Sinon, ACO reste a 0.
De plus, une interruption peut etre declenchee lors du passage a 1 de ACO.

I.7 Watchdog Timer


Le Watchdog Timer se charge de faire des RESET a intervalle de temps regulier. Il utilise un
oscillateur RC interne en tant quhorloge cadencee a 1MHz. Ce systeme permet de recommencer le
meme programme a intervalles de temps reguliers ou encore de se reveiller dun mode deconomie
denergie apres un certain lapse de temps (voir paragraphe suivant). A noter que la memoire RAM
nest pas perdu au cours de ce RESET, ce qui permet daugmenter le temps entre deux reexecution
du programme en tenant a jour un compteur qui est decremente a chaque Watchdog Reset jusqua
ce quil atteigne 0 et alors on commence reellement le programme.

I.8 Modes deconomie denergie


Certaines applications ne necessitent pas que le microcontroleur tourne continuellement. Il
serait donc souhaitable de le desactiver, de lendormir, pour quil consomme aussi peu denergie
que possible. Ceci est possible grace aux Sleep Mode. Plusieurs modes sont disponibles, afin de
pouvoir endormir ce dont on na pas besoin et de conserver ce qui doit letre.
Une fois configure, il suffit pour entrer dans le mode denregie dexecuter linstruction SLEEP.
La sortie du mode se fait via une interruption externe ou interne, selon le mode utilise.
7 Un drapeau est un bit indiquant quun evenement sest produit.
I.9. INTERRUPTIONS INTERNES ET EXTERNES 9

I.9 Interruptions internes et externes


Certains evenements peuvent intervenir a nimporte quel instant et doivent etre geres sans
attendre. Il est evident que de faire constament une batterie de tests pour voir si tel ou tel
evenement sest produit nest pas performant du tout. Les interruptions sont LA solution a ce
probleme. En effet, des quun evenement se produit, si linterruption est correctement configuree,
le microcontroleur arrete immediatement son execution pour executer une autre portion de code
gerant cet evenement. Des que cette portion de code a fini detre executee, le microcontroleur
retourne a son programme principal, a lendroit ou il lavait quitte.

Les interruptions possibles sont de deux types :


externe : lorsquune des pattes passe dans un certain etat ou tant que la patte est dans un etat
defini
interne : par exemple lorsque quun compteur depasse sa valeur maximale8 , lorsquun transfert
via USART est termine...

Plusieurs choses sont a faire pour configurer et utiliser les interruptions :


1. Pour les interruptions internes, configurer le registre correspondant pour declencher linter-
ruption ; par exemple pour declencher une interruption sur un Overflow du Timer/Counter0,
on configure le registre TIMSK en mettant le bit no 0, TOIE0, a 1.
2. Pour les interruptions externes, ce sont les registres EICRA, EICRB, EIMSK et EIFR quil
faut configurer pour quun certain etat sur une ou plusieurs des pattes INT0 a INT7 declenche
une interruption.
3. Il faut ensuite dire au microcontroleur ce quil doit executer. Pour cela, les premiers blocs
de memoire sont alloues a un Reset and Interrupt Vector. A chaque type dinterruption est
associe une adresse dans ce Vector ou le developpeur met une instruction jmp LABEL,
LABEL etant ladresse de la memoire ou se trouve le code a executer.
4. Ensuite, on programme le code qui doit etre execute en le mettant a ladresse LABEL definie
ci-dessus. Nous verrons dans le chapitre sur la programmation en C en page 15 comment ces
deux etapes peuvent etre realise facilement.
5. Il reste a activer la gestion des interruptions a laide de la commande assembleur sei. La
gestion des interruptions peut etre desactivee a laide de la commande assembleur cli.

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.

8 on appele cela Overflow


10 CHAPITRE I. LES MICROCONTROLEURS AVR POUR LES NULS
Chapitre II

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.

II.1 Debuter avec Imagecraft


Apres un detour sur http://www.imagecraft.com pour telecharger la demo dImagecraft et
apres lavoir installe, on le lance et les choses serieuses vont commencer.

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

DEL. Si personne ne sy oppose, je propose la patte PA04 .


Ensuite, il faut que le microcontroleur sache quelle portion de code executer au demarrage.
Pour cela, on inclue ce code dans la fonction main. Voici donc le debut de notre code :
void main(void){
Explications : main est lentree du programme, cest vers la que se dirigera le microcontroleur des sa
mise sous tension. void est un mot anglais signifiant rien. Place avant le nom de la fonction - ici
main -, void indique que le programme ne renvoie pas de resultat comme par exemple pourrait le
faire une fonction somme. Ensuite, entre parantheses se trouve les parametres de la fonction, cest-
a-dire ce que la fonction a besoin de connaitre. Ici void soit rien mais une fonction somme aura
besoin des deux nombres a additionner donc la fonction deviendrait : int somme(int n, int m)5 .
Le symbole { sert a indiquer le debut de la fonction. A la fin de la fonction, il faut mettre }.

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.

On peut desormais eteindre la LED et attendre a nouveau. On rajoute donc a la suite du


programme les instructions :

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
}

Ainsi les 4 dernieres instructions seront repetees eternellement.

Il reste a finir la fonction main par } et le programme est termine. Voici le programme au
complet :

#include <iom128v . h>

void main ( void )


{
int i ;
DDRA=0x01 ;
while ( 1 )
{
PORTA=0x01 ;
fo r ( i =0; i <10000; i ++);
PORTA=0x00 ;
for ( i =0; i <10000; i ++);
}
}

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.

II.2 La separation de code en plusieurs fichiers et quelques


fonctions utiles
Vous avez peut-etre remarque que dans le programme precedent les registres DDRA et PORTA
sont entierement modifies. Il y a des cas ou cela nest pas souhaite et ou on souhaite passer le bit
0 a 1 sans modifier les autres bits. Nous allons donc pour cela creer des fonctions supplementaires.
Mais ces fonctions ont de grandes chances detre necessaires dans un autre projet, et on a pas trop
envie de les reecrire le moment venu. Nous allons donc les mettre dans un fichier separe qui sera
inclus dans les projets qui en ont besoin.
14 CHAPITRE II. LA PROGRAMMATION DES MICROCONTROLEURS EN C

II.2.1 La definition de fonctions utiles a laide de #define


Comment faire pour passer le neme bit du registre x a 1 sans modifier les autres bits ? Le
registre x est de la forme ( y , y , y , neme bit , y , y , y , y ) ou y=0 ou 1. Il suffit de savoir9 que
(y OU 0)=y et que (y OU 1)=1. Il suffit donc de faire x OU ( 0 , 0 , 0 , 1 au neme bit , 0 , 0 , 0
, 0 ) pour obtenir le registre x identique sauf le neme bit qui est passe a 1. Ceci se fait en C par
linstruction :

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.

Presentons maintenant la declaration #define. Par exemple, #define x 3 placee au debut


du programme, entre les #include et la premiere fonction, indique au compilateur quil doit
remplacer tout les x quil trouve par un 3. Ce remplacement ne doit se faire que si x nest pas
definit, on met donc cette declaration dans un bloc :

#ifndef nom du bloc de definition


#define nom du bloc de definition
liste des definitions
#endif

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 :

#define nom de la macro \


instruction1 ; \
instrution2 ; \
...
derniere instruction

Cette fois des ; sont mis car, je le rappele, le compilateur ne fait que remplacer le nom de la macro
par sa definition.

II.2.2 Rajouter un fichier a un projet


Nous allons donc maintenant definir 4 fonctions tres utiles pour tout projet. Pour cela, apres
avoir relance et ouvert le projet debut si vous laviez quitte depuis, faites File/New. Entrez ensuite
les declarations suivantes :
#i f n d e f FONCTIONS UTILES
#define FONCTIONS UTILES

#define SET BIT ( o c t e t , b i t ) ( o c t e t |= (1<< b i t ) )


#define CLEAR BIT( o c t e t , b i t ) ( o c t e t &= (1<< b i t ) )
#define IS SET ( o c t e t , b i t ) ( ( o c t e t & (1<< b i t ) ) ! = 0 )
#define IS CLEAR ( o c t e t , b i t ) ( ( o c t e t & (1<< b i t ) ) = = 0 )

#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.

II.3 Les interruptions avec ImageCraft AVR


Nous avons vu, en page 9 que la gestion des interruptions est lourde a faire en assembleur.
Heureusement, le C et Imagecraft sont la pour nous aider. Si les etapes 1,2 et 5 restent inchangees,
voila comment faire pour soccuper des etapes 3 et 4. Pour lexemple, nous allons allumer une LED
sur PA0 des que la patte PD0 passe a 1, PD0 etant la patte correspondant a INT0, linterruption
externe no 0.

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.

Dans notre exemple, on aura donc :


#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 ;
Ainsi, linterruption INT0 executera la fonction allume quand elle se declenche.
16 CHAPITRE II. LA PROGRAMMATION DES MICROCONTROLEURS EN C

Reste a ecrire le reste et on obtient in fine :


#include <iom128v . h>
#include f o n c t i o n s u t i l e s . h

#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 ) ;
}

void main ( void )


{
SET BIT (DDRA, 0 ) ; // l a p a t t e 0 du p o r t A e s t une s o r t i e
CLEAR BIT(DDRD, 0 ) ; // l a p a t t e 0 du p o r t D e s t une e n t r e e
EICRA = 0 x03 ;
EICRB = 0 x00 ;
EIMSK = 0 x01 ;
TIMSK = 0 x00 ;
ETIMSK = 0 x00 ;
asm ( s e i ) ;
while ( 1 ) ;
}

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).

II.4 Lassembleur dans un programme en C


Il est parfois necessaire dinserer des commandes assembleur directement dans le code C. Cela se
fait via linstruction asm("instruction en assembleur") ; qui insere linstruction en assembleur
dans le code compile. Voici quelques exemples les plus frequents :
asm ( nop ) ; // i n s t r u c t i o n ne f a i s a n t r i e n pendant un c y c l e d h o r l o g e
asm ( s e i ) ; // l e s i n t e r r u p t i o n s s o n t p r i s e s en compte
asm ( c l i ) ; // l e s i n t e r r u p t i o n s ne s o n t p l u s p r i s e s en compte
Un autre cas ou le recours a lassembleur est necessaire est lorsque lon cherche a mettre
une temporisation dune duree precise. Dans ce cas, on na dautres choix que de regarder le
code compile en assembleur pour voir combien de temps nos instructions durent afin dadapter la
longueur de la boucle de temporisation.

II.5 Quelques complements sur le compilateur ICC AVR


Ce compilateur fournit un outil tres utile pour tous developpeurs : lApplication Builder qui
se trouve dans le menu Tools. Cet outil ecrit automatiquement les lignes de configurations du
microcontroleur selon les besoins que vous aurez specifies. Ainsi, il devient facile de demarrer
un projet necessitant la gestion de plusieurs Timers/Counters, dinterruptions multiples ou de
II.5. QUELQUES COMPLEMENTS SUR LE COMPILATEUR ICC AVR 17

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

La simulation des progammes

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.

La simulation est conforme au comportement reel du microcontroleur dans la mesure ou le


simulateur est correctement programme. A lheure ou jecris ces lignes, des bugs subsistent. Par
exemple, la gestion des Timer/Counter, et particulierement de la generation de signaux PWM, ne
marche absolument pas. Il ne faut donc pas sy fier dans ces domaines. De meme, limplementation
des programmes dans le microcontroleur via le cable AVR ISP (voir en page 23) presente parfois
certaines difficultes incomprehensibles. Ce dernier point peut etre resolu en utilisant conjointement
les version 3 et 4 de AVR Studio, la version 3 ne presentant aucun probleme avec AVR ISP.
Peut-etre ces problemes seront-ils resolus dans les futurs versions de AVR Studio 4 lorsque vous
souhaiterez lutiliser, alors essayez donc si la version 4 vous convient.

III.1 Premiers pas avec AVR Studio 4


Apres lavoir lance, faites File/Open et ouvrez le fichier debut.cof. Vous avez ensuite le menu
suivant qui saffiche1 :

ou vous choisissez AVR Simulator et ATmega128.

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

Apres avoir cliquez sur Finish, lecran suivant devrait apparaitre :

Voyons a quoi servent les differentes parties de cet ecran.

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.

III.3 Programme en cours

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.

III.4 Controle du deroulement

Cette barre controle le deroulement du programme. Les principaux boutons sont :


Start et Stop Debugging : Comme vous devez vous en doutez, ces deux boutons permettent
de commencer et darreter le deroulement du programme.
3 Points darret, voir Controle du deroulement en page 21
22 CHAPITRE III. LA SIMULATION DES PROGAMMES

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.

III.5 Choix de la vue

Register et Memory Window : Affichent la vue selectionnee dans la fenetre Workspace.


Watch : Affiche la fenetre Watch qui permet dafficher la valeur de variables choisies, voir page
21.
Toggle Disassembler Window : Permet dafficher le code assembleur dans la fenetre du pro-
gramme en cours et des lors dexecuter les instructions en assembleur au pas-a-pas. Tres utile
pour voir comment le programme a ete compile notamment pour connaitre les instructions
utilisees dans une boucle afin de pouvoir adapte le nombre doccurences pour obtenir une
duree precise.

III.6 Output view


Cette fenetre permet de voir si la simulation se deroule bien, par exemple sil ny a pas eu
derreurs de chargement du projet. En resume, cest la que seront affiches les messages provenant
du simulateur.

4 La barre verticale qui clignote a lendroit ou le texte tape est insere


Chapitre IV

Limplementation reelle sur le


microcontroleur

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

Fig. IV.1 Utilisation dun quartz

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.

IV.3 Le port de programmation


Les choses se compliquent encore plus maintenant car il faut dechiffrer la datasheet de lAT-
mega128 et de lAVR ISP, et ce ne sont pas des modeles de clarte. Le cable AVR ISP se branche
sur la carte de votre microcontroleur via un connecteur 6 ou 10 broches. Vu que la version 10

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

Voyons comment connecter ce cable au microcontroleur.


Vtg et Gnd : se connectent a lalimentation, Vtg etant bien entendu Vcc
Reset : Comme la barre lindique, cette patte du microcontroleur doit etre reliee en temps normal
a Vcc mais doit pouvoir etre forcee a 0 par AVR ISP. On utilise donc le montage suivant :

Fig. IV.4 Connection de la patte RESET au connecteur AVR ISP

SCK : Se connecte a la broche nommee SCK du microcontroleur soit PB1.


MOSI et MISO : Cest la que les choses sont bizarres. On se dit quil suffit de connecter le
MOSI du microcontroleur sur le MISO du cable et inversement. Et bien non ! Allez savoir
pourquoi, ATMEL a decide et ecrit au fin fond de la datasheet que pour lATmega128, MISO
du cable se connecte a PDO soit PE1 et que le MOSI du cable se connecte a PDI soit PE0.
Pour les autres microcontroleurs le probleme ne se pose pas.
CHAPITRE IV. LIMPLEMENTATION REELLE SUR LE
26 MICROCONTROLEUR

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

IV.4 Comment implementer notre programme dans le mi-


crocontroleur
Vous allez devoir quitter ce tutorial quelques jours le temps de realiser la carte et de souder
les composants. Voici un site tres utile sur la soudure de composants CMS :
http://home.nordnet.fr/~fthobois/les_cms.htm
Pour verifier la bonne soudure des pattes, utilisez un multimetre en testeur de continuite mais
attention, il faut eviter dappuyer sur les pattes du microcontroleur au risque de prendre un faux
contact pour une bonne soudure.

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

programmer les memoires correspondantes, soit le programme charge dans le simulateur,


soit un programme designe en chargeant le fichier .hex cree par le compilateur. La memoire
Flash est sauf exception, celle qui contient le programme.
Fuses : Ce menu permet de configurer le microcontroleur. Decochez dabord la compatibilite
ATmega103. Puis tout ce que vous avez a changer desormais est le type dhorloge que vous
souhaitez utiliser. A noter que si vous souhaitez utiliser un quartz a plus de 8 MHz, il faut
decocher CKOPT fuse.
LockBits : Attention, les changements ici peuvent etre irreversibles. Cest ici quon peut bloquer
definitivement la modification de certains parametres, voire bloquer toute programmation
ulterieure. Bref, on ne touche a rien.
Advanced : Ici vous pouvez eventuellement specifier le port serie utilise par AVR ISP, mais en
Auto, ca semble marcher tres bien. Sinon, un bon moyen de voir si le microcontroleur repond
est de lire sa signature et ainsi de sassurer que le microcontroleur est celui quon pensait.
Board : Je nai pas vraiment compris lutilite de cet onglet alors passons.
Auto : Permet dautomatiser certaines taches afin, dun seul clic, de pouvoir executer plusieurs
operations a la suite. On peut ainsi automatiser des taches repetitives.
CHAPITRE IV. LIMPLEMENTATION REELLE SUR LE
28 MICROCONTROLEUR
Le mot de la fin

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

B.0.1 Convention decriture

En decimal, notre base habituel, le nombre est ecrit comme dhabitude : 21

En hexadecimal, on le fait preceder dun 0x : 0x15

En binaire, on le termine par un b : 00010101b

Conversion binaire/hexadecimal

Pour convertir un octet binaire en une valeur hexadecimal, procedez ainsi :

1. Decouper votre octet en deux parties de 4 bits

2. Convertir les deux morceaux obtenus selon le tableau suivant :

binaire 0000 0001 0010 0011 0100 0101 0110 0111


hexadecimal 0 1 2 3 4 5 6 7
binaire 1000 1001 1010 1011 1100 1101 1110 1111
hexadecimal 8 9 A B C D E F

3. Et pour finir on colle ensemble les deux symboles hexadecimal pour trouver la conversion.

Par exemple : 01111101b


etape1
y 0111 et 1101
etape2
y 7 et D
etape3
y dou 01111101b = 0x7D

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

C.1 Type de donnees


Type Taille (octects) Domaine
unsigned char 1 0...255
signed char 1 -128...127
char (*) 1 0...255
unsigned short 2 0...65535
(signed) short 2 -32768...32767
unsigned int 2 0...65535
(signed) int 2 -32768...32767
pointer 2
unsigned long 4 0...4294967295
(signed) long 4 -2147483648...2147483647
float 4 +/-1.175e-38...3.40e+38
double 4 +/-1.175e-38...3.40e+38
(*) char est equivalent a unsigned char

C.2 Gestion des entrees/sorties


DDRx : Data Direction Register, bit a 0 pour que la patte correspondante soit une entree, a 1
pour une sortie
PORTx : pour changer la valeur des pattes en sortie
PINx : pour obtenir la valeur des pattes en entree
x est une lettre entre A et G indiquant le port considere.

C.3 Interruptions externes


EICRA, External Interrupt Control Register A
ISCn Interruption de INTn sur
bit 7 6 5 4 3 2 1 0 00 niveau bas
01 non disponible
EIRCA ISC3 ISC2 ISC1 ISC0
10 front descendant
11 front montant

35
36 ANNEXE C. AIDE A LA PROGRAMMATION

EICRB, External Interrupt Control Register B


ISCn Interruption de INTn sur
bit 7 6 5 4 3 2 1 0 00 niveau bas
01 front montant et front descendant
EIRCB ISC7 ISC6 ISC5 ISC4
10 front descendant
11 front montant

EIMSK, External Interrupt Mask


bit 7 6 5 4 3 2 1 0
EIMSK INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0
INTn a 1 pour que linterruption externe correspondante soit prise en compte.

C.4 Timer/Counter0 (8 bits)


TCNT0, Timer Counter Register : indique la valeur courante du Timer/Counter0
OCR0, Output Compare Register : peut etre utilise pour generer une interruption en cours de
comptage (voir C.7)
TCCR0, Timer Counter Control Register
TCCR0 Frequence de comptage Duree totale (*)
0x00 Timer/Counter0 arrete
0x01 clkI/0 16s
0x02 clkI/0 / 8 128s
0x03 clkI/0 / 32 512s
0x04 clkI/0 / 64 1, 024ms
0x05 clkI/0 / 128 2, 048ms
0x06 clkI/0 / 256 4, 096ms
0x07 clkI/0 / 1024 16, 384ms
(*) Duree entre deux retours a 0 pour un microcontroleur cadence a 16MHz

C.5 Timer/Counter2 (8 bits)


TCNT2, Timer Counter Register : indique la valeur courante du Timer/Counter2
OCR2, Output Compare Register : peut etre utilise pour generer une interruption en cours de
comptage (voir C.7)
TCCR2, Timer Counter Control Register
TCCR2 Frequence de comptage Duree totale (*)
0x00 Timer/Counter2 arrete
0x01 clkI/0 16s
0x02 clkI/0 / 8 128s
0x03 clkI/0 / 64 1, 024ms
0x04 clkI/0 / 256 4, 096ms
0x05 clkI/0 / 1024 16, 384ms
0x06 Horloge externe sur T2 (front descendant)
0x07 Horloge externe sur T2 (front montant)
(*) Duree entre deux retours a 0 pour un microcontroleur cadence a 16MHz
C.6. TIMER/COUNTER1 ET 3 (16 BITS) 37

C.6 Timer/Counter1 et 3 (16 bits)


TCNTnH et TCNTnL, Timer Counter Register High et Low : indique la valeur courante
du Timer/Counter


OCRnAH, OCRnAL
utilises pour generer des interruptions en cours de comptage
OCRnBH, OCRnBL
(voir C.7)
OCRnCH, OCRnCL

TCCRnA, Timer Counter Control Register A = 0x00


TCCRnB, Timer Counter Control Register B
TCCRnB Frequence de comptage Duree totale (*)
0x00 Timer/Counter2 arrete
0x01 clkI/0 4, 096ms
0x02 clkI/0 / 8 32, 768ms
0x03 clkI/0 / 64 262, 144ms
0x04 clkI/0 / 256 1, 048576s
0x05 clkI/0 / 1024 4, 194304s
0x06 Horloge externe sur Tn (front descendant)
0x07 Horloge externe sur Tn (front montant)
(*) Duree entre deux retours a 0 pour un microcontroleur cadence a 16MHz

C.7 Interruptions pour Timers/Counters


TIMSK, Timer Counter Interrupt Mask
bit 7 6 5 4 3 2 1 0
TIMSK Comp2 Over2 0 Comp1A Comp1B Over1 Comp0 Over0

ETIMSK, Extended Timer Counter Interrupt Mask


bit 7 6 5 4 3 2 1 0
ETIMSK 0 0 0 Comp3A Comp3B Over3 Comp3C Comp1C

Overn a 1 active linterruption dOverflow du Timer/Counter n, cest-a-dire quune interrup-


tion est declenche quand le Timer/Counter revient a la valeur 0
Compnx a 1 active linterruption de comparaison lorsque le Timer/Counter n atteint la valeur
du registre OCRnx

C.8 Generation de PWM sur OC0 (8 bits)


OCR0, Output Compare Register : permet de definir le rapport cyclique = temps OCR0
tempsbas = 256
haut

TCCR0, Timer Counter Control Register


TCCR0 Frequence du signal PWM Periode (*) Commentaire
0x68 Timer/Counter0 arrete A eviter
0x69 clkI/0 / 256 16s
0x6A clkI/0 / 2048 128s
0x6B clkI/0 / 8192 512s
0x6C clkI/0 / 16384 1, 024ms
0x6D clkI/0 / 32768 2, 048ms
0x6E clkI/0 / 65536 4, 096ms
0x6F clkI/0 / 262144 16, 384ms Recommande pour les servomoteurs
(*) Periode du signal PWM pour un microcontroleur cadence a 16MHz
38 ANNEXE C. AIDE A LA PROGRAMMATION

C.9 Generation de PWM sur OC2 (8 bits)


Attention, OC2 est commun avec une autre sortie PWM, OC1C
OCR2, Output Compare Register : permet de definir le rapport cyclique = temps
tempsbas =
haut OCR2
256
TCCR2, Timer Counter Control Register
TCCR2 Frequence du signal PWM Periode (*) Commentaire
0x68 Timer/Counter0 arrete A eviter
0x69 clkI/0 / 256 16s
0x6A clkI/0 / 2048 128s
0x6B clkI/0 / 16384 1, 024ms
0x6C clkI/0 / 65536 4, 096ms
0x6D clkI/0 / 262144 16, 384ms Servomoteurs
0x6E Horloge externe sur T2 (front descendant)
0x6F Horloge externe sur T2 (front montant)
(*) Periode du signal PWM pour un microcontroleur cadence a 16MHz

C.10 PWM sur OC1A, OC1B, OC1C, OC3A, OC3B et


OC3C (de 8 a 10 bits)
Dans ce qui suit, n vaut 1 ou 3 et x vaut A, B ou C


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

TCCRnB, Timer Counter Control Register B

8 bits 9 bits 10 bits


TCCRnB Frequence PWM
Frequence a 16MHz Frequence a 16MHz Frequence a 16MHz

clkI/O clkI/O clkI/O clkI/O


0x09 16s 32s 64s
2resolution 256 512 1024

clkI/O clkI/O clkI/O clkI/O


0x0A 128s 256s 512s
8 2resolution 2048 4096 8192

clkI/O clkI/O clkI/O clkI/O


0x0B 1, 024ms 2, 048ms 4, 096ms
64 2resolution 16384 32768 65536
C.11. USART 39

8 bits 9 bits 10 bits


TCCRnB Frequence PWM
Frequence a 16MHz Frequence a 16MHz Frequence a 16MHz

clkI/O clkI/O clkI/O clkI/O


0x0C 4, 096ms 8, 192ms 16,384ms
256 2resolution 65536 131072 262144

clkI/O clkI/O clkI/O clkI/O


0x0D 16,384ms 32, 768ms 65, 536ms
1024 2resolution 262144 524288 1048576

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

UCSRnC, USARTn Control and Status Register C


bit 7 6 5 4 3 2 1 0
UCSRnC 0 UMSELn UPMn USBSn UCSZn UCPOLn
UMSELn : a 0 pour communication asynchrone, a 1 pour synchrone
UPMn Bit de parite
00 desactive
UPMn :
10 pair
11 impair
USBSn : a 0 pour une trame a 1 bit Stop, a 1 pour 2 bits Stop
UCSZn Taille des donnees
00 5
UCSZn : 01 6
10 7
11 8 ou 9 selon UCSZn2 du registre USCRnB
UCPOLn : inutile en mode asynchrone, peu utile en mode synchrone, a mettre a 0
40 ANNEXE C. AIDE A LA PROGRAMMATION


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

Exemples de configuration Communication asynchrone, trame de 8 bits avec un bit de


parite pair, 9600 bps pour un microcontroleur cadence a 16MHz :
UCSRnC = 0x26 ; UBRRnL = 0x67 ; UBRRnH = 0x00 ;
Emetteur, sans interruption : UCSRnB = 0x08 ;
Emetteur, avec interruption : UCSRnB = 0x48 ;
Recepteur, sans interruption : UCSRnB = 0x10 ;
Recepteur, avec interruption : UCSRnB = 0x90 ;

Code C pour une trame de 8 bits ou moins, sans gestion dinterruptions


Emission :
while ( ! ( UCSRnA & (1<<UDREn ) ) ) ;
/ a t t e n t e de l i b e r a t i o n de l e m e t t e u r /
UDRn = d o n n e e a e n v o y e e r ;
Reception :
while ( ! ( UCSRnA & (1<<RXCn ) ) ) ;
/ a t t e n t e de r e c e p t i o n de donnees /
d o n n e e r e c u e = UDRn;
Adresses Internet utiles

resel.enst-bretagne.fr/club/em6 Pour suivre levolution du robot de lENST Bretagne et


obtenir une verion plus recente de ce tutorial.
resel.enst-bretagne.fr/club/em6/site 2002/index.php3?corps=doc Pour les linuxiens, un
tutorial sur la programmation des AVR avec AVR GCC.
www.atmel.com Le fabricant des microcontroleurs AVR.
www.avrfreaks.com Simplement le meilleur site dedie aux microcontroleurs AVR, si vous avez
des questions, allez-y sans tarder.
www.atmel.com/dyn/resources/prod documents/doc2467.pdf Cest ici que se trouve la data-
sheet de lATmega128.
www.atmel.com/dyn/products/tools card.asp?tool id=2726 La datasheet du cable de pro-
grammation AVR ISP.
www.imagecraft.com Pour obtenir une version de demonstration du compilateur utilise dans ce
tutorial.
www.atmel.com/dyn/products/tools card.asp?tool id=2725 Le programmateur/simulateur
AVR Studio 4.
home.nordnet.fr/fthobois/les cms.htm Un site pour vous aider a souder des composants
CMS.

41
42 ADRESSES INTERNET UTILES
Index

C (programmation en) Reexecution de programme, 8


.c et .h, 15 Registre, 6
#define, 14 DDRx, 6
#include, 12 OCRn, 6
#pragma, 15 PINx, 6
asm("..."), 16 PORTx, 6
et assembleur, 16 TCNTn, 6
for, 12 Reset
guillemets, 12 pour la programmation, 25
i++, 12 Watchdog Timer, 8
int, 13
interruption, 15 Simulation, 19
macro, 14 assembleur, 22
main, 12 breakpoint, 21
parametres dune fonction, 12 configuration, 19
point-virgule, 12 deroulement du programme, 21
void, 12 StopWatch, 21
while, 13 Workspace, 20
Comparateur analogique, 8 Sleep Mode, 8
Compilateurs, 11 sortie, 8
Convertion analogique/numerique, 7
Timer/Counter, 6
16 bits, 6
Economie denergie, voir Sleep Mode
Entree/sortie, 5 USART, 7
Interruption Watchdog Timer, 8
en assembleur, 9
en C, 15
generalites, 9
Timer/Counter, 6

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