En effet, selon le microcontrˆoleurconsid´er´e, on peut trouver : em-– plusieurs Timers/Counters – G´en´eration de signaux PWM – Nombreux convertisseurs analogiques/num´eriques – Communi
Trang 1La programmation des ATMEL AVR
JUILLOT Guillaume
2 septembre 2003
Trang 3Table des mati` eres
I.1 Qu’est-ce qu’un microcontrˆoleur ? 5
I.2 Les entr´ees/sorties d’un microcontrˆoleur 5
I.3 Timers/Counters et g´en´eration de PWM 6
I.4 Convertisseurs analogique/num´erique 7
I.5 Communication s´erie USART 7
I.6 Comparateur analogique 8
I.7 Watchdog Timer 8
I.8 Modes d’´economie d’´energie 8
I.9 Interruptions internes et externes 9
II La programmation des microcontrˆoleurs en C 11 II.1 D´ebuter avec Imagecraft 11
II.2 La s´eparation de code en plusieurs fichiers et quelques fonctions utiles 13
II.2.1 La d´efinition de fonctions utiles `a l’aide de #define 14
II.2.2 Rajouter un fichier `a un projet 14
II.3 Les interruptions avec ImageCraft AVR 15
II.4 L’assembleur dans un programme en C 16
II.5 Quelques compl´ements 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 Contrˆole du d´eroulement 21
III.5 Choix de la vue 22
III.6 Output view 22
IV L’impl´ementation r´eelle sur le microcontrˆoleur 23 IV.1 L’alimentation 23
IV.2 L’horloge 23
IV.3 Le port de programmation 24
IV.4 Comment impl´ementer notre programme dans le microcontrˆoleur 26
Le mot de la fin 29 A Sch´ema de l’ATmega128 31 B Conversion hexad´ecimal/binaire/d´ecimal 33 B.0.1 Convention d’´ecriture 33
1
Trang 42 TABLE DES MATI `ERES
C.1 Type de donn´ees 35
C.2 Gestion des entr´ees/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 G´en´eration de PWM sur OC0 (8 bits) 37
C.9 G´en´eration 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
Trang 5Ce document a ´et´e ´ecrit dans le cadre de la coupe 2003 de robotique e=M6 Il a pour but
de vous pr´esenter toutes les phases de d´eveloppement d’un projet sur les microcontrˆoleurs de lafamille AVR de chez ATMEL
Cette pr´esentation est d´ecompos´ee en quatre parties La premi`ere sera une description aussicompl`ete que possible des possibilit´es qu’offrent les microcontrˆoleurs choisis Suivront les rudi-ments de la programmation en C et en assembleur, `a l’aide du compilateur Imagecraft Un aspectimportant est la simulation du programme, qui se fera `a l’aide de AVR Studio 4 dans la troisi`emepartie du pr´esent document Je terminerai en pr´esentant la mise en pratique du programme enl’impl´ementant sur le microcontrˆoleur
Les exemples donn´es seront valables pour un ATmega128 Il est possible qu’ils ne soient plusvalables pour un autre microcontrˆoleur Dans tous les cas il est vivement recommand´ed’avoir une datasheet compl`ete de l’ATmega128 sous les yeux pour mieux pouvoirsuivre les exemples Utilisez ´egalement la datasheet d’un autre microcontrˆoleur si vous souhaitezadapt´e les exemples au microcontrˆoleur de votre choix
3
Trang 64 INTRODUCTION
Trang 7en fonction de l’utilisation qui est `a faire - par exemple, il est conseill´e d’´eviter d’utiliser unATmega128 si l’on ne cherche qu’`a g´en´erer un PWM1.
I.1 Qu’est-ce qu’un microcontrˆ oleur ?
Un microcontrˆoleur est compos´e d’un microprocesseur, de m´emoire ROM pour stocker leprogramme et d’une m´emoire RAM volatile pour conserver les r´esultats interm´ediaires lors del’ex´ecution du programme
Mais les microcontrˆoleurs poss`edent des avantages incomparables pour l’informatique barqu´ee par rapport aux microprocesseurs Ce sont d’abord les broches qui peuvent servirentd’entr´ees/sorties mais surtout toutes les fonctions p´eriph´eriques En effet, selon le microcontrˆoleurconsid´er´e, on peut trouver :
em-– plusieurs Timers/Counters
– G´en´eration de signaux PWM
– Nombreux convertisseurs analogiques/num´eriques
– Communication s´erie USART
– Comparateur analogique
– Watchdog Timer
– Oscillateur RC interne
– Modes d’´economies d’´energie
– Interruptions internes et externes
I.2 Les entr´ ees/sorties d’un microcontrˆ oleur
La plupart des pattes d’un microcontrˆoleur peuvent servir soit d’entr´ees, soit de sorties, et cechoix peut changer `a tout instant comme le veut le d´eveloppeur
Les entr´ees/sorties sont regroup´ees par huit et le groupement de huit pattes ainsi form´e estappel´e port et se voit attribu´e une lettre Par exemple, les broches 44 `a 51 forment le port A
1 PWM = Pulse Width Modulation, c’est un signal rectangulaire caract´ eris´ e par le rapport cyclique (tempshaut/tempsbas), c’est-` a-dire avec un temps ` a 1 diff´ erent du temps ` a 0.
5
Trang 86 CHAPITRE I LES MICROCONTR ˆOLEURS AVR POUR LES NULS
Chaque patte est ensuite num´erot´ee selon sa position au sein de ce port Par exemple, la broche
46 est appel´ee PA52 Trois registres3 servent `a g´erer les entr´ees/sorties :
– DDRx4 : indique quelles sont les pattes consid´er´ees comme des entr´ees et celles consid´er´eescomme des sorties Si le ni`eme bit de DDRx (not´e DDxn) est `a 1, alors la ni`eme patte duport x (not´ee Pxn) est consid´er´e comme une sortie Si DDxn est `a 0, alors Pxn est consid´er´eecomme une entr´ee
– PORTx : la valeur du ni`eme bit de PORTx (not´e PORTxn) d´efinit la valeur de sortie dePxn Si PORTxn=1, alors Pxn=+Vcc, si PORTxn=0, alors Pxn=Gnd
– PINx : la valeur du ni` emebit de PINx (not´e PINxn) est la valeur qui est appliqu´ee `a l’entr´ee
du microcontrˆoleur Par exemple, si on applique +Vcc `a Pxn, alors PINxn=1
La plupart des pattes poss`edent des fonctions p´eriph´eriques qui inhibent l’utilisation en tantqu’entr´ees/sorties Si l’on utilise les fonctions p´eriph´eriques, il ne faut en aucun cas modifier lesbits DDRxn, PORTxn et PINxn correspondants
I.3 Timers/Counters et g´ en´ eration de PWM
Les Timers/Counters, not´es TCNTn o`u n est le num´ero Timer/Counter, sont des compteurscadenc´es selon une certaine fr´equence d´efinie Lorsqu’il atteint son maximum (MAX5), il passe `a 0
et recommence `a compter Ce passage de MAX `a 0 peut s’accompagner d’une interruption interne(cf Interruptions internes et externes en page 9)
`
A ces Timers/Counters se rajoutent un comparateur dont on peut d´efinir le seuil `a l’aide duregistre 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 lorsqueTCNTn passe de MAX `a 0
Ces Timers/Counters peuvent donc avoir plusieurs utilisations D’abord, le programmeur peutsavoir le temps ´ecoul´e depuis qu’il a lanc´e le Timer/Counter Ou encore, l’interruption de passage
de MAX `a 0 peut ˆetre utilis´ee pour temporisation, et commencer ou arrˆeter un programme aubout d’un certain temps La derni`ere utilisation, tr`es utile en robotique pour la commande de ser-vomoteurs, est la g´en´eration 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 dur´ee `a 0 et `a 1 r´eglables On a bien OCn qui est un signal PWM dont onpeut d´efinir le rapport cyclique en mettant la bonne valeur dans OCRn
Plusieurs registres sont utilis´es pour configurer les Timers/Counters :
TCCRn, OCRn, ASSR, TIMSK et TIFR Leurs configurations sont compliqu´ees, il convient de
se reporter aux chapitres correspondants de la datasheet La valeur du Timer/Counter, accessiblevia le registre TCNTn, peut ˆetre modifi´ee `a tout instant afin de r´einitialiser ma s´equence `a partird’une certaine valeur, apr`es avoir atteint MAX, le compteur recommencera `a 0 `A noter que lafr´equence de comptage peut ˆetre un sous-multiple de la fr´equence du microcontrˆoleur ou encoreˆ
etre impos´ee par une horloge externe connect´ee `a une patte du microcontrˆoleur
Certains compteurs fonctionnent sur 16 bits Ils pr´esentent plusieurs avantages : ils peuventcompter plus loin donc plus longtemps ; lors d’une utilisation pour g´en´erer du PWM, la r´esolutionest plus ´elev´ee ; et surtout ils poss`edent deux comparateurs dont les seuils peuvent ˆetre r´egl´esdiff´erement, ce qui permet d’obtenir sur les pattes OCnA et OCnB deux signaux PWM de
mˆeme fr´equence mais de rapport cyclique diff´erent `a l’aide d’un seul Timer/Counter Dans le
2 Les plus perspicaces auront remarqu´ e que l’ordre des num´ eros sur le port A est invers´ e par rapport aux num´ eros des pattes En r´ ealit´ e, cela d´ epend du port, certains sont dans le bon sens, d’autres non Voir dans la datasheet.
3 Un registre est une variable interne de huit bits, utilis´ ee pour d´ efinir le comportement du microcontrˆ oleur ou pour savoir dans quel ´ etat il se trouve.
4 x repr´ esente la lettre du port, par exemple DDRA ou DDRB
5 pour un compteur sur m bits, alors MAX = 2 m − 1
Trang 9I.4 CONVERTISSEURS ANALOGIQUE/NUM ´ERIQUE 7
cas de Timer/Counter sur 16 bits, le registre TCNTn se d´ecompose en deux registres TCNTnL etTCNTnH tandis que OCRn se d´ecompose en OCRnAL et OCRnAH pour le premier comparateur
et OCRnBL, OCRnBH pour le deuxi`eme comparateur
I.4 Convertisseurs analogique/num´ erique
Le monde r´eel ´etant continu, c’est-`a-dire analogique, tandis que les microcontrˆoleurs tionnent en num´erique, il faut bien avoir une interface entre les deux : le convertisseur analogi-que/num´erique6 Son fonctionnement est simple `a comprendre : `a intervalles de temps r´eguliers,
fonc-la tension analogique est mesur´ee puis arrondie afin de pouvoir ˆetre convertie en num´erique Laconversion est donc d’autant plus fid`ele que le nombre de bits du codage est ´elev´e et est inversementproportionnelle `a la plage de tension analogique en entr´ee Les microcontrˆoleurs de la famille AVRposs`edent des convertisseurs embarqu´es donc il n’est pas n´ecessaire d’en concevoir ou d’en acheter.Par exemple, l’ATmega128 poss`ede un CAN fonctionnant sur 10 bits Ce CAN peut convertirjusqu’`a 8 signaux analogiques par intermittence Le temps maximum de conversion est de 260µsmais peut ˆetre diminu´e en r´eduisant la r´esolution (nombre de bits du codage) L’´echelle de tension
en entr´ee est par d´efaut [0, V cc] mais peut ˆetre pass´ee `a [0, Vref] o`u Vref ≤ V cc est une tensionappliqu´ee `a la patte Aref (no62) A noter que les CAN peuvent ˆetre configur´es pour ne fairequ’une conversion ou pour convertir en continu la tension analogique, la conversion ´etant alorsr´eguil`erement mise `a jour selon la dur´ee de conversion
I.5 Communication s´ erie USART
USART est l’abr´evation pour Universal Synchronous and Asynchronous serial Receiver andTransmitter, c’est un syst`eme de communication point-`a-point tr`es flexible
Les donn´ees sont transmises par trames de 7 `a 13 bits La trame a le format suivant :
DD
DDD
DDD
DDD
DDD
DDD
DDD
DDD
DDD
DDD(IDLE) St 0 1 2 3 4 [5] [6] [7] [8] [P] Sp1 [Sp2] (St/IDLE)
St : bit de d´epart, toujours `a 0
n : bits de donn´ees
L’USART se d´ecompose en trois parties :
L’´emetteur : se charge d’´emettre sur la patte TXDn, `a la fr´equence configur´ee, la trame selon lavaleur stock´ee dans le registre UDR ; il s’occupe donc automatiquement de la g´en´eration desbits Start, Stop et ´eventuellement Parity Des interruptions peuvent ˆetre d´eclench´ees lorsque
la transmission est termin´ee
6 en abr´ eg´ e, CAN ou ADC en anglais pour Analog to Digital Converter
Trang 108 CHAPITRE I LES MICROCONTR ˆOLEURS AVR POUR LES NULS
Le r´ecepteur : d`es d´etection sur la patte RXDn d’un bit Start valide (c’est-`a-dire `a 0), chaquebit de la trame est alors ´echantillon´e selon la fr´equence configur´ee ou selon l’horloge sur XCK,
et stock´e dans un registre temporaire jusqu’`a r´eception de la trame compl`ete Ensuite, lavaleur re¸cue est d´eplac´ee dans le registre UDR accessible par le programme Une interruptionpeut ˆetre d´eclench´ee lors de la fin de r´eception pour pr´evenir qu’une trame est arriv´ee Si leprogramme n’a pas lu une trame lorsqu’une deuxi`eme trame arrive, la premi`ere trame estperdue Si la transmission s’est mal d´eroul´ee, par exemple si la trame est non conforme, si lebit de parit´e n’est pas correct ou si des donn´ees re¸cues n’ont pas ´et´e lues, divers drapeaux7
passent `a 1 et les donn´ees erron´ees sont effac´ees
Le g´en´erateur d’horloge : lors d’une utilisation en mode synchrone, un g´en´erateur est d´eclar´emaˆıtre et l’autre esclave Le maˆıtre g´en`ere le signal d’horloge selon le d´ebit souhait´e et l’en-voit sur la patte XCK du microcontrˆoleur L’horloge esclave re¸coit ce signal d’horloge sur
sa patte XCK et l’utilise pour ´echantilloner les trames ou les ´emettre au bon rythme Enmode asynchrone, l’USART en reception se charge de synchroniser son horloge sur la tramearrivante
La configuration doit ˆetre faite avant toute tentative d’envoi de donn´ees et ne devra pas ˆetrechang´ee tant que des donn´ees restent `a ´emettre/recevoir Il faut bien veiller `a ce que la configurationsoit toujours identique sur les deux microcontrˆoleurs pour le format de la trame, le d´ebit et qu’enmode synchrone les deux pattes SCK soient reli´ees et qu’un USART soit en maˆıtre et l’autre enesclave
I.6 Comparateur analogique
Outre les convertisseurs analogiques/num´eriques, les microcontrˆoleurs AVR poss`edent un parateur analogique Celui-ci compare les deux tensions appliqu´ees aux pattes AIN0 et AIN1 SiAIN 0 < AIN 1 alors le bit ACO (5`eme bit du registre ACSR) passe `a 1 Sinon, ACO reste `a 0
com-De plus, une interruption peut ˆetre d´eclench´ee lors du passage `a 1 de ACO
I.7 Watchdog Timer
Le Watchdog Timer se charge de faire des RESET `a intervalle de temps r´egulier Il utilise unoscillateur RC interne en tant qu’horloge cadenc´ee `a 1MHz Ce syst`eme permet de recommencer le
mˆeme programme `a intervalles de temps r´eguliers ou encore de se r´eveiller d’un mode d’´economied’´energie apr`es un certain lapse de temps (voir paragraphe suivant) A noter que la m´emoire RAMn’est pas perdu au cours de ce RESET, ce qui permet d’augmenter le temps entre deux r´eex´ecution
du programme en tenant `a jour un compteur qui est d´ecr´ement´e `a chaque Watchdog Reset jusqu’`a
ce qu’il atteigne 0 et alors on commence r´eellement le programme
I.8 Modes d’´ economie d’´ energie
Certaines applications ne n´ecessitent pas que le microcontrˆoleur tourne continuellement Ilserait donc souhaitable de le d´esactiver, de ”l’endormir”, pour qu’il consomme aussi peu d’´energieque possible Ceci est possible grˆace aux Sleep Mode Plusieurs modes sont disponibles, afin depouvoir ”endormir” ce dont on n’a pas besoin et de conserver ce qui doit l’ˆetre
Une fois configur´e, il suffit pour entrer dans le mode d’´enregie d’ex´ecuter l’instruction SLEEP
La sortie du mode se fait via une interruption externe ou interne, selon le mode utilis´e
7 Un drapeau est un bit indiquant qu’un ´ ev` enement s’est produit.
Trang 11I.9 INTERRUPTIONS INTERNES ET EXTERNES 9
I.9 Interruptions internes et externes
Certains ´ev`enements peuvent intervenir `a n’importe quel instant et doivent ˆetre g´er´es sansattendre Il est ´evident que de faire constament une batterie de tests pour voir si tel ou tel
Les interruptions possibles sont de deux types :
externe : lorsqu’une des pattes passe dans un certain ´etat ou tant que la patte est dans un ´etatd´efini
interne : par exemple lorsque qu’un compteur d´epasse sa valeur maximale8, lorsqu’un transfertvia USART est termin´e
Plusieurs choses sont `a faire pour configurer et utiliser les interruptions :
1 Pour les interruptions internes, configurer le registre correspondant pour d´eclencher ruption ; par exemple pour d´eclencher une interruption sur un Overflow du Timer/Counter0,
l’inter-on cl’inter-onfigure le registre TIMSK en mettant le bit no0, TOIE0, `a 1
2 Pour les interruptions externes, ce sont les registres EICRA, EICRB, EIMSK et EIFR qu’ilfaut configurer pour qu’un certain ´etat sur une ou plusieurs des pattes INT0 `a INT7 d´eclencheune interruption
3 Il faut ensuite dire au microcontrˆoleur ce qu’il doit ex´ecuter Pour cela, les premiers blocs
de m´emoire sont allou´es `a un Reset and Interrupt Vector `A chaque type d’interruption estassoci´e une adresse dans ce Vector o`u le d´eveloppeur met une instruction ”jmp LABEL”,LABEL ´etant l’adresse de la m´emoire o`u se trouve le code `a ex´ecuter
4 Ensuite, on programme le code qui doit ˆetre ex´ecut´e en le mettant `a l’adresse LABEL d´efinieci-dessus Nous verrons dans le chapitre sur la programmation en C en page 15 comment cesdeux ´etapes peuvent ˆetre r´ealis´e facilement
5 Il reste `a activer la gestion des interruptions `a l’aide de la commande assembleur sei Lagestion des interruptions peut ˆetre desactiv´ee `a l’aide de la commande assembleur cli
A noter que le retour au programme principal se fait via la commande assembleur reti et nonvia ret comme pour un retour depuis une sous-fonction classique
8 on appele cela Overflow
Trang 1210 CHAPITRE I LES MICROCONTR ˆOLEURS AVR POUR LES NULS
Trang 13Parmis ces compilateurs, il y a entre autres1 : GCC AVR - compilateur sous license GNUc’est-`a-dire libre d’utilisation ; Imagecraft - alias ICC AVR ; et CodeVision AVR Si GCC AVR estgratuit, il a le gros d´esavantage de fonctionner sans interface graphique mais `a l’aide de MakeFile.Les aficionados de la programmation en C sous Linux ne seront gu`ere gˆen´es mais moi si C’estpourquoi j’ai choisi d’utiliser une version de d´emonstration d’Imagecraft, les limitations de cetted´emo n’´etant gu`ere gˆenant pour de petits projets.
Pour les adeptes de Linux, reportez-vous aux rapports de mes pr´edecesseurs `a cette adresse :http://resel.enst-bretagne.fr/club/em6/site_2002/index.php3?corps=doc
II.1 D´ ebuter avec Imagecraft
Apr`es un d´etour sur http://www.imagecraft.com pour t´el´echarger la d´emo d’Imagecraft etapr`es l’avoir install´e, on le lance et les choses s´erieuses vont commencer
Si vous ˆetes prˆets, nous allons pouvoir commencer Un projet est souvent compos´e de plusieursfichiers qu’il faut regroup´e Pour cela, on cr´ee un Project ! Dans le menu Project, choisissezNew Cr´eez un r´epertoire o`u vous voulez que le projet soit stock´e puis donnez-lui son nom2 Pourl’exemple qui suit, vous prendrez comme r´epertoire debut et comme nom de projet debut Ouvrez
le projet ainsi cr´e´e via Project/Open Ensuite faites File/New et vous pouvez commencer `a ´ecrire
du code
Maintenant que tout est prˆet pour commencer `a programmer, je vous propose de faire unprogramme qui consiste `a faire clignoter une LED3 D’abord, choisissons o`u sera connect´e cette
1 Voir sur http://www.avrfreaks.net pour plus de d´ etails
2 ICC AVR ne g` ere pas les noms de fichiers longs Pour cr´ eer un projet dans un r´ epertoire donc le chemin d’acc` es contient des caract` eres illicites pour des noms de fichiers courts, il faut donner dans la case Nom du fichier l’arborescence compl` ete 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, c’est une petite ampoule.
11
Trang 1412 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C
DEL Si personne ne s’y oppose, je propose la patte PA04
Ensuite, il faut que le microcontrˆoleur sache quelle portion de code ex´ecuter au d´emarrage.Pour cela, on inclue ce code dans la fonction main Voici donc le d´ebut de notre code :
void main(void){
Explications : main est l’entr´ee du programme, c’est vers l`a que se dirigera le microcontrˆoleur d`es samise sous tension void est un mot anglais signifiant ”rien” Plac´e avant le nom de la fonction - icimain -, void indique que le programme ne renvoie pas de r´esultat comme par exemple pourrait lefaire une fonction somme Ensuite, entre paranth`eses se trouve les param`etres de la fonction, c’est-
DDRA=0x01;
En effet 0x indique que le nombre est en h´exad´ecimal Donc 0x01=00000001 en binaire6 Onvoit bien7que le bit 0 de DDRA est mis `a 1 PA0 est d´esormais une sortie pour le microcontrˆoleur
Le point-virgule ” ;” sert `a indiquer que l’instruction est finie
Certains doivent se dire que c’est g´enial, que le compilateur comprend tout de suite ce queDDRA signifie Et bien non En r´ealit´e le registre DRRA, comme tous les registres, est un endroit
de la m´emoire dont l’emplacement change selon le microcontrˆoleur sur lequel on travaille Il fautdonc pr´eciser au compilateur quel microcontrˆoleur est utilis´e afin qu’il puisse remplacer DDRA parson adresse m´emoire Heureusement pour nous, pas besoin de red´efinir `a chaque fois les adresses detous les registres utilis´es, il suffit de mettre au tout d´ebut du programme, avant mˆema la fonctionmain, la d´eclaration suivante :
#include <iom128v.h>
La commande #include permet d’ins´erer dans le programme sur lequel on travaille des portions
de code d´efinis dans un autre fichier, en l’occurence iom182v.h
Maintenant il faut allumer la LED Pour cela, il faut mettre `a 1 le bit 0 de PORTA Ce qui sefait via :
PORTA=0x01;
Etant donn´ee la vitesse d’´execution8, il faut patienter un peu avant d’´eteindre la LED Onutilise 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++ , c’est-`a-dire en augmentant i
de 1 `a chaque boucle i ne tombe pas du ciel et doit ˆetre d´eclar´e au d´ebut de la fonction afin que
le compilateur sache ce qu’est i On mettra donc la d´eclaration suivante avant DDRA=0x01 ; :
int i ;
4 Souvenez-vous, PA0 est la patte n o 0 du port A, num´ erot´ e 51
5 int = entier en anglais
6 Voir en annexe, page 33 pour la conversion h´ exad´ edimal/binaire/d´ ecimal
7 Les bits sont num´ erot´ es 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 unit´ es sont plac´ es ` a droite des dizaines, eux-mˆ emes ` a droite des centaines
8 A 16 MHz, il faut 62.5ns pour faire l’instruction pr´ ec´ edente.
Trang 15II.2 LA S ´EPARATION DE CODE EN PLUSIEURS FICHIERS ET QUELQUES
Ainsi le compilateur sait que i est un entier
On peut d´esormais ´eteindre la LED et attendre `a nouveau On rajoute donc `a la suite duprogramme les instructions :
Ainsi les 4 derni`eres instructions seront r´ep´et´ees ´eternellement
Il reste `a finir la fonction main par } et le programme est termin´e Voici le programme aucomplet :
la touche F9 ou via le menu Project/Make Project Si aucune erreur n’apparait dans le bas devotre ´ecran, vous avez programm´e votre premier projet sur microcontrˆoleur AVR F´elicitations !Vous pouvez passer `a la simulation, en page 19, ou alors en apprendre plus sur la programmation
Trang 1614 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C
II.2.1 La d´ efinition de fonctions utiles ` a l’aide de #define
Comment faire pour passer le n` eme bit du registre x `a 1 sans modifier les autres bits ? Leregistre x est de la forme ( y , y , y , n` eme bit , y , y , y , y ) o`u 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 n` eme bit , 0 , 0 , 0, 0 ) pour obtenir le registre x identique sauf le n` eme bit qui est pass´e `a 1 Ceci se fait en C parl’instruction :
x|=(1<<n);
En effet, l’instruction x|=y r´ealise l’instruction x=(x OU y), car | est la traduction de OU en C
On peut de mˆeme ´ecrire x+=3 pour augmenter x de 3 Ensuite (x<<m) rajoute m z´eros `a la fin
de x et enl`eve les m premiers bits au d´ebut de x Ainsi par exemple par exemple (6<<3) devient
00110000 car 6 en binaire est 00000110
Pr´esentons maintenant la d´eclaration #define Par exemple, #define x 3 plac´ee au d´ebut
du programme, entre les #include et la premi`ere fonction, indique au compilateur qu’il doitremplacer tout les x qu’il trouve par un 3 Ce remplacement ne doit se faire que si x n’est pasd´efinit, on met donc cette d´eclaration dans un bloc :
#ifndef nom du bloc de d´efinition
#define nom du bloc de d´efinition
liste des d´efinitions
#endifUne macro10 ne se termine pas par un point-virgule car celui-ci sera mis par le d´eveloppeurdans son programme lors de l’appel de cet macro Il est possible de faire une macro sur plusieurslignes selon le format suivant :
#define nom de la macro \instruction1 ; \instrution2 ; \
derni`ere instructionCette fois des ; sont mis car, je le rappele, le compilateur ne fait que remplacer le nom de la macropar sa d´efinition
II.2.2 Rajouter un fichier ` a un projet
Nous allons donc maintenant d´efinir 4 fonctions tr`es utiles pour tout projet Pour cela, apr`esavoir relanc´e et ouvert le projet debut si vous l’aviez quitt´e depuis, faites File/New Entrez ensuiteles d´eclarations 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 L’op´ eration OU se fait bit ` a bit avec les r` egles 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 l’aide d’un #define
Trang 17II.3 LES INTERRUPTIONS AVEC IMAGECRAFT AVR 15
Enregistrez ce fichier sous le nom fonctions utiles.h dans le r´epertoire debut Pourquoi halors qu’avant c’´etait debut.c ? Et bien parce que la r`egle veut que les fichiers secondaires soientdans un ”header” Mais dans un header, on ne peut ´ecrire que des #define et non du code Dans
ce cas, on s´epare les #define qu’on met dans un h et les portions de code qu’on met dans un cqui porte le mˆeme nom que le h
Ensuite clic droit sur Header dans la partie droite de votre ´ecran puis Add Files pourajouter les fonctions utiles au projet Puis il faut dire au programme principal qu’il a le droitd’utiliser ce fichier Cela se fait en mettant :
#include ”fonctions utiles.h”
juste apr`es les autres #include Les plus observateurs auront remarqu´e que l’ont a mis des mets au lieu de <> comme `a la page 12 Les <> signifient que le fichier se trouve dans le r´epertoireo`u est install´e le compilateur alors que les guillemets indiquent que le fichier est dans le mˆemer´epertoire que le projet
guille-On peut maintenant utiliser les macros SET BIT et CLEAR BIT dans la fonction main Parexemple :
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 l`a pour nous aider Si les ´etapes 1,2 et 5 restent inchang´ees,voil`a comment faire pour s’occuper des ´etapes 3 et 4 Pour l’exemple, nous allons allumer une LEDsur PA0 d`es que la patte PD0 passe `a 1, PD0 ´etant la patte correspondant `a INT0, l’interruptionexterne no0
Lors du d´eclenchement d’une interruption, le programme principal est interrompu et une taine fonction s’ex´ecute Dans notre cas, cette fonction va allumer la LED, appelons-la allume sivous le voulez bien Si tous les #include ont ´et´e correctement fait, la fonction s’´ecrit facilementpar :
cer-void a l l u m e ( )
{ SET BIT (PORTA, 0 ) ; }
Il faut maintenant dire au compilateur que c’est cette fonction qui doit ˆetre appel´ees lors del’interruption externe Pour cela, Imagecraft poss`ede la d´eclaration :
#pragma interrupt handler nom de la fonction:iv nom de l’interruption
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, l’interruption INT0 ex´ecutera la fonction allume quand elle se d´eclenche
Trang 1816 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C
Reste `a ´ecrire le reste et on obtient in fine :
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
Les valeurs attribu´ees `a EICRA, EICRB, EIMSK, TIMSK et ETIMSK sont trouv´ees d’apr`es
la datasheet asm(”sei”) est expliqu´e dans le paragraphe suivant Le compilateur se charge determiner la fonction traitant une interruption par l’instruction reti au lieu d’un ret habituel,
le d´eveloppeur n’a rien `a se souci´e Dans l’exemple donn´e, le microcontrˆoleur ex´ecute sans cessel’instruction while(1), c’est-`a-dire ne fait rien D`es que la patte PD0 passe `a 1, la fonction allume()est appel´ee Lorsqu’elle se termine, le microcontrˆoleur retourne o`u il s’´etait arrˆet´e, c’est-`a-dire `al’instruction while(1)
II.4 L’assembleur dans un programme en C
Il est parfois n´ecessaire d’ins´erer des commandes assembleur directement dans le code C Cela sefait via l’instruction asm("instruction en assembleur") ; qui ins`ere l’instruction en assembleurdans le code compil´e Voici quelques exemples les plus fr´equents :
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 p e n d a n t un c y c l e d ’ h o r l o g easm ( ” 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 o`u le recours `a l’assembleur est n´ecessaire est lorsque l’on cherche `a mettreune temporisation d’une dur´ee pr´ecise Dans ce cas, on n’a d’autres choix que de regarder lecode compil´e en assembleur pour voir combien de temps nos instructions durent afin d’adapter lalongueur de la boucle de temporisation
II.5 Quelques compl´ ements sur le compilateur ICC AVR
Ce compilateur fournit un outil tr`es utile pour tous d´eveloppeurs : l’Application Builder qui
se trouve dans le menu Tools Cet outil ´ecrit automatiquement les lignes de configurations dumicrocontrˆoleur selon les besoins que vous aurez sp´ecifi´es Ainsi, il devient facile de d´emarrer
un projet n´ecessitant la gestion de plusieurs Timers/Counters, d’interruptions multiples ou de
Trang 19II.5 QUELQUES COMPL ´EMENTS SUR LE COMPILATEUR ICC AVR 17
communication USART sans avoir `a ouvrir la datasheet du microcontrˆoleur pour trouver quelsregistres doivent ˆetre initialis´es et avec quelles valeurs
J’ai remarqu´e quelques probl`emes avec le compilateur au sujet de la gestion des entiers longs
En effet, si les op´erations sur les int et les float ne posent aucuns probl`emes, il n’en est pas de mˆemepour les long Si vous souhaitez faire des calculs sur de grands entiers, pr´ef´erez donc l’utilisation
de float partout Ce probl`eme est facilement rep´erable grˆace `a la simulation des programmes, ceque je vais vous pr´esenter dans le chapitre suivant
Trang 2018 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C
Trang 21Chapitre III
La simulation des progammes
Apr`es avoir ´ecrit son code, on aimerait bien voir comment les instructions s’enchaˆınent pourvoir si tout fonctionne comme pr´evu Cela se fait grˆace `a AVR Studio 4, logiciel gratuit d´evelopp´epar ATMEL Courrez le t´el´charger sur http://www.atmel.com/atmel/products/prod203.htmpuis installez-le
La simulation est conforme au comportement r´eel du microcontrˆoleur dans la mesure o`u lesimulateur est correctement programm´e A l’heure o`u j’´ecris ces lignes, des bugs subsistent Parexemple, la gestion des Timer/Counter, et particuli`erement de la g´en´eration de signaux PWM, nemarche absolument pas Il ne faut donc pas s’y fier dans ces domaines De mˆeme, l’impl´ementationdes programmes dans le microcontrˆoleur via le cˆable AVR ISP (voir en page 23) pr´esente parfoiscertaines difficult´es incompr´ehensibles Ce dernier point peut ˆetre r´esolu en utilisant conjointementles version 3 et 4 de AVR Studio, la version 3 ne pr´esentant aucun probl`eme avec AVR ISP.Peut-ˆetre ces probl`emes seront-ils r´esolus dans les futurs versions de AVR Studio 4 lorsque voussouhaiterez l’utiliser, alors essayez donc si la version 4 vous convient
III.1 Premiers pas avec AVR Studio 4
Apr`es l’avoir lanc´e, faites File/Open et ouvrez le fichier debut.cof Vous avez ensuite le menusuivant qui s’affiche1 :
o`u vous choisissez AVR Simulator et ATmega128
1 Si ce n’est pas la premi` ere fois que vous ouvrez le fichier, AVR Studio 4 vous signale que ce fichier est d´ ej` a associ´ e ` a un projet et vous demande si vous voulez ouvrir ce projet R´ epondez oui ` a moins que vous ne vouliez retomber sur la fenˆ etre affich´ ee ci-dessus.
19
Trang 2220 CHAPITRE III LA SIMULATION DES PROGAMMES
Apr`es avoir cliquez sur Finish, l’´ecran suivant devrait apparaitre :
Voyons `a quoi servent les diff´erentes parties de cet ´ecran
III.2 Workspace
C’est l`a que vous pouvez voir l’´etat de votre microcontrˆoleur Vous pouvez ainsi voir les valeurs
de tous les registres du microcontrˆoleur mais aussi les modifier en temps r´eel A cˆot´e de chaqueregistre se trouvent des cases symbolisant les bits du registre La premi`ere case est le bit 7 duregistre2 et ainsi de suite Si la case est colori´ee, le bit est `a 1, il est `a 0 sinon Dans l’exempledonn´e, PORTA=0x21, soit le bit 0 et 5 `a 1
2 Rappelez-vous que les bits sont repr´ esent´ es dans l’ordre inverse : page 12