unsigned char temps = 1;
unsigned char temps_memoire = 1;
volatile unsigned char t_122 = 0;
volatile signed char direction = 1;
void setup() {
Serial.begin(9600);
pinMode(2, OUTPUT); // Configurer le pin 2 pour la DEL
TCCR1A = 0; // Initialisation de TCCR1A
TCCR1B = 0; // Initialisation de TCCR1B
TCCR1B |= B00000010; // Prescaler = 8 (pour une fréquence de 244 Hz)
TCNT1 = 57338; // Valeur initiale pour le timer
TIMSK1 |= B00000001; // Active l'interruption de débordement du Timer1
}
void loop() {
if (temps != temps_memoire) {
temps_memoire = temps; // Mémoriser la nouvelle valeur de temps
clignote(temps); // Appeler la fonction pour faire clignoter la DEL
}
Serial.print("Temps: ");
Serial.println(temps);
Serial.print("Direction: ");
Serial.println(direction);
Serial.print("t_122: ");
Serial.println(t_122);
}
void clignote(unsigned char valeur) {
while (valeur > 0) {
delay(250); // Attendre 250 ms
digitalWrite(2, HIGH); // Allumer la DEL
delay(50); // Attendre 50 ms
digitalWrite(2, LOW); // Éteindre la DEL
valeur--; // Décrémenter la valeur
}
}
ISR(TIMER1_OVF_vect) {
TCNT1 = 57338; // Remettre à zéro le compteur du Timer1 pour maintenir l'intervalle
t_122++; // Incrémenter la variable t_122
// Vérifier si t_122 a atteint 800 pour mettre à jour le temps
if (t_122 > 800) {
t_122 = 0; // Réinitialiser t_122
temps += direction; // Incrémenter ou décrémenter temps selon la direction
// Gérer les limites de temps
if (temps > 10) {
temps = 9;
direction = -1; // Inverser la direction (décrémenter)
}
else if (temps < 1) {
temps = 2;
direction = 1; // Inverser la direction (incrémenter)
}
}
}
/*
Exercice:
Avec un Arduino Uno, écrire un programme qui compte de 1 à 10 et qui affiche la valeur du compte sur 1 DEL en la faisant clignoter. Le programme utilise les interruptions du compteur 1 afin de maintenir la valeur du temps. Le temps est compté en boucle de 1 à 10 et est incrémenté à chaque 4 secondes approximativement. Le compteur décompte lorsqu’il est rendu à 10.
Variables globales
temps = Caractère non signé volatile variant de 1 à 10.
temps_memoire = Caractère non signé variant de 1 à 10.
t_122 = Entier non signé volatile variant de 0 à 799
direction = Caractère signé volatile : 1 => Incrémente; -1 => Décrémente
Fonction void setup(void)
- Initialiser le port de communication série à 9600 bauds.
- Initialiser la variable globale « temps » à un.
- Initialiser la variable globale « temps_memoire » à un.
- Initialiser les ports reliés à la DEL en sortie (OUTPUT).
- Initialiser l’interruption du compteur 1 à une fréquence de 244 Hz
(TIMSK1, TCCR1A et TCCR1B)
- Initialiser le fanion de direction à 1 (incrémente).
Fonction void loop(void)
- Si le temps est différent du temps mémorisé
- Mémoriser la valeur du temps dans la variable temps_memoire
- Appeler la fonction clignote() avec la valeur temps en paramètre.
- Délai de 100 ms
Fonction void clignote(unsigned char valeur)
Valeur de retour: Aucune
Paramètre : caractère non signé contenant la valeur du nombre de clignotement.
- Tant que valeur > 0
- Attendre 250 ms
- Allumer la DEL
- Attendre 50 ms
- Éteindre la DEL
- Décrémenter valeur
Fonction ISR(TIMER1_OVF_vect)
- Incrémenter la variable t_122.
- Si la valeur de t_122 est > que 800
- Mettre la valeur de t_122 à zéro.
- Incrémenter/décrémenter de 1 la variable temps selon la direction.
- Si la variable temps est > 10
- Mettre la variable temps à 9
- Mettre le fanion de direction à -1
- Sinon si la variable temps < 1
- Mettre la variable temps à 2
- Mettre le fanion de direction à 1
*/