Cours:TPS 2103 tp1 supplement

De troyesGEII
Aller à : navigation, rechercher

plusieurs leds ...

Plusieurs leds simultanées

Question.jpg Modifier le programme précédent pour ajouter une deuxième led (f1) s'allumant et s'éteignant au même rythme

Question.jpg Faire en sorte que les 2 leds soient allumées en alternance

Les limites ...

On souhaite avoir 2 rythmes différents pour le clignotement. L'une des leds aura une période de 1s (2x500ms), et l'autre led de 200ms (2x100ms).

On constate aisément que le rapport entre les périodes est de 5, on choisira un "delay" de boucle de 100ms et il suffira de ne changer l'état de la 2ème led que toutes les 5 itérations, suivant le principe suivant :

#include <avr/io.h>
#include <util/delay.h>

int main()
{
   uint8_t n=0;
   // configuration
   ...
   while(1)
   {
      n++;
      PORTx .....;
      if (n==Nb)   // toutes les Nb itérations
      {
         ...
         n=0;
      }
      _delay_ms(???); // un seul delay dans le programme
   }
   return 0;
}

Comme le commentaire l'indique le programme ne doit comporter qu'un seul delay !!! Il faut donc bien le choisir !

Question.jpg Écrire le programme répondant au cahier des charges

Question.jpg Essayer ensuite de modifier le programme pour avoir un changement d'état toutes les 225ms pour l'une des leds et 190ms pour l'autre.

Bluebg.png
Aidesmall.png
À propos de cette image

principe :


Il faut trouver un commun diviseur aux 2 périodes, que l'on nommera T.

Ensuite, il suffit d'utiliser 2 variables n1 et n2, telles que :

  • 225=n1.T
  • 190=n2.T


Complément : Changement d'état sans interruptions

Explication

Malheureusement, toutes les entrées ne peuvent déclencher une interruption spécifique.

Dès lors, il peut être utile de changer de technique pour détecter les changements d'état des entrées.

C'est ce que nous proposons d'étudier dans cette parties.

Passé Présent

On souhaite maintenant changer l'état de la led (p0) à chaque appui sur le bouton poussoir A (PD2).

On rappelle comme vu en module M1103 que l'une des méthodes repose sur la notion de présent et passé.

Question.jpg Le code suivant (à compléter) répond à ce cahier des charges

#include <avr/io.h>
#include <util/delay.h>
#include <avr/sfr_defs.h>
uint8_t etatPresent=0,etatPasse=0;
unsigned char etatSortie=0;
int main()
{
   DDRD |= (1<<...);            // configuration des e/s
   while(1)
   {
      etatPasse=etatPresent;
      if ( bit_is_clear(PINx,....) )                  // si le bouton est relâché
           etatPresent = 0;
      else etatPresent = 1;

      if ((etatPresent != 0) && (etatPasse == 0))   PORTD ^= (1<<...);  // modifier la sortie associée à la led p0
   }

}
Bluebg.png
Aidesmall.png
À propos de cette image

Ou plus compact :



#include <avr/sfr_defs.h>
uint8_t etatPresent=0,etatPasse=0;
unsigned char etatSortie=0;

int main()
{
   DDRD |= (1<<...);            // configuration des e/s
   while(1)
   {
      etatPasse=etatPresent;
      etatPresent = bit_is_set(PIND,.... );                        // 2 valeurs possibles pour etatPresent : 0 ou "différent de 0"
      if ((etatPresent != 0) && (etatPasse == 0))   PORTD ^= (1<<..);  // modifier la sortie associée à la led p0
   }

}

Utilisation

En utilisant ce principe, écrire le programme répondant à la question suivante :

Question.jpg La led (à choisir) s'allume à l'appui sur le bouton B, et s'éteint à l'appui sur C

Prolongement possible : Grafcet