[résolu] une interruption qui freeze le 328p avec appel à DS3231RTC ou RTClib

Salut!
Un projet d'horloge...
J'ai tenté d'utiliser une interruption à partir d'une alarme du DS3231. Impossible avec RTClib, j'ai donc utilisé DS3231RTC. Ça fonctionne très bien si je surveille l'alarme dans le loop(), mais si je fais un ISR, il plante. L'idée est de récupérer l'heure chaque minute (chaque seconde dans mon test). Voici l'appel et l'ISR:

attachInterrupt(0, updateTime, FALLING);

(...)

  void updateTime() {   //in timeArray
  digitalWrite(lD,1) ;
  Serial.print("TICK") ;
  Serial.println() ;
  /*DateTime now = rtc.now();
  timeArray[h1] = now.hour() / 10 ; 
  timeArray[h2] = now.hour() % 10 ;
  timeArray[m1] = now.minute() / 10 ;
  timeArray[m2] = now.minute() % 10 ;
  RTC.alarm(ALARM_1) ; //remettre l'alarme à 0*/
}

J'ai bien la led lD qui s'allume, le "TICK" qui s'affiche dans le serial monitor, et les instructions loop() qui parte, mais sitôt que je décommente une des instruction rtc ou RTC, même la remise à 0 de l'alarme, je n'ai plus que le "TI" sur le terminal et tout plante...
Possible que ce soit trop pour un ISR?

Na pas faire d'appel à une fonction I2C dans une interruption.

Il vaut mieux positionner une variable volatile à 1 dans la routine d'interruption.
Ensuite

  • consulter cette variable dans la loop
  • si elle est à 1:
  • faire les traitements
  • remettre à ZÉRO la variable

Aucun traitement dans la routine d'interruption (y compris Serial.print), c'est préférable.

Merci hbachetti!
Effectivement, maintenant ça fonctionne. Je savais qu'il fallait faire simple dans les ISR, mais pas à ce point.
Et quelle galère pour configurer cette alarme. Je vais tout uniformiser avec la lib DS3231RTC.

Certaines opérations utilisent les interruptions, I2C par exemple.
Pendant une interruption, les interruptions soient masquées, donc l'I2C bloque.

ok, merci pour la précision!