1. Trang chủ
  2. » Giáo án - Bài giảng

La programmation des ATMEL AVR

45 60 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 45
Dung lượng 1,04 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

En effet, selon le microcontrˆoleurconsid´er´e, on peut trouver : em-– plusieurs Timers/Counters – G´en´eration de signaux PWM – Nombreux convertisseurs analogiques/num´eriques – Communi

Trang 1

La programmation des ATMEL AVR

JUILLOT Guillaume

2 septembre 2003

Trang 3

Table des mati` eres

I.1 Qu’est-ce qu’un microcontrˆoleur ? 5

I.2 Les entr´ees/sorties d’un microcontrˆoleur 5

I.3 Timers/Counters et g´en´eration de PWM 6

I.4 Convertisseurs analogique/num´erique 7

I.5 Communication s´erie USART 7

I.6 Comparateur analogique 8

I.7 Watchdog Timer 8

I.8 Modes d’´economie d’´energie 8

I.9 Interruptions internes et externes 9

II La programmation des microcontrˆoleurs en C 11 II.1 D´ebuter avec Imagecraft 11

II.2 La s´eparation de code en plusieurs fichiers et quelques fonctions utiles 13

II.2.1 La d´efinition de fonctions utiles `a l’aide de #define 14

II.2.2 Rajouter un fichier `a un projet 14

II.3 Les interruptions avec ImageCraft AVR 15

II.4 L’assembleur dans un programme en C 16

II.5 Quelques compl´ements sur le compilateur ICC AVR 16

III La simulation des progammes 19 III.1 Premiers pas avec AVR Studio 4 19

III.2 Workspace 20

III.3 Programme en cours 21

III.4 Contrˆole du d´eroulement 21

III.5 Choix de la vue 22

III.6 Output view 22

IV L’impl´ementation r´eelle sur le microcontrˆoleur 23 IV.1 L’alimentation 23

IV.2 L’horloge 23

IV.3 Le port de programmation 24

IV.4 Comment impl´ementer notre programme dans le microcontrˆoleur 26

Le mot de la fin 29 A Sch´ema de l’ATmega128 31 B Conversion hexad´ecimal/binaire/d´ecimal 33 B.0.1 Convention d’´ecriture 33

1

Trang 4

2 TABLE DES MATI `ERES

C.1 Type de donn´ees 35

C.2 Gestion des entr´ees/sorties 35

C.3 Interruptions externes 35

C.4 Timer/Counter0 (8 bits) 36

C.5 Timer/Counter2 (8 bits) 36

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

C.7 Interruptions pour Timers/Counters 37

C.8 G´en´eration de PWM sur OC0 (8 bits) 37

C.9 G´en´eration de PWM sur OC2 (8 bits) 38

