La programmation des ATMEL AVR - les-electroniciens.com · Table des mati`eres Introduction 3 I Les...
Transcript of La programmation des ATMEL AVR - les-electroniciens.com · Table des mati`eres Introduction 3 I Les...
Table des matieres
Introduction 3
I Les microcontroleurs AVR pour les nuls 5I.1 Qu’est-ce qu’un microcontroleur ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5I.2 Les entrees/sorties d’un microcontroleur . . . . . . . . . . . . . . . . . . . . . . . . 5I.3 Timers/Counters et generation de PWM . . . . . . . . . . . . . . . . . . . . . . . . 6I.4 Convertisseurs analogique/numerique . . . . . . . . . . . . . . . . . . . . . . . . . . 7I.5 Communication serie USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7I.6 Comparateur analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8I.7 Watchdog Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8I.8 Modes d’economie d’energie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8I.9 Interruptions internes et externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
II La programmation des microcontroleurs en C 11II.1 Debuter avec Imagecraft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11II.2 La separation de code en plusieurs fichiers et quelques fonctions utiles . . . . . . . 13
II.2.1 La definition de fonctions utiles a l’aide de #define . . . . . . . . . . . . . . 14II.2.2 Rajouter un fichier a un projet . . . . . . . . . . . . . . . . . . . . . . . . . 14
II.3 Les interruptions avec ImageCraft AVR . . . . . . . . . . . . . . . . . . . . . . . . 15II.4 L’assembleur dans un programme en C . . . . . . . . . . . . . . . . . . . . . . . . . 16II.5 Quelques complements sur le compilateur ICC AVR . . . . . . . . . . . . . . . . . 16
IIILa simulation des progammes 19III.1 Premiers pas avec AVR Studio 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19III.2 Workspace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20III.3 Programme en cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21III.4 Controle du deroulement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21III.5 Choix de la vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22III.6 Output view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
IV L’implementation reelle sur le microcontroleur 23IV.1 L’alimentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23IV.2 L’horloge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23IV.3 Le port de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24IV.4 Comment implementer notre programme dans le microcontroleur . . . . . . . . . . 26
Le mot de la fin 29
A Schema de l’ATmega128 31
B Conversion hexadecimal/binaire/decimal 33B.0.1 Convention d’ecriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1
2 TABLE DES MATIERES
C Aide a la programmation 35C.1 Type de donnees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35C.2 Gestion des entrees/sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35C.3 Interruptions externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35C.4 Timer/Counter0 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36C.5 Timer/Counter2 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36C.6 Timer/Counter1 et 3 (16 bits) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37C.7 Interruptions pour Timers/Counters . . . . . . . . . . . . . . . . . . . . . . . . . . 37C.8 Generation de PWM sur OC0 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . 37C.9 Generation de PWM sur OC2 (8 bits) . . . . . . . . . . . . . . . . . . . . . . . . . 38C.10 PWM sur OC1A, OC1B, OC1C, OC3A, OC3B et OC3C (de 8 a 10 bits) . . . . . 38C.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 butde vous presenter toutes les phases de developpement d’un projet sur les microcontroleurs de lafamille AVR de chez ATMEL.
Cette presentation est decomposee en quatre parties. La premiere sera une description aussicomplete que possible des possibilites qu’offrent les microcontroleurs 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 troisiemepartie du present document. Je terminerai en presentant la mise en pratique du programme enl’implementant sur le microcontroleur.
Les exemples donnes seront valables pour un ATmega128. Il est possible qu’ils ne soient plusvalables pour un autre microcontroleur. Dans tous les cas il est vivement recommanded’avoir une datasheet complete de l’ATmega128 sous les yeux pour mieux pouvoirsuivre les exemples. Utilisez egalement la datasheet d’un autre microcontroleur si vous souhaitezadapte les exemples au microcontroleur de votre choix.
3
Chapitre I
Les microcontroleurs AVR pourles nuls
Les microcontroleurs de la famille AVR d’ATMEL possedent de nombreuses caracteristiquesdifferentes, aussi bien en termes de vitesse, memoire, nombre d’entres/sorties mais aussi au niveaudes fonctions particulieres qui sont disponibles. Il conviendra donc de choisir le microcontroleuren fonction de l’utilisation qui est a faire - par exemple, il est conseille d’eviter d’utiliser unATmega128 si l’on ne cherche qu’a generer un PWM1.
I.1 Qu’est-ce qu’un microcontroleur ?
Un microcontroleur est compose d’un microprocesseur, de memoire ROM pour stocker leprogramme et d’une memoire RAM volatile pour conserver les resultats intermediaires lors del’execution du programme.
Mais les microcontroleurs possedent des avantages incomparables pour l’informatique em-barquee par rapport aux microprocesseurs. Ce sont d’abord les broches qui peuvent servirentd’entrees/sorties mais surtout toutes les fonctions peripheriques. En effet, selon le microcontroleurconsidere, 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 d’economies d’energie– Interruptions internes et externes
I.2 Les entrees/sorties d’un microcontroleur
La plupart des pattes d’un microcontroleur peuvent servir soit d’entrees, soit de sorties, et cechoix 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 estappele port et se voit attribue une lettre. Par exemple, les broches 44 a 51 forment le port A.
1PWM = Pulse Width Modulation, c’est un signal rectangulaire caracterise par le rapport cyclique(tempshaut/tempsbas), c’est-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 broche46 est appelee PA52. Trois registres3 servent a gerer les entrees/sorties :
– DDRx4 : indique quelles sont les pattes considerees comme des entrees et celles considereescomme des sorties. Si le nieme bit de DDRx (note DDxn) est a 1, alors la nieme patte duport x (notee Pxn) est considere comme une sortie. Si DDxn est a 0, alors Pxn est considereecomme une entree.
– PORTx : la valeur du nieme bit de PORTx (note PORTxn) definit la valeur de sortie dePxn. 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 l’entreedu microcontroleur. Par exemple, si on applique +Vcc a Pxn, alors PINxn=1.
La plupart des pattes possedent des fonctions peripheriques qui inhibent l’utilisation en tantqu’entrees/sorties. Si l’on utilise les fonctions peripheriques, il ne faut en aucun cas modifier lesbits 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 compteurscadences selon une certaine frequence definie. Lorsqu’il atteint son maximum (MAX5), il passe a 0et 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 definir 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 ecoule depuis qu’il a lance le Timer/Counter. Ou encore, l’interruption de passagede MAX a 0 peut etre utilisee pour temporisation, et commencer ou arreter un programme aubout d’un 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 lorsquele TCNTn atteint la valeur du comparateur OCRn, on obtient sur OCn un signal alternativementa 1 puis a 0 avec des duree a 0 et a 1 reglables. On a bien OCn qui est un signal PWM dont onpeut 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 dese reporter aux chapitres correspondants de la datasheet. La valeur du Timer/Counter, accessiblevia le registre TCNTn, peut etre modifiee a tout instant afin de reinitialiser ma sequence a partird’une certaine valeur, apres avoir atteint MAX, le compteur recommencera a 0. A noter que lafrequence de comptage peut etre un sous-multiple de la frequence du microcontroleur ou encoreetre imposee par une horloge externe connectee a une patte du microcontroleur.
Certains compteurs fonctionnent sur 16 bits. Ils presentent plusieurs avantages : ils peuventcompter plus loin donc plus longtemps ; lors d’une utilisation pour generer du PWM, la resolutionest plus elevee ; et surtout ils possedent deux comparateurs dont les seuils peuvent etre reglesdifferement, ce qui permet d’obtenir sur les pattes OCnA et OCnB deux signaux PWM dememe frequence mais de rapport cyclique different a l’aide d’un seul Timer/Counter. Dans le
2Les plus perspicaces auront remarque que l’ordre des numeros sur le port A est inverse par rapport aux numerosdes pattes. En realite, cela depend du port, certains sont dans le bon sens, d’autres non. Voir dans la datasheet.
3Un registre est une variable interne de huit bits, utilisee pour definir le comportement du microcontroleur oupour savoir dans quel etat il se trouve.
4x represente la lettre du port, par exemple DDRA ou DDRB ...5pour 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 etTCNTnH tandis que OCRn se decompose en OCRnAL et OCRnAH pour le premier comparateuret OCRnBL, OCRnBH pour le deuxieme comparateur.
I.4 Convertisseurs analogique/numerique
Le monde reel etant continu, c’est-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. Laconversion est donc d’autant plus fidele que le nombre de bits du codage est eleve et est inversementproportionnelle a la plage de tension analogique en entree. Les microcontroleurs de la famille AVRpossedent des convertisseurs embarques donc il n’est pas necessaire d’en concevoir ou d’en acheter.
Par exemple, l’ATmega128 possede 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 diminue en reduisant la resolution (nombre de bits du codage). L’echelle de tensionen entree est par defaut [0, V cc] mais peut etre passee a [0, Vref ] ou Vref ≤ V cc est une tensionappliquee a la patte Aref (no 62). A noter que les CAN peuvent etre configures pour ne fairequ’une conversion ou pour convertir en continu la tension analogique, la conversion etant alorsreguilerement mise a jour selon la duree de conversion.
I.5 Communication serie USART
USART est l’abrevation pour Universal Synchronous and Asynchronous serial Receiver andTransmitter, c’est 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 :
DDD �
��
���
���
���
���
���
���
���
���
���
���D
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 depart, toujours a 0n : bits de donneesP : bit de parite
Sp : bit(s) de fin, toujours a 1
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 bitde parite permet de verifier rapidement s’il y a eu une erreur de transmission mais n’est pas fiablea 100%.
L’USART se decompose en trois parties :
L’emetteur : se charge d’emettre sur la patte TXDn, a la frequence configuree, la trame selon lavaleur stockee dans le registre UDR ; il s’occupe donc automatiquement de la generation desbits Start, Stop et eventuellement Parity. Des interruptions peuvent etre declenchees lorsquela transmission est terminee.
6en 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 d’un bit Start valide (c’est-a-dire a 0), chaquebit de la trame est alors echantillone selon la frequence configuree ou selon l’horloge sur XCK,et stocke dans un registre temporaire jusqu’a reception de la trame complete. Ensuite, lavaleur recue est deplacee dans le registre UDR accessible par le programme. Une interruptionpeut etre declenchee lors de la fin de reception pour prevenir qu’une trame est arrivee. Si leprogramme n’a pas lu une trame lorsqu’une deuxieme trame arrive, la premiere trame estperdue. Si la transmission s’est mal deroulee, par exemple si la trame est non conforme, si lebit de parite n’est pas correct ou si des donnees recues n’ont pas ete lues, divers drapeaux7
passent a 1 et les donnees erronees sont effacees.
Le generateur d’horloge : lors d’une utilisation en mode synchrone, un generateur est declaremaıtre et l’autre esclave. Le maıtre genere le signal d’horloge selon le debit souhaite et l’en-voit sur la patte XCK du microcontroleur. L’horloge esclave recoit ce signal d’horloge sursa 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 donnees et ne devra pas etrechangee tant que des donnees restent a emettre/recevoir. Il faut bien veiller a ce que la configurationsoit toujours identique sur les deux microcontroleurs pour le format de la trame, le debit et qu’enmode synchrone les deux pattes SCK soient reliees et qu’un USART soit en maıtre et l’autre enesclave.
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. SiAIN0 < AIN1 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 unoscillateur RC interne en tant qu’horloge cadencee a 1MHz. Ce systeme permet de recommencer lememe programme a intervalles de temps reguliers ou encore de se reveiller d’un mode d’economied’energie apres un certain lapse de temps (voir paragraphe suivant). A noter que la memoire RAMn’est pas perdu au cours de ce RESET, ce qui permet d’augmenter le temps entre deux reexecutiondu programme en tenant a jour un compteur qui est decremente a chaque Watchdog Reset jusqu’ace qu’il atteigne 0 et alors on commence reellement le programme.
I.8 Modes d’economie d’energie
Certaines applications ne necessitent pas que le microcontroleur tourne continuellement. Ilserait donc souhaitable de le desactiver, de ”l’endormir”, pour qu’il consomme aussi peu d’energieque possible. Ceci est possible grace 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 configure, il suffit pour entrer dans le mode d’enregie d’executer l’instruction SLEEP.La sortie du mode se fait via une interruption externe ou interne, selon le mode utilise.
7Un drapeau est un bit indiquant qu’un evenement s’est produit.
I.9. INTERRUPTIONS INTERNES ET EXTERNES 9
I.9 Interruptions internes et externes
Certains evenements peuvent intervenir a n’importe quel instant et doivent etre geres sansattendre. Il est evident que de faire constament une batterie de tests pour voir si tel ou televenement s’est produit n’est pas performant du tout. Les interruptions sont LA solution a ceprobleme. En effet, des qu’un evenement se produit, si l’interruption est correctement configuree,le microcontroleur arrete immediatement son execution pour executer une autre portion de codegerant cet evenement. Des que cette portion de code a fini d’etre executee, le microcontroleurretourne a son programme principal, a l’endroit ou il l’avait quitte.
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 etatdefini
interne : par exemple lorsque qu’un compteur depasse sa valeur maximale8, lorsqu’un transfertvia 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 l’inter-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 qu’ilfaut configurer pour qu’un certain etat sur une ou plusieurs des pattes INT0 a INT7 declencheune interruption.
3. Il faut ensuite dire au microcontroleur ce qu’il doit executer. Pour cela, les premiers blocsde memoire sont alloues a un Reset and Interrupt Vector. A chaque type d’interruption estassocie une adresse dans ce Vector ou le developpeur met une instruction ”jmp LABEL”,LABEL etant l’adresse de la memoire ou se trouve le code a executer.
4. Ensuite, on programme le code qui doit etre execute en le mettant a l’adresse LABEL definieci-dessus. Nous verrons dans le chapitre sur la programmation en C en page 15 comment cesdeux etapes peuvent etre realise facilement.
5. Il reste a activer la gestion des interruptions a l’aide de la commande assembleur sei. Lagestion des interruptions peut etre desactivee 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.
8on appele cela Overflow
Chapitre II
La programmation desmicrocontroleurs en C
Normalement, a ce niveau, vous vous dıtes : ”Que ca a l’air bien les microcontroleurs, cedoit etre trop dur a programmer.” Et bien, vous vous trompez ! Evidement si l’on etait oblige deprogrammer en assembleur, ce serait galere. Mais heureusement, les microcontroleurs AVR ontl’avantage de disposer de moultes compilateurs, ce qui permet de programmer en C, ce qui est,vous l’avouerez, tout de meme plus facile.
Parmis 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 desavantage de fonctionner sans interface graphique mais a l’aide de MakeFile.Les aficionados de la programmation en C sous Linux ne seront guere genes mais moi si. C’estpourquoi j’ai choisi d’utiliser une version de demonstration d’Imagecraft, les limitations de cettedemo n’etant 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 d’Imagecraft etapres l’avoir installe, on le lance et les choses serieuses vont commencer.
Si vous etes prets, nous allons pouvoir commencer. Un projet est souvent compose de plusieursfichiers qu’il faut regroupe. Pour cela, on cree un ... Project ! Dans le menu Project, choisissezNew. Creez un repertoire ou vous voulez que le projet soit stocke puis donnez-lui son nom2. Pourl’exemple qui suit, vous prendrez comme repertoire debut et comme nom de projet debut. Ouvrezle projet ainsi cree via Project/Open. Ensuite faites File/New et vous pouvez commencer a ecriredu code.
Maintenant que tout est pret pour commencer a programmer, je vous propose de faire unprogramme qui consiste a faire clignoter une LED3. D’abord, choisissons ou sera connecte cette
1Voir sur http://www.avrfreaks.net pour plus de details2ICC AVR ne gere pas les noms de fichiers longs. Pour creer un projet dans un repertoire donc le chemin
d’acces contient des caracteres illicites pour des noms de fichiers courts, il faut donner dans la case Nom du fichier
l’arborescence complete en format nom de fichier court. Par exemple C:\mesdoc~1\codeav~1\debut.prj3LED est le sigle anglais pour Diode Electro-Luminescente, c’est une petite ampoule.
11
12 CHAPITRE II. LA PROGRAMMATION DES MICROCONTROLEURS EN C
DEL. Si personne ne s’y 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 l’entree du programme, c’est vers la que se dirigera le microcontroleur des samise sous tension. void est un mot anglais signifiant ”rien”. Place avant le nom de la fonction - icimain -, void indique que le programme ne renvoie pas de resultat comme par exemple pourrait lefaire une fonction somme. Ensuite, entre parantheses se trouve les parametres de la fonction, c’est-a-dire ce que la fonction a besoin de connaitre. Ici void soit ”rien” mais une fonction somme aurabesoin 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 pouvaientservir a la fois d’entree ou de sortie. Ici il faut dire au microcontroleur que la patte PA0 est unesortie. Il faut donc mettre le bit 0 de DDRA a 1. La premiere instruction de notre programme estdonc :
DDRA=0x01;
En effet 0x indique que le nombre est en hexadecimal. Donc 0x01=00000001 en binaire6. Onvoit 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 l’instruction est finie.
Certains doivent se dire que c’est genial, que le compilateur comprend tout de suite ce queDDRA signifie. Et bien non. En realite le registre DRRA, comme tous les registres, est un endroitde la memoire dont l’emplacement change selon le microcontroleur sur lequel on travaille. Il fautdonc preciser au compilateur quel microcontroleur est utilise afin qu’il puisse remplacer DDRA parson adresse memoire. Heureusement pour nous, pas besoin de redefinir a chaque fois les adresses detous les registres utilises, il suffit de mettre au tout debut du programme, avant mema la fonctionmain, la declaration suivante :
#include <iom128v.h>
La commande #include permet d’inserer dans le programme sur lequel on travaille des portionsde code definis 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 donnee 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 ide 1 a chaque boucle. i ne tombe pas du ciel et doit etre declare au debut de la fonction afin quele compilateur sache ce qu’est i. On mettra donc la declaration suivante avant DDRA=0x01 ; :
int i ;4Souvenez-vous, PA0 est la patte no 0 du port A, numerote 515int = entier en anglais6Voir en annexe, page 33 pour la conversion hexadedimal/binaire/decimal7Les 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...8A 16 MHz, il faut 62.5ns pour faire l’instruction precedente.
II.2. LA SEPARATION DE CODE EN PLUSIEURS FICHIERS ET QUELQUESFONCTIONS 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 duprogramme les instructions :
PORTA=0x00 ;for ( i =0; i <10000; i ++);
Il faut maintenant recommencer a allumer, attendre, eteindre, attendre... Pour cela, on englobeles 4 dernieres instructions dans un bloc :
while (1){l e s 4 i n s t r u c t i o n s}
Ainsi les 4 dernieres instructions seront repetees eternellement.
Il reste a finir la fonction main par } et le programme est termine. Voici le programme aucomplet :
#include < iom128v . h>
void main (void ){
int i ;DDRA=0x01 ;while (1 ){
PORTA=0x01 ;for ( 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 quelmicrocontroleur 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 partiedroite de votre ecran et en selectionnant Add Files... Il ne reste plus qu’a compile a l’aide dela touche F9 ou via le menu Project/Make Project. Si aucune erreur n’apparait dans le bas devotre 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 programmationC en continuant ci-dessous.
II.2 La separation de code en plusieurs fichiers et quelquesfonctions utiles
Vous avez peut-etre remarque que dans le programme precedent les registres DDRA et PORTAsont entierement modifies. Il y a des cas ou cela n’est pas souhaite et ou on souhaite passer le bit0 a 1 sans modifier les autres bits. Nous allons donc pour cela creer des fonctions supplementaires.Mais ces fonctions ont de grandes chances d’etre necessaires dans un autre projet, et on a pas tropenvie de les reecrire le moment venu. Nous allons donc les mettre dans un fichier separe qui serainclus 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 l’aide de #define
Comment faire pour passer le neme bit du registre x a 1 sans modifier les autres bits ? Leregistre 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 parl’instruction :
x|=(1<<n);
En effet, l’instruction x|=y realise l’instruction 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 finde x et enleve les m premiers bits au debut de x. Ainsi par exemple par exemple (6<<3) devient00110000 car 6 en binaire est 00000110.
Presentons maintenant la declaration #define. Par exemple, #define x 3 placee au debutdu programme, entre les #include et la premiere 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 pasdefinit, 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 developpeurdans 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 ; \
...derniere instruction
Cette fois des ; sont mis car, je le rappele, le compilateur ne fait que remplacer le nom de la macropar 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, apresavoir relance et ouvert le projet debut si vous l’aviez quitte depuis, faites File/New. Entrez ensuiteles declarations suivantes :
#ifndef FONCTIONS UTILES#define FONCTIONS UTILES
#define SET BIT( oc t e t , b i t ) ( o c t e t |= (1<< b i t ) )#define CLEAR BIT( oc t e t , b i t ) ( o c t e t &= ˜(1<< b i t ) )#define IS SET ( oc t e t , b i t ) ( ( o c t e t & (1<< b i t ) ) ! = 0 )#define IS CLEAR( oc t e t , b i t ) ( ( o c t e t & (1<< b i t ) ) == 0 )
#endif
9L’operation 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)=110Une macro est une fonction ecrite a l’aide d’un #define
II.3. LES INTERRUPTIONS AVEC IMAGECRAFT AVR 15
Enregistrez ce fichier sous le nom fonctions utiles.h dans le repertoire debut. Pourquoi .halors qu’avant c’etait debut.c ? Et bien parce que la regle veut que les fichiers secondaires soientdans un ”header”. Mais dans un header, on ne peut ecrire que des #define et non du code. Dansce cas, on separe les #define qu’on met dans un .h et les portions de code qu’on met dans un .cqui porte le meme 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 apres les autres #include. Les plus observateurs auront remarque que l’ont a mis des guille-mets au lieu de <> comme a la page 12. Les <> signifient que le fichier se trouve dans le repertoireou est installe le compilateur alors que les guillemets indiquent que le fichier est dans le memerepertoire que le projet.
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 la pour nous aider. Si les etapes 1,2 et 5 restent inchangees,voila comment faire pour s’occuper des etapes 3 et 4. Pour l’exemple, nous allons allumer une LEDsur PA0 des que la patte PD0 passe a 1, PD0 etant la patte correspondant a INT0, l’interruptionexterne no 0.
Lors du declenchement d’une interruption, le programme principal est interrompu et une cer-taine fonction s’execute. Dans notre cas, cette fonction va allumer la LED, appelons-la allume sivous le voulez bien. Si tous les #include ont ete correctement fait, la fonction s’ecrit facilementpar :
void al lume ( ){ SET BIT(PORTA, 0 ) ; }
Il faut maintenant dire au compilateur que c’est cette fonction qui doit etre appelees lors del’interruption externe. Pour cela, Imagecraft possede la declaration :#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 up t hand l e r al lume : iv INT0 ;
Ainsi, l’interruption 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 up t hand l e r al lume : iv INT0
void al lume ( ){
SET BIT(PORTA, 0 ) ;}
void main (void ){
SET BIT(DDRA, 0 ) ; // l a pa t t e 0 du por t A e s t une s o r t i eCLEAR BIT(DDRD, 0 ) ; // l a pa t t e 0 du por t D e s t une en t reeEICRA = 0x03 ;EICRB = 0x00 ;EIMSK = 0x01 ;TIMSK = 0x00 ;ETIMSK = 0x00 ;asm( ” s e i ” ) ;while ( 1 ) ;
}
Les valeurs attribuees a EICRA, EICRB, EIMSK, TIMSK et ETIMSK sont trouvees d’apresla datasheet. asm(”sei”) est explique 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 developpeur n’a rien a se soucie. Dans l’exemple donne, le microcontroleur execute sans cessel’instruction while(1), c’est-a-dire ne fait rien. Des que la patte PD0 passe a 1, la fonction allume()est appelee. Lorsqu’elle se termine, le microcontroleur retourne ou il s’etait arrete, c’est-a-dire al’instruction while(1).
II.4 L’assembleur dans un programme en C
Il est parfois necessaire d’inserer des commandes assembleur directement dans le code C. Cela sefait via l’instruction asm("instruction en assembleur") ; qui insere l’instruction en assembleurdans 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 en pendant un cy c l e d ’ hor l o geasm( ” s e i ” ) ; // l e s i n t e r r u p t i o n s sont p r i s e s en compteasm( ” c l i ” ) ; // l e s i n t e r r u p t i o n s ne sont p l u s p r i s e s en compte
Un autre cas ou le recours a l’assembleur est necessaire est lorsque l’on cherche a mettreune temporisation d’une duree precise. Dans ce cas, on n’a d’autres choix que de regarder lecode compile en assembleur pour voir combien de temps nos instructions durent afin d’adapter lalongueur de la boucle de temporisation.
II.5 Quelques complements sur le compilateur ICC AVR
Ce compilateur fournit un outil tres utile pour tous developpeurs : l’Application Builder quise trouve dans le menu Tools. Cet outil ecrit automatiquement les lignes de configurations dumicrocontroleur selon les besoins que vous aurez specifies. Ainsi, il devient facile de demarrerun projet necessitant la gestion de plusieurs Timers/Counters, d’interruptions 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 quelsregistres doivent etre initialises et avec quelles valeurs.
J’ai 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 n’en est pas de memepour les long. Si vous souhaitez faire des calculs sur de grands entiers, preferez donc l’utilisationde float partout. Ce probleme est facilement reperable grace a la simulation des programmes, ceque je vais vous presenter dans le chapitre suivant.
Chapitre III
La simulation des progammes
Apres avoir ecrit son code, on aimerait bien voir comment les instructions s’enchaınent pourvoir si tout fonctionne comme prevu. Cela se fait grace a AVR Studio 4, logiciel gratuit developpepar ATMEL. Courrez le telcharger sur http://www.atmel.com/atmel/products/prod203.htmpuis installez-le.
La simulation est conforme au comportement reel du microcontroleur dans la mesure ou lesimulateur est correctement programme. A l’heure ou j’ecris ces lignes, des bugs subsistent. Parexemple, la gestion des Timer/Counter, et particulierement de la generation de signaux PWM, nemarche absolument pas. Il ne faut donc pas s’y fier dans ces domaines. De meme, l’implementationdes programmes dans le microcontroleur via le cable AVR ISP (voir en page 23) presente parfoiscertaines difficultes incomprehensibles. Ce dernier point peut etre resolu en utilisant conjointementles 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 voussouhaiterez l’utiliser, alors essayez donc si la version 4 vous convient.
III.1 Premiers pas avec AVR Studio 4
Apres l’avoir lance, faites File/Open et ouvrez le fichier debut.cof. Vous avez ensuite le menusuivant qui s’affiche1 :
ou vous choisissez AVR Simulator et ATmega128.
1Si ce n’est pas la premiere fois que vous ouvrez le fichier, AVR Studio 4 vous signale que ce fichier est dejaassocie a un projet et vous demande si vous voulez ouvrir ce projet. Repondez oui a moins que vous ne vouliezretomber sur la fenetre affichee ci-dessus.
19
20 CHAPITRE III. LA SIMULATION DES PROGAMMES
Apres avoir cliquez sur Finish, l’ecran suivant devrait apparaitre :
Voyons a quoi servent les differentes parties de cet ecran.
III.2 Workspace
C’est la que vous pouvez voir l’etat de votre microcontroleur. Vous pouvez ainsi voir les valeursde tous les registres du microcontroleur mais aussi les modifier en temps reel. A cote de chaqueregistre se trouvent des cases symbolisant les bits du registre. La premiere case est le bit 7 duregistre2 et ainsi de suite. Si la case est coloriee, le bit est a 1, il est a 0 sinon. Dans l’exempledonne, PORTA=0x21, soit le bit 0 et 5 a 1.
2Rappelez-vous que les bits sont representes dans l’ordre inverse : page 12
III.3. PROGRAMME EN COURS 21
Un autre outil important de cette fenetre est la Stop Watch. C’est un chronometre qu’on remeta zero en cliquant droit dessus et en choisissant Reset StopWatch. Cela permet de savoir le tempsecoule entre deux instructions quelconques. Attention, le calcul est fait a une certaine frequenced’horloge, visible juste au-dessus de la Stop Watch. La frequence de l’horloge peut etre modifieevia le menu Debug/AVR Simulation Options.
III.3 Programme en cours
C’est la qu’on peut suivre ou en est le programme dans son deroulement. La prochaine instruc-tion a etre executee est indiquee par la fleche jaune. C’est ici qu’on peut placer des Breakpoints3.Pour mettre un Breakpoint ou en enlever un, il suffit de faire un clic droit sur l’instruction ou l’onsouhaite 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 lavaleur des variables du programme. Pour cela, on selectionne cette variable, on clique droit et onchoisit Add To Watch. C’est ce qui a ete fait dans l’exemple 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 d’arreter le deroulement du programme.3Points d’arret, voir Controle du deroulement en page 21
22 CHAPITRE III. LA SIMULATION DES PROGAMMES
Run : Permet d’executer le programme. Dans ce mode, le Workspace et la fenetre Watch sontinacessibles. Ce mode se termine soit en cliquant sur Break, soit lorsque le logiciel rencontreun Breakpoint. Ce mode est tres utile pour sortir de boucles d’attente de longue duree enmettant 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 d’interrompre l’execution du programme lors qu’on est en mode Run ou AutoStep.
Reset : Comme son nom l’indique, recommence le programme depuis le debut.
Step Into : Mode pas-a-pas. Execute la seule instruction indiquee par la fleche jaune. Si cetteinstruction fait appel a une sous-fonction, la fenetre du programme en cours s’ouvre sur cettesous-fonction et le developpeur peut executer les instructions de cette sous-fonction en modepas-a-pas.
Step Over : Mode pas-a-pas egalement, mais a la difference de Step Into s’il y a appel d’unesous-fonction, celle-ci est executee entierement sans que le developpeur ne puisse suivre sonderoulement.
Step Out : Termine la fonction en cours d’execution puis retourne au programme qui l’a appeleeen redonnant la main au developpeur.
Run To Cursor : Execute le programme jusqu’au curseur4.
AutoStep : Equivalent a Run mais ici le developpeur voit le Workspace et la fenetre Watch.Le deroulement est plus lent qu’en mode Run mais on peut voir ce qui se passe dans lemicrocontroleur 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 d’afficher la valeur de variables choisies, voir page21.
Toggle Disassembler Window : Permet d’afficher le code assembleur dans la fenetre du pro-gramme en cours et des lors d’executer les instructions en assembleur au pas-a-pas. Tres utilepour voir comment le programme a ete compile notamment pour connaitre les instructionsutilisees dans une boucle afin de pouvoir adapte le nombre d’occurences pour obtenir uneduree precise.
III.6 Output view
Cette fenetre permet de voir si la simulation se deroule bien, par exemple s’il n’y a pas eud’erreurs de chargement du projet. En resume, c’est la que seront affiches les messages provenantdu simulateur.
4La barre verticale qui clignote a l’endroit ou le texte tape est insere
Chapitre IV
L’implementation reelle sur lemicrocontroleur
Si tout marche comme il faut sur le papier et sur la simulation, passons aux choses serieuses etvoyons ce que ca donne dans la realite. Et bien c’est la que les choses se gatent et je dois avouerque le chemin jusqu’au microcontroleur fonctionnel est long et seme d’embuches. Mais avec cedocument, tout devrait aller (enfin, j’espere). Construisons donc une carte pour programmer cetATmega128. Cette programmation ce fera via un cable AVR ISP, disponible chez de nombreuxfournisseurs de materiel electronique.
IV.1 L’alimentation
Le microcontroleur est alimente en 0V - 5V, aussi stable que possible. Evidement, on relie lesmasses ensemble sur le 0V d’une part, et les Vcc ensemble sur le 5V d’autre part. De plus, doiventetre aussi reliees a Vcc deux pattes : AV cc - l’alimentation du convertisseur analogique-numerique- et PEN - inutilise pour la programmation via AVR ISP.
IV.2 L’horloge
Plusieurs solutions s’offrent a vous pour cadencer le microcontroleur. On verra plus loin com-ment indiquer au microcontroleur la solution choisie, en page 27
L’ocillateur interne : Certains microcontroleurs de la famille AVR possedent un oscillateur in-terne, par exemple l’ATmega128 en possede quatre fonctionnant a 1, 2, 4 ou 8 MHz. Cettesolution offre l’avantage d’etre facile a mettre en oeuvre (rien a faire) mais a l’inconvenientd’avoir une frequence instable selon la tension d’alimentation, la temperature, etc... et sur-tout de ne pas pouvoir fonctionner jusqu’au 16 MHz maximum de l’ATmega128.
L’horloge externe : Il suffit de fournir un signal carre sur la patte XTAL1, mais encore faut-ilpouvoir le generer ce signal.
L’oscillateur RC externe : Cette solution presente l’avantage de pouvoir aller plus haut enfrequence (jusque 12 MHz sur l’ATmega128) et de choisir des frequences autres que celles del’oscillateur interne mais presente encore le gros inconvenient d’etre instable en temperatureet tension d’alimentation.
Le quartz ou le resonnateur : C’est la solution pour etre precis, stable et atteindre les 16 MHzmais peut presenter des difficultes de mise en oeuvre. Les quartz a deux pattes se branche surXTAL1 et XTAL2 avec deux condensateurs entre chaque pattes et la masse, comme indiquesur le schema ci-dessous.
23
24CHAPITRE IV. L’IMPLEMENTATION REELLE SUR LE
MICROCONTROLEUR
Fig. IV.1 – Utilisation d’un quartz
Et c’est ces capacites qui posent problemes. Selon leur valeur, le quartz peut fonctionnerou 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, l’oscil-loscope n’est d’aucune utilite puisqu’il rajoute des capacites parasites, il est donc necessaired’utiliser un analyseur logique. En pratique, 22pF semble etre une valeur qui marche bien,mais si ce n’est le cas, il va falloir tester plusieurs valeurs jusqu’a ce que ca fonctionne.En tous cas, limitez au maximum la longueur des pistes entre les condensateurs, le quartzet le microcontroleur. Certains quartz a 4 pattes ainsi que les resonnateurs possedent dejades capacites integrees mais fonctionneront a des frequences moins precises et seront plusinstables. 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 l’AT-mega128 et de l’AVR ISP, et ce ne sont pas des modeles de clarte. Le cable AVR ISP se branchesur 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 n’apporte rien, on utilisera le connecteur 6 broches. Et vu que ce dessin n’est pas tresclair, 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 l’alimentation, Vtg etant bien entendu VccReset : Comme la barre l’indique, 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 : C’est la que les choses sont bizarres. On se dit qu’il suffit de connecter le
MOSI du microcontroleur sur le MISO du cable et inversement. Et bien non ! Allez savoirpourquoi, ATMEL a decide et ecrit au fin fond de la datasheet que pour l’ATmega128, MISOdu 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.
26CHAPITRE IV. L’IMPLEMENTATION REELLE SUR LE
MICROCONTROLEUR
Si vous comptez utiliser les broches SCK, PDI et PDO du microcontroleur pour les brancher aquelquechose d’autre, une petite precaution s’impose. Soit deconnecter ce quelquechose au momentde 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 souderles composants. Voici un site tres utile sur la soudure de composants CMS :http://home.nordnet.fr/~fthobois/les_cms.htmPour verifier la bonne soudure des pattes, utilisez un multimetre en testeur de continuite maisattention, il faut eviter d’appuyer sur les pattes du microcontroleur au risque de prendre un fauxcontact pour une bonne soudure.
Ca y est, la carte est prete, tout est soude, alors allons-y. Nous allons implementer le programmedebut fait dans la partie sur la programmation en C, en page 11. Pour cela, il faut bien sur brancherle cable AVR ISP sur l’ordinateur, l’autre cote sur la carte electronique, puis lancer AVR Studio4 1 et charger le projet debut comme indique a la page 19. Enfin, mettez sous alimentation votremontage. ATTENTION : il faut imperativement brancher le cable AVR ISP avant d’alimenterle circuit, sous peine de voir la cable griller. Maintenant, sous AVR Studio 4, cliquez sur le boutonsuivant :
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 quevous programmez le microcontroleur via ISP. Les menus Flash et EEPROM permettent de
1ou AVR Studio 3, d’apres ma remarque au debut du chapitre 3, page 19, l’interface etant sensiblement la meme
IV.4. COMMENT IMPLEMENTER NOTRE PROGRAMME DANS LEMICROCONTROLEUR 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 memoireFlash est sauf exception, celle qui contient le programme.
Fuses : Ce menu permet de configurer le microcontroleur. Decochez d’abord la compatibiliteATmega103. Puis tout ce que vous avez a changer desormais est le type d’horloge que voussouhaitez utiliser. A noter que si vous souhaitez utiliser un quartz a plus de 8 MHz, il fautdecocher ”CKOPT fuse”.
LockBits : Attention, les changements ici peuvent etre irreversibles. C’est ici qu’on peut bloquerdefinitivement la modification de certains parametres, voire bloquer toute programmationulterieure. Bref, on ne touche a rien.
Advanced : Ici vous pouvez eventuellement specifier le port serie utilise par AVR ISP, mais enAuto, ca semble marcher tres bien. Sinon, un bon moyen de voir si le microcontroleur repondest de lire sa signature et ainsi de s’assurer que le microcontroleur est celui qu’on pensait.
Board : Je n’ai pas vraiment compris l’utilite de cet onglet alors passons.
Auto : Permet d’automatiser certaines taches afin, d’un seul clic, de pouvoir executer plusieursoperations a la suite. On peut ainsi automatiser des taches repetitives.
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 d’ATMEL. Je tiens a remercier tout ceux qui m’ont aide et soutenu lors de ladecouverte de ces microcontroleurs. Parmi eux, les membres de mon equipe : Francois BARRE,Vincent BORREL, Guillaume DUPUY, Thomas LEFEVRE, Arnaud LESUEUR, Jean-BaptisteRICHARD et Benjamin SARDA ainsi que les anciens de la robotique a l’ENST Bretagne : PascalLEGRAND, 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 d’en tenir compte. Envoyez-moi un simple mail [email protected]
29
Annexe B
Conversionhexadecimal/binaire/decimal
B.0.1 Convention d’ecriture
En decimal, notre base habituel, le nombre est ecrit comme d’habitude : 21
En hexadecimal, on le fait preceder d’un ”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 0111hexadecimal 0 1 2 3 4 5 6 7
binaire 1000 1001 1010 1011 1100 1101 1110 1111hexadecimal 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 : 01111101betape1
y 0111 et 1101etape2
y 7 et Detape3
y d’ou 01111101b = 0x7D
Suivez les etapes en sens inverse pour convertir un nombre hexadecimal en binaire.
33
34 ANNEXE B. CONVERSION HEXADECIMAL/BINAIRE/DECIMAL
Conversion hexadecimal/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.
01
23
45
67
89
1011
1213
1415
0x1.
1617
1819
2021
2223
2425
2627
2829
3031
0x2.
3233
3435
3637
3839
4041
4243
4445
4647
0x3.
4849
5051
5253
5455
5657
5859
6061
6263
0x4.
6465
6667
6869
7071
7273
7475
7677
7879
0x5.
8081
8283
8485
8687
8889
9091
9293
9495
0x6.
9697
9899
100101
102103
104105
106107
108109
110111
0x7.
112113
114115
116117
118119
120121
122123
124125
126127
0x8.
128129
130131
132133
134135
136137
138139
140141
142143
0x9.
144145
146147
148149
150151
152153
154155
156157
158159
0xA
.160
161162
163164
165166
167168
169170
171172
173174
1750x
B.
176177
178179
180181
182183
184185
186187
188189
190191
0xC
.192
193194
195196
197198
199200
201202
203204
205206
2070x
D.
208209
210211
212213
214215
216217
218219
220221
222223
0xE
.224
225226
227228
229230
231232
233234
235236
237238
2390x
F.
240241
242243
244245
246247
248249
250251
252253
254255
Annexe C
Aide a la programmation
C.1 Type de donnees
Type Taille (octects) Domaineunsigned char 1 0...255signed char 1 -128...127
char (*) 1 0...255unsigned short 2 0...65535(signed) short 2 -32768...32767unsigned int 2 0...65535(signed) int 2 -32768...32767
pointer 2unsigned long 4 0...4294967295(signed) long 4 -2147483648...2147483647
float 4 +/-1.175e-38...3.40e+38double 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 1pour une sortie
PORTx : pour changer la valeur des pattes en sortiePINx : 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
bit 7 6 5 4 3 2 1 0EIRCA ISC3 ISC2 ISC1 ISC0
ISCn Interruption de INTn sur00 niveau bas01 non disponible10 front descendant11 front montant
35
36 ANNEXE C. AIDE A LA PROGRAMMATION
EICRB, External Interrupt Control Register B
bit 7 6 5 4 3 2 1 0EIRCB ISC7 ISC6 ISC5 ISC4
ISCn Interruption de INTn sur00 niveau bas01 front montant et front descendant10 front descendant11 front montant
EIMSK, External Interrupt Maskbit 7 6 5 4 3 2 1 0
EIMSK INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0INTn a 1 pour que l’interruption externe correspondante soit prise en compte.
C.4 Timer/Counter0 (8 bits)
TCNT0, Timer Counter Register : indique la valeur courante du Timer/Counter0OCR0, Output Compare Register : peut etre utilise pour generer une interruption en cours de
comptage (voir C.7)TCCR0, Timer Counter Control RegisterTCCR0 Frequence de comptage Duree totale (*)
0x00 Timer/Counter0 arrete0x01 clkI/0 16µs0x02 clkI/0 / 8 128µs0x03 clkI/0 / 32 512µs0x04 clkI/0 / 64 1, 024ms0x05 clkI/0 / 128 2, 048ms0x06 clkI/0 / 256 4, 096ms0x07 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/Counter2OCR2, Output Compare Register : peut etre utilise pour generer une interruption en cours de
comptage (voir C.7)TCCR2, Timer Counter Control RegisterTCCR2 Frequence de comptage Duree totale (*)
0x00 Timer/Counter2 arrete0x01 clkI/0 16µs0x02 clkI/0 / 8 128µs0x03 clkI/0 / 64 1, 024ms0x04 clkI/0 / 256 4, 096ms0x05 clkI/0 / 1024 16, 384ms0x06 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 courantedu Timer/Counter
OCRnAH, OCRnALOCRnBH, OCRnBLOCRnCH, OCRnCL
utilises pour generer des interruptions en cours de comptage(voir C.7)
TCCRnA, Timer Counter Control Register A = 0x00TCCRnB, Timer Counter Control Register BTCCRnB Frequence de comptage Duree totale (*)
0x00 Timer/Counter2 arrete0x01 clkI/0 4, 096ms0x02 clkI/0 / 8 32, 768ms0x03 clkI/0 / 64 262, 144ms0x04 clkI/0 / 256 1, 048576s0x05 clkI/0 / 1024 4, 194304s0x06 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 Maskbit 7 6 5 4 3 2 1 0
TIMSK Comp2 Over2 0 Comp1A Comp1B Over1 Comp0 Over0
ETIMSK, Extended Timer Counter Interrupt Maskbit 7 6 5 4 3 2 1 0
ETIMSK 0 0 0 Comp3A Comp3B Over3 Comp3C Comp1C
Overn a 1 active l’interruption d’Overflow du Timer/Counter n, c’est-a-dire qu’une interrup-tion est declenche quand le Timer/Counter revient a la valeur 0
Compnx a 1 active l’interruption de comparaison lorsque le Timer/Counter n atteint la valeurdu registre OCRnx
C.8 Generation de PWM sur OC0 (8 bits)
OCR0, Output Compare Register : permet de definir le rapport cyclique η = tempshaut
tempsbas= OCR0
256TCCR0, Timer Counter Control RegisterTCCR0 Frequence du signal PWM Periode (*) Commentaire
0x68 Timer/Counter0 arrete A eviter0x69 clkI/0 / 256 16µs0x6A clkI/0 / 2048 128µs0x6B clkI/0 / 8192 512µs0x6C clkI/0 / 16384 1, 024ms0x6D clkI/0 / 32768 2, 048ms0x6E clkI/0 / 65536 4, 096ms0x6F 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, OC1COCR2, Output Compare Register : permet de definir le rapport cyclique η = tempshaut
tempsbas= OCR2
256
TCCR2, Timer Counter Control RegisterTCCR2 Frequence du signal PWM Periode (*) Commentaire
0x68 Timer/Counter0 arrete A eviter0x69 clkI/0 / 256 16µs0x6A clkI/0 / 2048 128µs0x6B clkI/0 / 16384 1, 024ms0x6C clkI/0 / 65536 4, 096ms0x6D clkI/0 / 262144 16, 384ms Servomoteurs0x6E 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 etOC3C (de 8 a 10 bits)
Dans ce qui suit, n vaut 1 ou 3 et x vaut A, B ou C
OCRnxHOCRnxL
}⇒ forment par concatenation OCRnx=65536*OCRnxH+OCRnxL
rapport cyclique ηnx =OCRnx
2resolutionou resolution ∈ {8, 9, 10} selon la configuration choisie
TCCRnA, Timer Counter Control Register Abit 7 6 5 4 3 2 1 0
TCCRnA COMnA COMnB COMnC WGMn
COMnx Description00 OCnx non utilise10 OCnx utilise
WGMn Resolution01 8 bits10 9 bits11 10 bits
TCCRnB, Timer Counter Control Register B
TCCRnB Frequence PWM 8 bits 9 bits 10 bits
Frequence a 16MHz Frequence a 16MHz Frequence a 16MHz
0x09 clkI/O
2resolution
clkI/O
25616µs
clkI/O
51232µs
clkI/O
102464µs
0x0A clkI/O
8 ∗ 2resolution
clkI/O
2048128µs
clkI/O
4096256µs
clkI/O
8192512µs
0x0B clkI/O
64 ∗ 2resolution
clkI/O
163841, 024ms
clkI/O
327682, 048ms
clkI/O
655364, 096ms
C.11. USART 39
TCCRnB Frequence PWM 8 bits 9 bits 10 bits
Frequence a 16MHz Frequence a 16MHz Frequence a 16MHz
0x0C clkI/O
256 ∗ 2resolution
clkI/O
655364, 096ms
clkI/O
1310728, 192ms
clkI/O
26214416,384ms
0x0D clkI/O
1024 ∗ 2resolution
clkI/O
26214416,384ms clkI/O
52428832, 768ms
clkI/O
104857665, 536ms
C.11 USART
Dans ce qui suit, n vaut 0 ou 1 selon l’USART considere. Format de la trame : voir page 7
UDRn, USARTn Data Register : destination des donnees recues ou origine des donnees aenvoyer
UCSRnA, USARTn Control and Status Register A : non utilise pour la configurationUCSRnB, USARTn Control and Status Register Bbit 7 6 5 4 3 2 1 0
UCSRnB RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n
➫ RXCIEn : a 1 pour permettre le declenchement d’une interruption lors d’une receptionterminee
➫ TCCIEn : a 1 pour permettre le declenchement d’une interruption lors d’une emission ter-minee
➫ UDRIEn : a 1 pour permettre le declenchement d’une interruption lorsque l’emetteur estpret a emettre
➫ RXENn : a 1 pour autoriser la reception➫ TXENn : a 1 pour autoriser l’emission➫ UCSZn2 : a 1 pour indiquer une trame de 9 bits, a 0 si 8 bits ou moins➫ RXB8n : 9eme a la reception si utilisation d’une trame de 9 bits. A lire avant UDRn➫ TXB8n : 9eme a l’emission si utilisation d’une trame de 9 bits. A ecrire avant UDRn
UCSRnC, USARTn Control and Status Register Cbit 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 :
UPMn Bit de parite00 desactive10 pair11 impair
➬ USBSn : a 0 pour une trame a 1 bit Stop, a 1 pour 2 bits Stop
➬ UCSZn :
UCSZn Taille des donnees00 501 610 711 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
UBRRnHUBRRnL
}⇒ forment par concatenation UBRRn=65536*UBRRnH+UBRRnL
UBRRn, USARTn Baud Rate Register : valeur maximale = 0x0FFF
Mode Calcul du debit Calcul deUBRRnen bits/s (bps)
Asynchrone UBRRn =f
16(UBRRn + 1) BAUD =f
16 ∗BAUD− 1
Synchrone UBRRn =f
2(UBRRn + 1) BAUD =f
2 ∗BAUD− 1
Exemples de configuration Communication asynchrone, trame de 8 bits avec un bit deparite 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 d’interruptions– 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 ’ emetteur ∗/UDRn = donnee a envoyeer ;
– Reception :
while ( ! (UCSRnA & (1<<RXCn) ) ) ;/∗ a t t e n t e de r e cep t i on de donnees ∗/donnee recue = UDRn;
Adresses Internet utiles
resel.enst-bretagne.fr/club/em6 Pour suivre l’evolution du robot de l’ENST Bretagne etobtenir une verion plus recente de ce tutorial.
resel.enst-bretagne.fr/club/em6/site 2002/index.php3?corps=doc Pour les linuxiens, untutorial 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 avezdes questions, allez-y sans tarder.
www.atmel.com/dyn/resources/prod documents/doc2467.pdf C’est ici que se trouve la data-sheet de l’ATmega128.
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 cetutorial.
www.atmel.com/dyn/products/tools card.asp?tool id=2725 Le programmateur/simulateurAVR Studio 4.
home.nordnet.fr/∼fthobois/les cms.htm Un site pour vous aider a souder des composantsCMS.
41
Index
C (programmation en).c et .h, 15#define, 14#include, 12#pragma, 15asm("..."), 16et assembleur, 16for, 12guillemets, 12i++, 12int, 13interruption, 15macro, 14main, 12parametres d’une fonction, 12point-virgule, 12void, 12while, 13
Comparateur analogique, 8Compilateurs, 11Convertion analogique/numerique, 7
Economie d’energie, voir Sleep ModeEntree/sortie, 5
Interruptionen assembleur, 9en C, 15generalites, 9Timer/Counter, 6
Mise en pratique, 23alimentation, 23configurer le microcontroleur, 27horloge, 23implementation du programme dans le
microcontroleur, 27port de programmation, 24quartz, 23SCK, MISO, MOSI, PDI, PDO, 25soudure des composants, 26
Mode d’economie d’energie, voir Sleep Mode
Port, 5PWM, 6
Reexecution de programme, 8Registre, 6
DDRx, 6OCRn, 6PINx, 6PORTx, 6TCNTn, 6
Resetpour la programmation, 25Watchdog Timer, 8
Simulation, 19assembleur, 22breakpoint, 21configuration, 19deroulement du programme, 21StopWatch, 21Workspace, 20
Sleep Mode, 8sortie, 8
Timer/Counter, 616 bits, 6
USART, 7
Watchdog Timer, 8
43