Go Down

Topic: Décalage horloge interne millis() (Read 1 time) previous topic - next topic

Bubule

Feb 02, 2011, 06:44 pm Last Edit: Feb 02, 2011, 08:37 pm by Bubule Reason: 1
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)
Code: [Select]
// 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
Code: [Select]
// 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

churchill

Salut,


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

forex2

Arduino Uno                / Arduino 022
Arduino Mega 2560
Ethernet/uSDcard shield Wiznet
--------------------------------------------
Airi

Jean-François



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.
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Go Up