Timer1 et gestion des interruptions (overflow)

Bonjour à tous,

Débutant sur Arduino / AVR, j'essaye de faire un programme qui utilise le timer1. Globalement, pas de soucis pour déclencher une fonction avec le timer1, à la période voulue (période 1 seconde avec le prescaler 1024 et le TCNT1 qui va bien), et qui déclenche une ISR (débordement du timer) qui affiche un message sur la liaison série.

J'ai ensuite voulu mettre en place une ISR qui ne change que l'état d'une variable binaire. L'idée était dans le main de faire un while sur attente de changement d'état de la variable, mais ceci ne marche pas :

ISR(TIMER1_OVF_vect)
{ 
  TCNT1 = TCNT1_1000ms;
  call_int1 = 1;
  Serial.println("message1");
  Serial.flush();
}


// the loop function runs over and over again forever
void loop() {

  int une_variable = 0;

  while(call_int1 == 0)
  {
    //Serial.flush();
    //une_variable++;
    
  }
  call_int1 = 0;
  Serial.println("message2");
  Serial.flush();
}

Dans tous les cas, le message1 de l'ISR est affiché, avec la période attendue de 1s.

En revanche, en fonction de ce qui est commenté dans le while : - si le while est vide : pas d'affichage de message 2 - si le while est seulement occupé par le une_variable++, la fréquence du message 2 est bien plus importante que celle du message 1 (comme si on ne remettait pas le call_int1 à 0 - si le while est occupé par le flush(); miracle, les deux messages sont synchros.

Bref, le comportement semble assez aléatoire et lié à la structure de la fonction d'attente à base de while, et peut être à la lib Serial. Quelqu'un saurait-il me dire d'où vient cette variabilité d'exécution ?

Merci d'avance.

Petit ajout : si on met dans le while un simple "delay(0);", les messages sont également synchros. Mystère...

hello while (call_int1== 0){} ====> while (call_int1 = 0){}

voivi un code qui semble fonctionner

unsigned long TCNT1_1000ms = 0x000f;
int call_int1 = 0;
void setup()
{
  Serial.begin(115200);
  TCCR1A = 0x00;// 0=>mode Normal, 2=>CTC
  TCCR1B = 0x05;//5=>prescaler de 1024
  TCNT1L = 0x00;
  TCNT1H = 0x00;
  TIMSK1 = 0x20;
  sei();
  }
  
  
ISR(TIMER1_OVF_vect)
{
  TCNT1 = TCNT1_1000ms;
  call_int1 = 1;
  Serial.println("message1");
  Serial.flush();
}


// the loop function runs over and over again forever
void loop() {

  int une_variable = 0;

  while(call_int1 = 0)
  {
    Serial.flush();
   une_variable++;
   
  }Serial.println("********************CTC timer1");
  call_int1 = 0;
  Serial.println("message2");
  Serial.flush();
}