C.10 PWM sur OC1A, OC1B, OC1C, OC3A, OC3B et OC3C (de 8 `a 10 bits) 38

C.11 USART 39

Trang 5

Ce document a ´et´e ´ecrit dans le cadre de la coupe 2003 de robotique e=M6 Il a pour but

de vous pr´esenter toutes les phases de d´eveloppement d’un projet sur les microcontrˆoleurs de lafamille AVR de chez ATMEL

Cette pr´esentation est d´ecompos´ee en quatre parties La premi`ere sera une description aussicompl`ete que possible des possibilit´es qu’offrent les microcontrˆoleurs choisis Suivront les rudi-ments de la programmation en C et en assembleur, `a l’aide du compilateur Imagecraft Un aspectimportant est la simulation du programme, qui se fera `a l’aide de AVR Studio 4 dans la troisi`emepartie du pr´esent document Je terminerai en pr´esentant la mise en pratique du programme enl’impl´ementant sur le microcontrˆoleur

Les exemples donn´es seront valables pour un ATmega128 Il est possible qu’ils ne soient plusvalables pour un autre microcontrˆoleur Dans tous les cas il est vivement recommand´ed’avoir une datasheet compl`ete de l’ATmega128 sous les yeux pour mieux pouvoirsuivre les exemples Utilisez ´egalement la datasheet d’un autre microcontrˆoleur si vous souhaitezadapt´e les exemples au microcontrˆoleur de votre choix

3

Trang 6

4 INTRODUCTION

Trang 7

en fonction de l’utilisation qui est `a faire - par exemple, il est conseill´e d’´eviter d’utiliser unATmega128 si l’on ne cherche qu’`a g´en´erer un PWM1.

I.1 Qu’est-ce qu’un microcontrˆ oleur ?

Un microcontrˆoleur est compos´e d’un microprocesseur, de m´emoire ROM pour stocker leprogramme et d’une m´emoire RAM volatile pour conserver les r´esultats interm´ediaires lors del’ex´ecution du programme

Mais les microcontrˆoleurs poss`edent des avantages incomparables pour l’informatique barqu´ee par rapport aux microprocesseurs Ce sont d’abord les broches qui peuvent servirentd’entr´ees/sorties mais surtout toutes les fonctions p´eriph´eriques En effet, selon le microcontrˆoleurconsid´er´e, on peut trouver :

em-– plusieurs Timers/Counters

– G´en´eration de signaux PWM

– Nombreux convertisseurs analogiques/num´eriques

– Communication s´erie USART

– Comparateur analogique

– Watchdog Timer

– Oscillateur RC interne

– Modes d’´economies d’´energie

– Interruptions internes et externes

I.2 Les entr´ ees/sorties d’un microcontrˆ oleur

La plupart des pattes d’un microcontrˆoleur peuvent servir soit d’entr´ees, soit de sorties, et cechoix peut changer `a tout instant comme le veut le d´eveloppeur

Les entr´ees/sorties sont regroup´ees par huit et le groupement de huit pattes ainsi form´e estappel´e port et se voit attribu´e une lettre Par exemple, les broches 44 `a 51 forment le port A

1 PWM = Pulse Width Modulation, c’est un signal rectangulaire caract´ eris´ e par le rapport cyclique (tempshaut/tempsbas), c’est-` a-dire avec un temps ` a 1 diff´ erent du temps ` a 0.

5

Trang 8

6 CHAPITRE I LES MICROCONTR ˆOLEURS AVR POUR LES NULS

Chaque patte est ensuite num´erot´ee selon sa position au sein de ce port Par exemple, la broche

46 est appel´ee PA52 Trois registres3 servent `a g´erer les entr´ees/sorties :

– DDRx4 : indique quelles sont les pattes consid´er´ees comme des entr´ees et celles consid´er´eescomme des sorties Si le ni`eme bit de DDRx (not´e DDxn) est `a 1, alors la ni`eme patte duport x (not´ee Pxn) est consid´er´e comme une sortie Si DDxn est `a 0, alors Pxn est consid´er´eecomme une entr´ee

– PORTx : la valeur du ni`eme bit de PORTx (not´e PORTxn) d´efinit la valeur de sortie dePxn Si PORTxn=1, alors Pxn=+Vcc, si PORTxn=0, alors Pxn=Gnd

– PINx : la valeur du ni` emebit de PINx (not´e PINxn) est la valeur qui est appliqu´ee `a l’entr´ee

du microcontrˆoleur Par exemple, si on applique +Vcc `a Pxn, alors PINxn=1

La plupart des pattes poss`edent des fonctions p´eriph´eriques qui inhibent l’utilisation en tantqu’entr´ees/sorties Si l’on utilise les fonctions p´eriph´eriques, il ne faut en aucun cas modifier lesbits DDRxn, PORTxn et PINxn correspondants

I.3 Timers/Counters et g´ en´ eration de PWM

Les Timers/Counters, not´es TCNTn o`u n est le num´ero Timer/Counter, sont des compteurscadenc´es selon une certaine fr´equence d´efinie Lorsqu’il atteint son maximum (MAX5), il passe `a 0

et recommence `a compter Ce passage de MAX `a 0 peut s’accompagner d’une interruption interne(cf Interruptions internes et externes en page 9)

`

A ces Timers/Counters se rajoutent un comparateur dont on peut d´efinir le seuil `a l’aide duregistre OCRn Lorsque le TCNTn atteint la valeur de OCRn, alors la patte OCn change de va-leur, passant de 0 `a 1 ou de 1 `a 0 selon la configuration puis retournant `a la valeur initiale lorsqueTCNTn passe de MAX `a 0

Ces Timers/Counters peuvent donc avoir plusieurs utilisations D’abord, le programmeur peutsavoir le temps ´ecoul´e depuis qu’il a lanc´e le Timer/Counter Ou encore, l’interruption de passage

de MAX `a 0 peut ˆetre utilis´ee pour temporisation, et commencer ou arrˆeter un programme aubout d’un certain temps La derni`ere utilisation, tr`es utile en robotique pour la commande de ser-vomoteurs, est la g´en´eration de signaux PWM En effet, si la patte OCn change de valeur lorsque

le TCNTn atteint la valeur du comparateur OCRn, on obtient sur OCn un signal alternativement

`

a 1 puis `a 0 avec des dur´ee `a 0 et `a 1 r´eglables On a bien OCn qui est un signal PWM dont onpeut d´efinir le rapport cyclique en mettant la bonne valeur dans OCRn

Plusieurs registres sont utilis´es pour configurer les Timers/Counters :

TCCRn, OCRn, ASSR, TIMSK et TIFR Leurs configurations sont compliqu´ees, il convient de

se reporter aux chapitres correspondants de la datasheet La valeur du Timer/Counter, accessiblevia le registre TCNTn, peut ˆetre modifi´ee `a tout instant afin de r´einitialiser ma s´equence `a partird’une certaine valeur, apr`es avoir atteint MAX, le compteur recommencera `a 0 `A noter que lafr´equence de comptage peut ˆetre un sous-multiple de la fr´equence du microcontrˆoleur ou encoreˆ

etre impos´ee par une horloge externe connect´ee `a une patte du microcontrˆoleur

Certains compteurs fonctionnent sur 16 bits Ils pr´esentent plusieurs avantages : ils peuventcompter plus loin donc plus longtemps ; lors d’une utilisation pour g´en´erer du PWM, la r´esolutionest plus ´elev´ee ; et surtout ils poss`edent deux comparateurs dont les seuils peuvent ˆetre r´egl´esdiff´erement, ce qui permet d’obtenir sur les pattes OCnA et OCnB deux signaux PWM de

mˆeme fr´equence mais de rapport cyclique diff´erent `a l’aide d’un seul Timer/Counter Dans le

2 Les plus perspicaces auront remarqu´ e que l’ordre des num´ eros sur le port A est invers´ e par rapport aux num´ eros des pattes En r´ ealit´ e, cela d´ epend du port, certains sont dans le bon sens, d’autres non Voir dans la datasheet.

3 Un registre est une variable interne de huit bits, utilis´ ee pour d´ efinir le comportement du microcontrˆ oleur ou pour savoir dans quel ´ etat il se trouve.

4 x repr´ esente la lettre du port, par exemple DDRA ou DDRB

5 pour un compteur sur m bits, alors MAX = 2 m − 1

Trang 9

I.4 CONVERTISSEURS ANALOGIQUE/NUM ´ERIQUE 7

cas de Timer/Counter sur 16 bits, le registre TCNTn se d´ecompose en deux registres TCNTnL etTCNTnH tandis que OCRn se d´ecompose en OCRnAL et OCRnAH pour le premier comparateur

et OCRnBL, OCRnBH pour le deuxi`eme comparateur

I.4 Convertisseurs analogique/num´ erique

Le monde r´eel ´etant continu, c’est-`a-dire analogique, tandis que les microcontrˆoleurs tionnent en num´erique, il faut bien avoir une interface entre les deux : le convertisseur analogi-que/num´erique6 Son fonctionnement est simple `a comprendre : `a intervalles de temps r´eguliers,

fonc-la tension analogique est mesur´ee puis arrondie afin de pouvoir ˆetre convertie en num´erique Laconversion est donc d’autant plus fid`ele que le nombre de bits du codage est ´elev´e et est inversementproportionnelle `a la plage de tension analogique en entr´ee Les microcontrˆoleurs de la famille AVRposs`edent des convertisseurs embarqu´es donc il n’est pas n´ecessaire d’en concevoir ou d’en acheter.Par exemple, l’ATmega128 poss`ede un CAN fonctionnant sur 10 bits Ce CAN peut convertirjusqu’`a 8 signaux analogiques par intermittence Le temps maximum de conversion est de 260µsmais peut ˆetre diminu´e en r´eduisant la r´esolution (nombre de bits du codage) L’´echelle de tension

en entr´ee est par d´efaut [0, V cc] mais peut ˆetre pass´ee `a [0, Vref] o`u Vref ≤ V cc est une tensionappliqu´ee `a la patte Aref (no62) A noter que les CAN peuvent ˆetre configur´es pour ne fairequ’une conversion ou pour convertir en continu la tension analogique, la conversion ´etant alorsr´eguil`erement mise `a jour selon la dur´ee de conversion

I.5 Communication s´ erie USART

USART est l’abr´evation pour Universal Synchronous and Asynchronous serial Receiver andTransmitter, c’est un syst`eme de communication point-`a-point tr`es flexible

Les donn´ees sont transmises par trames de 7 `a 13 bits La trame a le format suivant :

DD

DDD

DDD

DDD

DDD

DDD

DDD

DDD

DDD

DDD(IDLE) St 0 1 2 3 4 [5] [6] [7] [8] [P] Sp1 [Sp2] (St/IDLE)

St : bit de d´epart, toujours `a 0

n : bits de donn´ees

L’USART se d´ecompose en trois parties :

L’´emetteur : se charge d’´emettre sur la patte TXDn, `a la fr´equence configur´ee, la trame selon lavaleur stock´ee dans le registre UDR ; il s’occupe donc automatiquement de la g´en´eration desbits Start, Stop et ´eventuellement Parity Des interruptions peuvent ˆetre d´eclench´ees lorsque

la transmission est termin´ee

6 en abr´ eg´ e, CAN ou ADC en anglais pour Analog to Digital Converter

Trang 10

8 CHAPITRE I LES MICROCONTR ˆOLEURS AVR POUR LES NULS

Le r´ecepteur : d`es d´etection sur la patte RXDn d’un bit Start valide (c’est-`a-dire `a 0), chaquebit de la trame est alors ´echantillon´e selon la fr´equence configur´ee ou selon l’horloge sur XCK,

et stock´e dans un registre temporaire jusqu’`a r´eception de la trame compl`ete Ensuite, lavaleur re¸cue est d´eplac´ee dans le registre UDR accessible par le programme Une interruptionpeut ˆetre d´eclench´ee lors de la fin de r´eception pour pr´evenir qu’une trame est arriv´ee Si leprogramme n’a pas lu une trame lorsqu’une deuxi`eme trame arrive, la premi`ere trame estperdue Si la transmission s’est mal d´eroul´ee, par exemple si la trame est non conforme, si lebit de parit´e n’est pas correct ou si des donn´ees re¸cues n’ont pas ´et´e lues, divers drapeaux7

passent `a 1 et les donn´ees erron´ees sont effac´ees

Le g´en´erateur d’horloge : lors d’une utilisation en mode synchrone, un g´en´erateur est d´eclar´emaˆıtre et l’autre esclave Le maˆıtre g´en`ere le signal d’horloge selon le d´ebit souhait´e et l’en-voit sur la patte XCK du microcontrˆoleur L’horloge esclave re¸coit ce signal d’horloge sur

sa patte XCK et l’utilise pour ´echantilloner les trames ou les ´emettre au bon rythme Enmode asynchrone, l’USART en reception se charge de synchroniser son horloge sur la tramearrivante

La configuration doit ˆetre faite avant toute tentative d’envoi de donn´ees et ne devra pas ˆetrechang´ee tant que des donn´ees restent `a ´emettre/recevoir Il faut bien veiller `a ce que la configurationsoit toujours identique sur les deux microcontrˆoleurs pour le format de la trame, le d´ebit et qu’enmode synchrone les deux pattes SCK soient reli´ees et qu’un USART soit en maˆıtre et l’autre enesclave

I.6 Comparateur analogique

Outre les convertisseurs analogiques/num´eriques, les microcontrˆoleurs AVR poss`edent un parateur analogique Celui-ci compare les deux tensions appliqu´ees aux pattes AIN0 et AIN1 SiAIN 0 < AIN 1 alors le bit ACO (5`eme bit du registre ACSR) passe `a 1 Sinon, ACO reste `a 0

com-De plus, une interruption peut ˆetre d´eclench´ee lors du passage `a 1 de ACO

I.7 Watchdog Timer

Le Watchdog Timer se charge de faire des RESET `a intervalle de temps r´egulier Il utilise unoscillateur RC interne en tant qu’horloge cadenc´ee `a 1MHz Ce syst`eme permet de recommencer le

mˆeme programme `a intervalles de temps r´eguliers ou encore de se r´eveiller d’un mode d’´economied’´energie apr`es un certain lapse de temps (voir paragraphe suivant) A noter que la m´emoire RAMn’est pas perdu au cours de ce RESET, ce qui permet d’augmenter le temps entre deux r´eex´ecution

du programme en tenant `a jour un compteur qui est d´ecr´ement´e `a chaque Watchdog Reset jusqu’`a

ce qu’il atteigne 0 et alors on commence r´eellement le programme

I.8 Modes d’´ economie d’´ energie

Certaines applications ne n´ecessitent pas que le microcontrˆoleur tourne continuellement Ilserait donc souhaitable de le d´esactiver, de ”l’endormir”, pour qu’il consomme aussi peu d’´energieque possible Ceci est possible grˆace aux Sleep Mode Plusieurs modes sont disponibles, afin depouvoir ”endormir” ce dont on n’a pas besoin et de conserver ce qui doit l’ˆetre

Une fois configur´e, il suffit pour entrer dans le mode d’´enregie d’ex´ecuter l’instruction SLEEP

La sortie du mode se fait via une interruption externe ou interne, selon le mode utilis´e

7 Un drapeau est un bit indiquant qu’un ´ ev` enement s’est produit.

Trang 11

I.9 INTERRUPTIONS INTERNES ET EXTERNES 9

I.9 Interruptions internes et externes

Certains ´ev`enements peuvent intervenir `a n’importe quel instant et doivent ˆetre g´er´es sansattendre Il est ´evident que de faire constament une batterie de tests pour voir si tel ou tel

Les interruptions possibles sont de deux types :

externe : lorsqu’une des pattes passe dans un certain ´etat ou tant que la patte est dans un ´etatd´efini

interne : par exemple lorsque qu’un compteur d´epasse sa valeur maximale8, lorsqu’un transfertvia USART est termin´e

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

1 Pour les interruptions internes, configurer le registre correspondant pour d´eclencher ruption ; par exemple pour d´eclencher une interruption sur un Overflow du Timer/Counter0,

l’inter-on cl’inter-onfigure le registre TIMSK en mettant le bit no0, TOIE0, `a 1

2 Pour les interruptions externes, ce sont les registres EICRA, EICRB, EIMSK et EIFR qu’ilfaut configurer pour qu’un certain ´etat sur une ou plusieurs des pattes INT0 `a INT7 d´eclencheune interruption

3 Il faut ensuite dire au microcontrˆoleur ce qu’il doit ex´ecuter Pour cela, les premiers blocs

de m´emoire sont allou´es `a un Reset and Interrupt Vector `A chaque type d’interruption estassoci´e une adresse dans ce Vector o`u le d´eveloppeur met une instruction ”jmp LABEL”,LABEL ´etant l’adresse de la m´emoire o`u se trouve le code `a ex´ecuter

4 Ensuite, on programme le code qui doit ˆetre ex´ecut´e en le mettant `a l’adresse LABEL d´efinieci-dessus Nous verrons dans le chapitre sur la programmation en C en page 15 comment cesdeux ´etapes peuvent ˆetre r´ealis´e facilement

5 Il reste `a activer la gestion des interruptions `a l’aide de la commande assembleur sei Lagestion des interruptions peut ˆetre desactiv´ee `a l’aide de la commande assembleur cli

A noter que le retour au programme principal se fait via la commande assembleur reti et nonvia ret comme pour un retour depuis une sous-fonction classique

8 on appele cela Overflow

Trang 12

10 CHAPITRE I LES MICROCONTR ˆOLEURS AVR POUR LES NULS

Trang 13

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 d´esavantage de fonctionner sans interface graphique mais `a l’aide de MakeFile.Les aficionados de la programmation en C sous Linux ne seront gu`ere gˆen´es mais moi si C’estpourquoi j’ai choisi d’utiliser une version de d´emonstration d’Imagecraft, les limitations de cetted´emo n’´etant gu`ere gˆenant pour de petits projets.

Pour les adeptes de Linux, reportez-vous aux rapports de mes pr´edecesseurs `a cette adresse :http://resel.enst-bretagne.fr/club/em6/site_2002/index.php3?corps=doc

II.1 D´ ebuter avec Imagecraft

Apr`es un d´etour sur http://www.imagecraft.com pour t´el´echarger la d´emo d’Imagecraft etapr`es l’avoir install´e, on le lance et les choses s´erieuses vont commencer

Si vous ˆetes prˆets, nous allons pouvoir commencer Un projet est souvent compos´e de plusieursfichiers qu’il faut regroup´e Pour cela, on cr´ee un Project ! Dans le menu Project, choisissezNew Cr´eez un r´epertoire o`u vous voulez que le projet soit stock´e puis donnez-lui son nom2 Pourl’exemple qui suit, vous prendrez comme r´epertoire debut et comme nom de projet debut Ouvrez

le projet ainsi cr´e´e via Project/Open Ensuite faites File/New et vous pouvez commencer `a ´ecrire

du code

Maintenant que tout est prˆet pour commencer `a programmer, je vous propose de faire unprogramme qui consiste `a faire clignoter une LED3 D’abord, choisissons o`u sera connect´e cette

1 Voir sur http://www.avrfreaks.net pour plus de d´ etails

2 ICC AVR ne g` ere pas les noms de fichiers longs Pour cr´ eer un projet dans un r´ epertoire donc le chemin d’acc` es contient des caract` eres illicites pour des noms de fichiers courts, il faut donner dans la case Nom du fichier l’arborescence compl` ete en format nom de fichier court Par exemple C:\mesdoc~1\codeav~1\debut.prj

3 LED est le sigle anglais pour Diode Electro-Luminescente, c’est une petite ampoule.

11

Trang 14

12 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C

DEL Si personne ne s’y oppose, je propose la patte PA04

Ensuite, il faut que le microcontrˆoleur sache quelle portion de code ex´ecuter au d´emarrage.Pour cela, on inclue ce code dans la fonction main Voici donc le d´ebut de notre code :

void main(void){

Explications : main est l’entr´ee du programme, c’est vers l`a que se dirigera le microcontrˆoleur d`es samise sous tension void est un mot anglais signifiant ”rien” Plac´e avant le nom de la fonction - icimain -, void indique que le programme ne renvoie pas de r´esultat comme par exemple pourrait lefaire une fonction somme Ensuite, entre paranth`eses se trouve les param`etres de la fonction, c’est-

DDRA=0x01;

En effet 0x indique que le nombre est en h´exad´ecimal Donc 0x01=00000001 en binaire6 Onvoit bien7que le bit 0 de DDRA est mis `a 1 PA0 est d´esormais une sortie pour le microcontrˆoleur

Le point-virgule ” ;” sert `a indiquer que l’instruction est finie

Certains doivent se dire que c’est g´enial, que le compilateur comprend tout de suite ce queDDRA signifie Et bien non En r´ealit´e le registre DRRA, comme tous les registres, est un endroit

de la m´emoire dont l’emplacement change selon le microcontrˆoleur sur lequel on travaille Il fautdonc pr´eciser au compilateur quel microcontrˆoleur est utilis´e afin qu’il puisse remplacer DDRA parson adresse m´emoire Heureusement pour nous, pas besoin de red´efinir `a chaque fois les adresses detous les registres utilis´es, il suffit de mettre au tout d´ebut du programme, avant mˆema la fonctionmain, la d´eclaration suivante :

#include <iom128v.h>

La commande #include permet d’ins´erer dans le programme sur lequel on travaille des portions

de code d´efinis dans un autre fichier, en l’occurence iom182v.h

Maintenant il faut allumer la LED Pour cela, il faut mettre `a 1 le bit 0 de PORTA Ce qui sefait via :

PORTA=0x01;

Etant donn´ee la vitesse d’´execution8, il faut patienter un peu avant d’´eteindre la LED Onutilise pour cela une boucle qui ne fait rien :

for( i=0;i<10000;i++);

La boucle for compte depuis i=0 tant que i<10000 en faisant i++ , c’est-`a-dire en augmentant i

de 1 `a chaque boucle i ne tombe pas du ciel et doit ˆetre d´eclar´e au d´ebut de la fonction afin que

le compilateur sache ce qu’est i On mettra donc la d´eclaration suivante avant DDRA=0x01 ; :

int i ;

4 Souvenez-vous, PA0 est la patte n o 0 du port A, num´ erot´ e 51

5 int = entier en anglais

6 Voir en annexe, page 33 pour la conversion h´ exad´ edimal/binaire/d´ ecimal

7 Les bits sont num´ erot´ es de droite ` a gauche En effet, le bit 0 est le bit le moins important et est donc mis le plus ` a droite, tout comme les unit´ es sont plac´ es ` a droite des dizaines, eux-mˆ emes ` a droite des centaines

8 A 16 MHz, il faut 62.5ns pour faire l’instruction pr´ ec´ edente.

Trang 15

II.2 LA S ´EPARATION DE CODE EN PLUSIEURS FICHIERS ET QUELQUES

Ainsi le compilateur sait que i est un entier

On peut d´esormais ´eteindre la LED et attendre `a nouveau On rajoute donc `a la suite duprogramme les instructions :

Ainsi les 4 derni`eres instructions seront r´ep´et´ees ´eternellement

Il reste `a finir la fonction main par } et le programme est termin´e Voici le programme aucomplet :

la touche F9 ou via le menu Project/Make Project Si aucune erreur n’apparait dans le bas devotre ´ecran, vous avez programm´e votre premier projet sur microcontrˆoleur AVR F´elicitations !Vous pouvez passer `a la simulation, en page 19, ou alors en apprendre plus sur la programmation

Trang 16

14 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C

II.2.1 La d´ efinition de fonctions utiles ` a l’aide de #define

Comment faire pour passer le n` eme bit du registre x `a 1 sans modifier les autres bits ? Leregistre x est de la forme ( y , y , y , n` eme bit , y , y , y , y ) o`u y=0 ou 1 Il suffit de savoir9 que(y OU 0)=y et que (y OU 1)=1 Il suffit donc de faire x OU ( 0 , 0 , 0 , 1 au n` eme bit , 0 , 0 , 0, 0 ) pour obtenir le registre x identique sauf le n` eme bit qui est pass´e `a 1 Ceci se fait en C parl’instruction :

