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 1)2) 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éé.

: 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 :

#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 ) ;
}

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.

#include <avr/io.h>

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) :

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

Ce dernier commutateur se traduit par la définition du symbole __AVR_ATmega328P__.

#include <util/delay.h>

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.

int main( void )
{

Ensuite, nous avons la ligne suivante :

DDRB |= (1 << PB5 ) ;

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 :

for( ; ; )
{
    [...]
}

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 :

PORTB ^= (1 << PB5 ) ;

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