Cours:TPS 2103 tp1 supplement
Sommaire
plusieurs leds ...
Plusieurs leds simultanées
Modifier le programme précédent pour ajouter une deuxième led (f1) s'allumant et s'éteignant au même rythme
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 !
Écrire le programme répondant au cahier des charges
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.
Ensuite, il suffit d'utiliser 2 variables n1 et n2, telles que :
|
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é.
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
}
}
#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 :
La led (à choisir) s'allume à l'appui sur le bouton B, et s'éteint à l'appui sur C