x|=(1<<n);

En effet, l’instruction x|=y r´ealise l’instruction x=(x OU y), car | est la traduction de OU en C

On peut de mˆeme ´ecrire x+=3 pour augmenter x de 3 Ensuite (x<<m) rajoute m z´eros `a la fin

de x et enl`eve les m premiers bits au d´ebut de x Ainsi par exemple par exemple (6<<3) devient

00110000 car 6 en binaire est 00000110

Pr´esentons maintenant la d´eclaration #define Par exemple, #define x 3 plac´ee au d´ebut

du programme, entre les #include et la premi`ere fonction, indique au compilateur qu’il doitremplacer tout les x qu’il trouve par un 3 Ce remplacement ne doit se faire que si x n’est pasd´efinit, on met donc cette d´eclaration dans un bloc :

#ifndef nom du bloc de d´efinition

#define nom du bloc de d´efinition

liste des d´efinitions

#endifUne macro10 ne se termine pas par un point-virgule car celui-ci sera mis par le d´eveloppeurdans son programme lors de l’appel de cet macro Il est possible de faire une macro sur plusieurslignes selon le format suivant :

#define nom de la macro \instruction1 ; \instrution2 ; \

derni`ere instructionCette fois des ; sont mis car, je le rappele, le compilateur ne fait que remplacer le nom de la macropar sa d´efinition

II.2.2 Rajouter un fichier ` a un projet

