Décalage horloge interne millis()

Bonjour

Pour mémoire, le post initial était lancé sur l'ancien forum : http://arduino.cc/forum/index.php/topic,33698.15.html

Je constatais un décalage de mon horloge créée à partir de la variable interne millis().

Jean François avait trouvé une astuce qui fonctionnait bien (chez lui... Mais pas chez moi !! =()

J'en ai finalement trouvé la raison :

Le code qui fonctionne : (j'ai un décalage de 1 à 3 seconde par jour)

// HORLOGE 
    if (millis() >= refTemps){
       refTemps += 1000;
       seconde++;      
      if (seconde >= 60) {  // à chaque 60 secondes
          minute++ ;        // Incrémentation des minutes
          seconde = 0;       
        if (minute >= 60) {
            heure++ ;       // Incrémentation des heures
            minute = 0 ;
          if (heure >=24) {
                heure = 0 ; // réinitialise l'horloge toutes les 24h
             }
            }
           }
          }

Celui qui ne fonctionne pas et procure un décalage important. Plus de trente minutes par jour

// HORLOGE 
    if (millis() >= refTemps){
       refTemps += 100;
       seconde++;      
      if (seconde >= 600 {  // à chaque 60 secondes
          minute++ ;        // Incrémentation des minutes
          seconde = 0;       
        if (minute >= 60) {
            heure++ ;       // Incrémentation des heures
            minute = 0 ;
          if (heure >=24) {
                heure = 0 ; // réinitialise l'horloge toutes les 24h
             }
            }
           }
          }

Le but était d'incrémenter toutes les 0.1 seconde afin d'utiliser cette valeur ailleurs dans le programme, pour incrémenter une variable de commande d'un servomoteur toutes les 100ms.

La raison la plus vraisemblable est que la scrutation n'est pas assez rapide, et n'incrémente pas systématiquement la variable "seconde" .
Petite précision, je n'ai pas d'instruction Delay() dans le programme.

Merci pour votre aide !
Franck

Salut,

Bubule:
Je constatais un décalage de mon horloge créée à partir de la variable interne millis().
(...)
La raison la plus vraisemblable est que la scrutation n'est pas assez rapide, et n'incrémente pas systématiquement la variable "seconde" .
Petite précision, je n'ai pas d'instruction Delay() dans le programme.

Peut-être qu'il serait préférable d'utiliser dans ce cas les interruptions.
Je n'ai pas essayé avec l'environnement Arduino (seulement avec un atmega168 tout seul), mais je pense que c'est une bonne solution pour ne pas avoir de problème de décalage.

churchill

merci bubule de ce infos

Bubule:
La raison la plus vraisemblable est que la scrutation n'est pas assez rapide, et n'incrémente pas systématiquement la variable "seconde" .

Pour contrôler ça tu peux rajouter un Serial.print(micros()) et tu regardes combien de temps ça mets pour rentrer dans ta boucle de contrôle, si ça mets 10'001 microsecondes c'est rapé pour le 1/10eme de seconde.