Go Down

Topic: Décalage horloge interne millis() (Read 5208 times) previous topic - next topic

Jean-François

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

Franxoois

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.

Jean-François

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

Jean-François

#18
Jan 20, 2011, 08:20 pm Last Edit: Jan 20, 2011, 09:18 pm by jfs Reason: 1
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  :), 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  ::)).

Il faut faire rentrer le signal qui sort du premier en le mettant sur la pin 11 du deuxième.  ;)
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

Go Up