Nous allons donc maintenant d´efinir 4 fonctions tr`es utiles pour tout projet Pour cela, apr`esavoir relanc´e et ouvert le projet debut si vous l’aviez quitt´e depuis, faites File/New Entrez ensuiteles d´eclarations suivantes :

#i f n d e f FONCTIONS UTILES

#define FONCTIONS UTILES

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

#define CLEAR BIT( o c t e t , b i t ) ( o c t e t &= ˜(1<< b i t ) )

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

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

#endif

9 L’op´ eration OU se fait bit ` a bit avec les r` egles suivantes : (0 OU 0)=0 ; (0 OU 1)=1 ; (1 OU 0)=1 ; (1 OU 1)=1

10 Une macro est une fonction ´ ecrite ` a l’aide d’un #define

Trang 17

II.3 LES INTERRUPTIONS AVEC IMAGECRAFT AVR 15

Enregistrez ce fichier sous le nom fonctions utiles.h dans le r´epertoire debut Pourquoi halors qu’avant c’´etait debut.c ? Et bien parce que la r`egle veut que les fichiers secondaires soientdans un ”header” Mais dans un header, on ne peut ´ecrire que des #define et non du code Dans

ce cas, on s´epare les #define qu’on met dans un h et les portions de code qu’on met dans un cqui porte le mˆeme nom que le h

Ensuite clic droit sur Header dans la partie droite de votre ´ecran puis Add Files pourajouter les fonctions utiles au projet Puis il faut dire au programme principal qu’il a le droitd’utiliser ce fichier Cela se fait en mettant :

#include ”fonctions utiles.h”

juste apr`es les autres #include Les plus observateurs auront remarqu´e que l’ont a mis des mets au lieu de <> comme `a la page 12 Les <> signifient que le fichier se trouve dans le r´epertoireo`u est install´e le compilateur alors que les guillemets indiquent que le fichier est dans le mˆemer´epertoire que le projet

guille-On peut maintenant utiliser les macros SET BIT et CLEAR BIT dans la fonction main Parexemple :

SET BIT(DDRA,0);

pour mettre `a 1 le bit 0 de DDRA

II.3 Les interruptions avec ImageCraft AVR

Nous avons vu, en page 9 que la gestion des interruptions est lourde `a faire en assembleur.Heureusement, le C et Imagecraft sont l`a pour nous aider Si les ´etapes 1,2 et 5 restent inchang´ees,voil`a comment faire pour s’occuper des ´etapes 3 et 4 Pour l’exemple, nous allons allumer une LEDsur PA0 d`es que la patte PD0 passe `a 1, PD0 ´etant la patte correspondant `a INT0, l’interruptionexterne no0

