watchdog timer plus lent que la seconde

Bonjour,

J'essaie d'endormir et de réveiller un atmega avec le watchdog timer :

#include "LowPower.h"   // https://github.com/rocketscream/Low-Power

void setup(void)
{
  pinMode (13, OUTPUT);
}

void loop(void)
{
  go_to_sleep();
  blink_led();
}

void blink_led() {
  digitalWrite (13, HIGH);
  delay(1);
  digitalWrite (13, LOW);
}

void go_to_sleep() {
  LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);
}

En principe la led devrait clignoter toutes les secondes (à quelques millisecondes près). En pratique elle est légèrement plus lente (1.1 seconde).

J'ai testé sur : - arduino pro mini (version ebay, 8Mhz 3V adjutable, sans régulateur avec du 3.7V direct). FAIL. - arduino pro mini (version ebay, 16Mhz 5V adjutable). FAIL. - diavolino. FAIL - arduino uno R3 (original). Ca marche.

Testé en programmant le watchdog directement avec les registres (sans la librairie LowPower). Ca ne marche pas mieux.

Je pensais que les pro mini ebay ont un problème, mais le diavolino, qui est grosso-modo un atmega328 de base avec un quartz, a le même symptôme. Les seuls point communs seraient peut-être le bootloader.

Quand je fais clignoter une led avec un delay(1000), ça marche dans tous les cas.

Quand je mets le watchdog à 8s, il me semble que le 1/10 de seconde supplémentaire est toujours là.

Je suppose qu'il y a un problème de mécanique interne... mais je ne vois pas quels pourraient être les leviers.

Merci de vos lumières.

Bonjour

J'ai trouvé ceci qui devrait t'éclairer.

Apparemment c'est inhérent au fonctionnement même du timer watchdog. Donc si tu veux de la régularité il vaut mieux être réveillé par un dispositif externe de type RTC.

Très précieux. Merci pour ce lien.

Donc si tu veux de la régularité il vaut mieux être réveillé par un dispositif externe de type RTC.

En fait j’endors aussi le DS3231. Il consomme 10 fois moins quand je coupe le signal carré. Je voulais également éviter de le solliciter chaque seconde pour synchroniser, histoire de gagner des uW. Je pensais utiliser la seconde du watchdog et faire avancer le temps avec adjustTime(1). Mais si c'est pas possible c'est pas grave, je vais m'accommoder du décalage en gérant ma propre horloge en "float", et avec une synchronisation sur le DS3231 de temps en temps (mais pas chaque seconde). Ca devrait bien le faire...

Merci.