Outils pour utilisateurs

Outils du site


tuto_avr_eclipse_un_1er_projet_-_clignotage_d_une_led

====== [TUTO] [AVR] [Eclipse] Un 1er Projet - Clignotage d'une LED ====== ---- ===== Introduction ===== Pour faire suite aux deux précédents tutoriels (([[tuto_installation_de_eclipse|[TUTO] Installation de Eclipse]]))(([[tuto_utilisation_de_eclipse_cdt_avr|[TUTO] Utilisation de Eclipse/CDT/AVR]])) concernant l'installation d'Eclipse et son utilisation, je vous propose un nouveau tutoriel qui consistera à faire clignoter une LED. En utilisant une plateforme Arduino Uno ou Nano, il y a déjà une LED présente sur la broche 13. C'est pratique, il n'y a pas de câblage a faire ! :-) Je sais c'est trivial, mais ça introduit déjà pas mal de trucs : * On continue sur l'utilisation de Eclipse * On utilisera la Datasheet * On introduira la notion de registres * On introduit les Bonnes Pratiques Allé hop !! On y va ! En route vers l'aventureeeuhhhh !! (Vieille pub Banga) ---- ===== (Facultatif) Mise sous gestion de configuration ===== Pour bien commencer, on va mettre notre code sous un "gestionnaire de configuration" ; c'est peut-être un peu contraignant, mais il n'y a que des avantages à le faire. Pour ma part, outre le fait que le projet soit archivé dans le cloud, que l'historique du projet soit conservé, ça me permet de "partager" mes sources entre mon PC personnel (Debian Wheezy) et mon PC professionnel (Windows 7). On va donc créer un repository //GIT//. Personnellement, j'ai choisit //GitHub//. Ergonomiquement, rien à redire, il y a tout ce qu'il faut : c'est gratuit (lire tout de même les conditions générales d'utilisation, vous savez le truc qu'on ne lit jamais), c'est un repo //Git// (donc avec tout les avantages de Git), il y a un plugin pour Eclipse, il y a un "//issue tracker//", un wiki, etc... Coté //GitHub//, il faudra donc créer un reposotiry dont on notera l'URL quelque part. Le mien, je l'ai appelé //AVR_Blink_A_LED//. J'ai adopté une convention de nommage telle que les projets n'utilisant pas la bibliothèque Arduino s'appellent //AVR_<ProjectName>//, et les projets utilisant la bibliothèque Arduino s'appellent //Arduino_<Project_Name>// Coté Eclipse, il faut installer le plugin adéquat. j'ai choisi //Eclipse GIT Team Provider// (Redémarrage de Eclipse nécessaire). Une fois le plugin installé, une nouvelle perspective //GIT Repository Exploring// est disponible. **[ACTION]** Ouvrir la perspective //GIT Repository Exploring//\\ **[ACTION]** Dans le panneau de gauche, cliquer sur //Clone a GIT Reposotiry and add the clone to this view// Une série de boites de dialogue s’enchaîne. Renseigner l'URL du Repository précédemment créé. {{:dialog-warning.png}} : Faire attention a cloner le repository dans le Workspace. Par défaut le plugin crée un clone dans ''~/git/<repo_name>'' Le repository est cloné dans notre workspace. ---- ===== Création du projet ===== Pour ceux qui ne souhaitent pas utiliser un repository GIT, ou qui ont une autre solution, un simple répertoire ou pas de répertoire du tout (Eclipse le créant tout seul) fait l'affaire... De retour dans la perspective C/C++, créons un nouveau projet : **[ACTION]** Cliquer sur //File// > //New// >> //C++ project// La boite de dialogue de création de projet s'affiche. **[ACTION]** Renseigner le nom du projet. Pour qu'Eclipse utilise notre clone de repository, il faut lui donner le même nom ; dans mon cas : //AVR_Blink_A_LED//\\ **[ACTION]** Choisir le type de projet : //AVR Cross Target Application// > //Empty Project//\\ **[ACTION]** Une fois le projet créé, procéder au paramétrage des configurations\\ **[ACTION]** Ajouter un fichier source\\ Le fichier source contiendra le code suivant : <code c> #include <avr/io.h> #include <util/delay.h> int main( void ) { DDRB |= (1 << PB5 ) ; // Main Loop for( ; ; ) { PORTB ^= (1 << PB5 ) ; _delay_ms( 500.0 ) ; } return( 0 ) ; } </code> ---- ===== Explication de Code ===== Bon donc, l'explication du code. Notre fichier commence par une série de directives //#include//. Ces directives //#include// sont aussi présentes lorsqu'on utilise la librairie Arduino, qui, je le rappelle, n'est qu'une sur-couche logicielle qui a pour but de masquer toutes ces choses horribles que nous allons voir et faire. <code c>#include <avr/io.h></code> le fichier d'en-tete ''avr/io.h'' "contient" la definition de notre microcontroleur. En fait, lorsque l'on dit à Eclipse que l'on utilise un //ATmega328P// à //16MHz//, il en profite pour positionner deux choses : un symbole //F_CPU// ayant pour valeur //16000000UL//((//Unsigned Long//) et un commutateur à destination du compilateur (//-mmcu=atmega328p//) : <code> make all Building file: ../AVR_Blink_A_LED.cpp Invoking: AVR C++ Compiler avr-g++ -Wall -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -fno-exceptions -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"AVR_Blink_A_LED.d" -MT"AVR_Blink_A_LED.d" -c -o "AVR_Blink_A_LED.o" "../AVR_Blink_A_LED.cpp" Finished building: ../AVR_Blink_A_LED.cpp </code> Ce dernier commutateur se traduit par la définition du symbole %%__%%//AVR_ATmega328P//%%__%%. <code c> #include <util/delay.h> </code> La seconde directive //#include// fait appel au fichier ''util/delay.h'' "contenant" entre autre la fonction //_delay_ms()//, permettant d'attendre un certain temps. Dans l'exemple 500ms. Vient ensuite la fonction main. Cette fonction est la fonction la plus importante d'un projet en C/C++. C'est le point d'entrée du programme. <code c> int main( void ) { </code> Ensuite, nous avons la ligne suivante : <code c> DDRB |= (1 << PB5 ) ; </code> Avant de procéder a l'explication de cette ligne, il convient de jeter un oeil a la datasheet du ATmega328P. On la trouvera facilement a cette adresse : [[http://www.atmel.com/devices/ATMEGA328P.aspx?tab=documents]]. On l'ouvre au paragraphe §14. //DDRB// est le //Data Direction Register// (Port) B. En français, c'est le registre de configuration de la direction du port B (Entrée ou Sortie). Par défaut, //DDRB// vaut //0//, il est donc configuré comme une entrée. Dans notre cas, on veut faire clignoter une LED. il convient donc de configurer le port en Sortie. Notre LED est cablée sur la broche //D13// de notre Arduino... En regardant le schéma ([[http://www.arduino.cc]]) on peut voir que notre LED est finalement câblée sur la broche //PB5// de notre microcontrôleur ; soit, la broche #5 du port B. Il suffit donc d’écrire un //1// dans le cinquième bit du registre //DDRB// ! Pour ce faire, il y a plusieurs solutions, toutes reviennent a "écrire" la valeur binaire //0b00100000// dans notre registre //DDRB//. On peut écrire //32//, ou //0x20//. La syntaxe utilisée ici est un poil plus lisible. elle est articulée autour d'une opération de décalage à gauche. En fait, on dit "décale la valeur 1 à gauche //PB5// fois". PB5 est un symbole qui "vaut" 5. on décale donc la valeur 1 vers la gauche, 5 fois. Ça se veut plus lisible dans le sens où une fois que l'on a compris l'histoire du décalage, on a le nom de la broche concernée dans l'expression. Une autre solution serait d'utiliser l'instruction assembleur //SBR DDRB,PB5// qui ne prend qu'un seul temps de cycle cf §37 de la datasheet. Entre les deux, on a l’opérateur //|=// ... Ça veut dire que l'on applique un OU logique au registre //DDRB// avec la valeur //(1<<PB5)//. Dans le cas présent le OU logique met le bit #5 à "1" (s'il n'y était pas déjà). Vient ensuite l'instruction : <code c> for( ; ; ) { [...] } </code> Il s'agit là de notre boucle principale. Il est important de ne jamais en sortir. A l'interieur de cette boucle, on trouve l'instrution qui fait clignoter notre LED : <code c> PORTB ^= (1 << PB5 ) ; </code> Ici, meme principe que pour //DDRB// à part pour l'operateur. Il s'agit du OU Exclusif (XOR). Le OU Exclusif fait en sorte que si, le bit de //PORTB// etait à "0", il le met a "1", si il etait à "1", il le met a "0". Les operateurs logique sont assez importants en fait, il convient de se renseigner sur le sujet. Les ressources sur internet ne manquent pas. Enfin, l'instruction //_delay_ms( 500.0 )// ; fait attendre le microcontrolleur 500ms avant de recommencer la boucle //for//. Le //return( 0 )// ; ici n'est jamais executé. et il ne le doit pas. Il n'est simplement parce qu'il faut un //return//. C'est pour faire plaisir au compilateur ! ^_^ ---- ===== Remarques, Propositions d'améliorations, Questions ===== Vous pouvez poster vos remarques, propositions d'amelioration, et questions sur le forum, dans la discussion prévue a cet effet : [[http://fablab-robert-houdin.org/fablab/phpBB-3.0.11-fr/phpBB3/viewtopic.php?f=3&t=11]] ----

tuto_avr_eclipse_un_1er_projet_-_clignotage_d_une_led.txt · Dernière modification: 2013/10/31 12:03 par spelle