Lors du d´eclenchement d’une interruption, le programme principal est interrompu et une taine fonction s’ex´ecute Dans notre cas, cette fonction va allumer la LED, appelons-la allume sivous le voulez bien Si tous les #include ont ´et´e correctement fait, la fonction s’´ecrit facilementpar :

cer-void a l l u m e ( )

{ SET BIT (PORTA, 0 ) ; }

Il faut maintenant dire au compilateur que c’est cette fonction qui doit ˆetre appel´ees lors del’interruption externe Pour cela, Imagecraft poss`ede la d´eclaration :

#pragma interrupt handler nom de la fonction:iv nom de l’interruption

Dans notre exemple, on aura donc :

#pragma i n t e r r u p t h a n d l e r a l l u m e : iv INT0 ;

Ainsi, l’interruption INT0 ex´ecutera la fonction allume quand elle se d´eclenche

Trang 18

16 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C

Reste `a ´ecrire le reste et on obtient in fine :

SET BIT (DDRA, 0 ) ; // l a p a t t e 0 du p o r t A e s t une s o r t i e

CLEAR BIT(DDRD, 0 ) ; // l a p a t t e 0 du p o r t D e s t une e n t r e e

Les valeurs attribu´ees `a EICRA, EICRB, EIMSK, TIMSK et ETIMSK sont trouv´ees d’apr`es

