Cours:TPS 2103 1

De troyesGEII
Aller à : navigation, rechercher

Retour à la liste des Tps

Éléments de correction


Nous avons abordé la programmation des cartes arduino au premier semestre en utilisant des fonctions de haut niveau ce qui, bien que pouvant simplifier certaine tâche, présente un certain nombre de limitation.

L'objectif de ces TPs est de découvrir le fonctionnement du µcontrôleur Atmega328p et d'en explorer les possibilités.

Nous commencerons simplement de façon analogue au premier TP du module M1102 en configurant des e/s (il est sans doute utile de jeter un coup d’œil au lien précédent !).

Ex 1: mise en jambe !

On considère la led f5. La patte correspondante (PB5) sera donc une sortie (commande) pour le µcontrôleur. On configure donc le registre de direction de la façon suivante :

DDRB bit 7 6 5 4 3 2 1 0
Valeur 0 0 1 0 0 0 0 0

Question.jpg Compléter le programme suivant pour que la led s'allume et s'éteigne pendant 500ms

Remarque : On utilisera astucieusement l'opérateur ^

void setup()
{
   DDRB = 0x?? ;         // configuration des e/s (registre de direction DDRx) sur le port D.
}

void loop()
{
   PORTB ???? ;          // on modifie en conséquence l'état de la sortie
   ....                  // il faudra utiliser la fonction delay !
}
Bluebg.png
Aidesmall.png
À propos de cette image

Version simple pour la led f0


void setup()
{
   DDRB = 0x01 ;         // configuration des e/s (registre de direction DDRx) sur le port D.
}

void loop()
{
   PORTB = 0x00 ;          // mise à zéro de la sortie
   delay(500);
   PORTB = 0x01 ;         // mise à un de la sortie
   delay(500);
}

Ex 2: bouton et led

Nous considérons pour le moment le bouton A et la led de droite (p0).

Question.jpg Complétez le programme suivant pour que la led s'allume si le bouton est appuyé

void setup()
{
   DDRD = 0x?? ;                 // configuration des e/s (registre de direction DDRx) sur le port D.
}

void loop()
{
   if ( (PIND & 0x?? ) != 0 )    // on observe l'état de l'entrée
         PORTD = 0x??;          // on modifie en conséquence l'état de la sortie
   else
         PORTD = 0x??;
}
Bluebg.png
Aidesmall.png
À propos de cette image

Debuggage


Il faut apprendre à debugger un programme. Le plus simple est de se servir de la liaison série :

void setup()
{
   Serial.begin(9600);
   DDRD = 0x?? ;                 // configuration des e/s (registre de direction DDRx) sur le port D.
}

void loop()
{
   unsigned char res;
   res = PIND & 0x??;
   Serial.print("res = ");
   Serial.println(res,BIN);
   if ( (res) != 0 )
   {
         Serial.println("le test est vrai.");
         PORTD = 0x??;          // on modifie en conséquence l'état de la sortie
   }
   else
   {
         Serial.println("le test est faux.");
         PORTD = 0x??;
   }
   delay(200);                  // indispensable pour ne pas avoir un affichage trop rapide !
}

Question.jpg On peut simplifier le programme précédent en utilisant l'opérateur décalage : il suffit de "recopier" l'état du bouton poussoir (PD2) sur la led (PD6) en décalant de 4 bits (PD6-PD2 vers la gauche

void setup()
{
  DDRD = 0x?? ; // configuration des e/s (registre de direction DDRx) sur le port D.
}

void loop()
{
  PORTD = (PIND&0x??)<<4;
}