Bonjour,
je suis en train de créer des variations d'éclairage sur le PORTA avec une carte MEGA 2560
J'utilise un passage à 0 qui déclenche une interruption qui appelle "void passage à 0"
Une commande (action continue sur une bouton ) modifie une consigne de niveau d'éclairage de 1 à 25 . Cette consigne relie les retards de phase correspondant au niveau d'éclairage.
J'ai un souci avec l'interruption ISR.
Ci après le code épuré des 2 interruptions concernées
// paz et isr siimplifiés pour l'essai de variation continue sut le bit 7 du PORTA
void passage_a_0 () {
TCNT1 = 0; // initialisation de TNCT1
if (variation_demandee == 128) { // on est sur le bit 7
PORTA &= ~variation_demandee; // extinction du bit 7
OCR1A = retard_phase[niv_ecl[7]]; // fixe la valeur de l'OCRIA
bitSet(TIMSK1, OCIE1A); // met le bit OCIE1A à 1 pour autoriser l'interruption de comparaison avec OCIE1A
}
n0++; // compte le nbre de passage dans cette interrup
}
ISR(TIMER1_COMPA_vect) {
PORTA |= 128; // on agit immédiatement sur le port avec le bit concerné
bitClear(TIMSK1, OCIE1A); // met le bit OCIE1A à 0 pour interdire l'interruption de comparaison avec OCR1A
n++; // compte le nbre de passage dans cette interruption
}
Problème:
Avec cette instruction bitClear(TIMSK1, OCIE1A); dans l'ISR pourtant nécessaire
l'ISR est exécuté immédiatement comme si l'OCR1A était à 0 ??
Par contre si cette instruction est supprimée, la variation se produit correctement en prenant bien en compte les valeurs de l'OCR1A du retard de phase . MAIS, en fonction de la valeur de OCRIA , l'ISR est appelée plusieurs fois avant le passage à 0 suivant
Pourquoi l'ISR est déclenché immédiatement en présence du 'bitClear' ?
Est-ce une erreur de code ou de carte défectueuse ?
Votre avis sur ce point me serai bien utile.