la datasheet asm(”sei”) est expliqu´e dans le paragraphe suivant Le compilateur se charge determiner la fonction traitant une interruption par l’instruction reti au lieu d’un ret habituel,

le d´eveloppeur n’a rien `a se souci´e Dans l’exemple donn´e, le microcontrˆoleur ex´ecute sans cessel’instruction while(1), c’est-`a-dire ne fait rien D`es que la patte PD0 passe `a 1, la fonction allume()est appel´ee Lorsqu’elle se termine, le microcontrˆoleur retourne o`u il s’´etait arrˆet´e, c’est-`a-dire `al’instruction while(1)

II.4 L’assembleur dans un programme en C

Il est parfois n´ecessaire d’ins´erer des commandes assembleur directement dans le code C Cela sefait via l’instruction asm("instruction en assembleur") ; qui ins`ere l’instruction en assembleurdans le code compil´e Voici quelques exemples les plus fr´equents :

asm ( ” nop ” ) ; // i n s t r u c t i o n ne f a i s a n t r i e n p e n d a n t un c y c l e d ’ h o r l o g easm ( ” s e i ” ) ; // l e s i n t e r r u p t i o n s s o n t p r i s e s en compte

asm ( ” c l i ” ) ; // l e s i n t e r r u p t i o n s ne s o n t p l u s p r i s e s en compte

