Pages: [1]   Go Down
Author Topic: Décalage horloge interne millis()  (Read 1073 times)
0 Members and 1 Guest are viewing this topic.
Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !! smiley-cry)

J'en ai finalement trouvé la raison :

Le code qui fonctionne : (j'ai un décalage de 1 à 3 seconde par jour)
Code:
// 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:
// 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
« Last Edit: February 02, 2011, 02:37:14 pm by Bubule » Logged

Massongex, Suisse
Offline Offline
Full Member
***
Karma: 3
Posts: 169
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 1
Posts: 47
Arduino rulez !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci bubule de ce infos
Logged

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

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


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.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Pages: [1]   Go Up
Jump to: