Pages: 1 [2]   Go Down
Author Topic: Décalage horloge interne millis()  (Read 4497 times)
0 Members and 1 Guest are viewing this topic.
Geneva
Offline Offline
Faraday Member
**
Karma: 30
Posts: 3228
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lorsque la variable refTemps revient à zéro au pire tu as un décalage de 1 seconde... mais ça n'arrive que tout les 50 jours.
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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 39
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je rencontre aussi un problème de dérive de millis().

J'avais fait un premier montage simple avec une duelmilanove. Je commande 2 nouvelles UNO et le décalage me parait beaucoup plus grand et quasi identique sur les 2 nouvelles que sur l'ancienne.
Logged

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

Le problème provient du quartz, ceux pour les horloges ou pour les mesures du temps sont de 32.768khz.

Si on divise  32'768 par 2, par 2, par 2, par 2..... etc etc on arrive finalement à 1.

Même opération avec 16Mhz, on divise par 2, par 2, par 2,par 2... etc etc finalement on tombe sur un nombre à virgule, donc imprécis.
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

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

Une possibilité pour ceux qui ne veulent absolument pas utiliser un DS1307, faire ce montage :



Avec ce code :

Quote
// Déclaration des variables et constantes horloge

int jour=19;                // Jour de l'horloge
int heure = 18;             // Heures de l'horloge
int minute = 6;            // Minutes de l'horloge
int demiSeconde = 30;            // Secondes de l'horloge


void setup() {

  // Initialise la liaison série
  Serial.begin(19200);
  attachInterrupt(1, TicTac, RISING);

}


void loop() {

  if(demiSeconde>=120){                // lorsque l'on a 120 demi-secondes
    minute++;                     // on additionne 1 minute
    demiSeconde=0;                    // et on remet les seconde a zero
    if(minute>=60){               // lorsque les minutes arrivent a 60
      heure++;                    // on additionne 1 heure
      minute=0;                   // et on remet .... etc, etc
      if(heure>=24){
        jour++;
        heure=0;

      }
    }
  }

  // on envoie dans le moniteur serie le jour, l'heure, les minutes et les secondes....
  Serial.print(jour);
  Serial.print("     ");  
  Serial.print(heure);
  Serial.print("     ");  
  Serial.print(minute);
  Serial.print("     ");  
  Serial.println(demiSeconde/2);   // on divise par deux pour avoir les secondes

}

void TicTac()         // a chaque tic du diviseur de frequence + 0,5 seconde
{
  demiSeconde++;      // a 2Hz il y a deux tics par secondes, donc toutes les 0.5 secondes
}


Par contre je ne sais pas ce que cela donne avec un code plus conséquent que simplement les Serial.print....

Mais ça donne déjà une petite idée  smiley, tel quel le sketche fait 2542 bytes.

Aussi il est possible de remettre un deuxième CD4060 et diviser les Hz afin d'avoir un tic toutes les secondes, 2 secondes, 4 secondes...etc.(après 4 c'est plus un sous multiple de 60, donc pour une base de temps ça ne sera pas idéal  :smiley).

Il faut faire rentrer le signal qui sort du premier en le mettant sur la pin 11 du deuxième.  smiley-wink
« Last Edit: January 20, 2011, 03:18:00 pm by jfs » 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 [2]   Go Up
Jump to: