la programmation des atmel avr - bienvenue sur...

45
La programmation des ATMEL AVR JUILLOT Guillaume 2 septembre 2003

Upload: hoangcong

Post on 30-Aug-2018

243 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

La programmation des ATMEL AVR

JUILLOT Guillaume

2 septembre 2003

Page 2: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre
Page 3: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 4: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 5: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 6: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

4 INTRODUCTION

Page 7: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 8: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 9: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 10: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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.

Page 11: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 12: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

10 CHAPITRE I. LES MICROCONTROLEURS AVR POUR LES NULS

Page 13: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 14: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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.

Page 15: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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.

Page 16: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 17: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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.

Page 18: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 19: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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.

Page 20: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

18 CHAPITRE II. LA PROGRAMMATION DES MICROCONTROLEURS EN C

Page 21: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 22: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 23: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 24: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 25: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 26: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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 :

Page 27: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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.

Page 28: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 29: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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.

Page 30: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

28CHAPITRE IV. L’IMPLEMENTATION REELLE SUR LE

MICROCONTROLEUR

Page 31: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 32: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

30 LE MOT DE LA FIN

Page 33: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

Annexe A

Schema de l’ATmega128

31

Page 34: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

32 ANNEXE A. SCHEMA DE L’ATMEGA128

Page 35: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 36: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 37: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 38: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 39: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 40: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 41: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 42: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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;

Page 43: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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

Page 44: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

42 ADRESSES INTERNET UTILES

Page 45: La programmation des ATMEL AVR - Bienvenue sur …les-electroniciens.com/sites/default/files/cours/programmationavr.pdf · Introduction Ce document a ´et´e ´ecrit dans le cadre

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