LOCODUINO
Parlons Arduino => Débuter => Discussion démarrée par: JPM06 le février 19, 2020, 11:55:19 am
-
Bonjour à tous,
Débutant en Arduino, j'essaie d'utiliser le timer 1 sans interruption ni rechargement, mais j'obtiens un résultat erroné quant au timing.
Comme un listing vaut mieux qu'un long discours, voici le code, resucée d'un exemple pris ici :
/*
* Clignotement d'une DEL (LED en anglais) par timer 1.
*/
const byte Led = 13; // Pour utiliser la LED du module
void setup () {
pinMode (Led, OUTPUT);
TCCR1A = 0;
cli(); //au cas où
// horloge de base 16MHz -> période 0,0625 µs. Compteur à 16 bits
TCCR1B = 0b00000011; // division par 64, on compte en 4µs, on déborde toutes les 262,144ms
TIFR1 = 0b00000001; // TOV1
TIMSK1 = 0b00000000; // Interruption locale bloquée par TOIE1
}
int varCompteur = 0; // La variable compteur
void loop () {
if (bitRead (TIFR1, 0) == 1) { // Flag TOV2 mis à 1 ?
bitSet (TIFR1, TOV1); // Remise à zéro du flag TOV1 (voir texte)
//pour vérifier les 262ms on compte 10 fois
if (varCompteur++ > 10) { // <<<<<<<<<<<<<<<<<<<< chrono: 32s au lieu de 26,2s
varCompteur = 0; // On recommence un nouveau cycle
digitalWrite (Led, !digitalRead(Led)); // Inversion de la LED
}
}
}
Pourquoi cette erreur ?. Y a-t-il interférence avec une autre ressource ?
Merci pour toute piste.
JPM06
-
Finalement le problème était au niveau du comptage: pour compter 10 fois la durée du timer, il faut écrire:
if (++varCompteur == 10)
ou bienif (varCompteur++ == 9)
ou encoreif (++varCompteur > 9)
.
Pour de grandes valeurs du compteur comme 125 on ne voit pas trop la différence, mais pour de faibles valeurs, si. Là c'est bon.
Une erreur de débutant en C!