Un autre cas o`u le recours `a l’assembleur est n´ecessaire est lorsque l’on cherche `a mettreune temporisation d’une dur´ee pr´ecise Dans ce cas, on n’a d’autres choix que de regarder lecode compil´e en assembleur pour voir combien de temps nos instructions durent afin d’adapter lalongueur de la boucle de temporisation

II.5 Quelques compl´ ements sur le compilateur ICC AVR

Ce compilateur fournit un outil tr`es utile pour tous d´eveloppeurs : l’Application Builder qui

se trouve dans le menu Tools Cet outil ´ecrit automatiquement les lignes de configurations dumicrocontrˆoleur selon les besoins que vous aurez sp´ecifi´es Ainsi, il devient facile de d´emarrer

un projet n´ecessitant la gestion de plusieurs Timers/Counters, d’interruptions multiples ou de

Trang 19

II.5 QUELQUES COMPL ´EMENTS SUR LE COMPILATEUR ICC AVR 17

communication USART sans avoir `a ouvrir la datasheet du microcontrˆoleur pour trouver quelsregistres doivent ˆetre initialis´es et avec quelles valeurs

J’ai remarqu´e quelques probl`emes avec le compilateur au sujet de la gestion des entiers longs

En effet, si les op´erations sur les int et les float ne posent aucuns probl`emes, il n’en est pas de mˆemepour les long Si vous souhaitez faire des calculs sur de grands entiers, pr´ef´erez donc l’utilisation

de float partout Ce probl`eme est facilement rep´erable grˆace `a la simulation des programmes, ceque je vais vous pr´esenter dans le chapitre suivant

Trang 20

18 CHAPITRE II LA PROGRAMMATION DES MICROCONTR ˆOLEURS EN C

Trang 21

Chapitre III

La simulation des progammes

Apr`es avoir ´ecrit son code, on aimerait bien voir comment les instructions s’enchaˆınent pourvoir si tout fonctionne comme pr´evu Cela se fait grˆace `a AVR Studio 4, logiciel gratuit d´evelopp´epar ATMEL Courrez le t´el´charger sur http://www.atmel.com/atmel/products/prod203.htmpuis installez-le

La simulation est conforme au comportement r´eel du microcontrˆoleur dans la mesure o`u lesimulateur est correctement programm´e A l’heure o`u j’´ecris ces lignes, des bugs subsistent Parexemple, la gestion des Timer/Counter, et particuli`erement de la g´en´eration de signaux PWM, nemarche absolument pas Il ne faut donc pas s’y fier dans ces domaines De mˆeme, l’impl´ementationdes programmes dans le microcontrˆoleur via le cˆable AVR ISP (voir en page 23) pr´esente parfoiscertaines difficult´es incompr´ehensibles Ce dernier point peut ˆetre r´esolu en utilisant conjointementles version 3 et 4 de AVR Studio, la version 3 ne pr´esentant aucun probl`eme avec AVR ISP.Peut-ˆetre ces probl`emes seront-ils r´esolus dans les futurs versions de AVR Studio 4 lorsque voussouhaiterez l’utiliser, alors essayez donc si la version 4 vous convient

III.1 Premiers pas avec AVR Studio 4

Apr`es l’avoir lanc´e, faites File/Open et ouvrez le fichier debut.cof Vous avez ensuite le menusuivant qui s’affiche1 :

o`u vous choisissez AVR Simulator et ATmega128

1 Si ce n’est pas la premi` ere fois que vous ouvrez le fichier, AVR Studio 4 vous signale que ce fichier est d´ ej` a associ´ e ` a un projet et vous demande si vous voulez ouvrir ce projet R´ epondez oui ` a moins que vous ne vouliez retomber sur la fenˆ etre affich´ ee ci-dessus.

19

Trang 22

20 CHAPITRE III LA SIMULATION DES PROGAMMES

Apr`es avoir cliquez sur Finish, l’´ecran suivant devrait apparaitre :

Voyons `a quoi servent les diff´erentes parties de cet ´ecran

III.2 Workspace

C’est l`a que vous pouvez voir l’´etat de votre microcontrˆoleur Vous pouvez ainsi voir les valeurs

de tous les registres du microcontrˆoleur mais aussi les modifier en temps r´eel A cˆot´e de chaqueregistre se trouvent des cases symbolisant les bits du registre La premi`ere case est le bit 7 duregistre2 et ainsi de suite Si la case est colori´ee, le bit est `a 1, il est `a 0 sinon Dans l’exempledonn´e, PORTA=0x21, soit le bit 0 et 5 `a 1

2 Rappelez-vous que les bits sont repr´ esent´ es dans l’ordre inverse : page 12

Ngày đăng: 16/12/2019, 17:09

TỪ KHÓA LIÊN QUAN

w