Heure fixe avec DS1307

Salut,

J'ai un souci avec mon arduino et son horloge.

L'heure ne change pas, elle reste a la valeur définie dans le setup.

J'ai changé le quartz, le ds1307 mais rien n'y fait. Je ne comprends pas...

Quelqu'un a une idée ? Merci

Bonjour le circuit Dallas DS1307 est une horloge temps réel (Real Time Clock), qui fournit secondes, minutes, heures, jours, dates, mois et années.
Le Dallas DS1307 est associé (entre les broches 1 et 2) à un quartz d’horlogerie de fréquence nominale 32,768 kHz.
Les années bissextiles sont prises en compte (jusqu’en 2100).
Le DS1307 s’interface avec un bus I2C, en configuration esclave :
Le DS1307 travaille dans le mode standard (fréquence d’horloge f SCL de 100 kHz)
L’adresse I2C (7 bits) du DS1307 est : 1 1 0 1 0 0 0
J’utilise un Arduino Mega pour l’initialiser via les ports I2C.
Composants:

Une plateforme Arduino
Un DS1307 (un DS1337 devrait faire l’affaire)
Un Cristal 32.768kHz
Une LED
Une Résistance (entre 10K et 33K)
Une batterie de 3V (pile bouton, battery holder,…)
Des fils

Voici mon programme qui fonctionne pour exemple si ca peut aider.
Clock_DS1307.pde

/*
Clock_DS1307.pde
Real Time Clock DS1307 avec Arduino Mega

*/
 
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
 
int rtc[7];
 
void Set_Square_Wave(int rate){  // set the square wave output on pin 7 of the DS1307 chip
  rate = rate + 144;                         // add 0x90 (dec 144) to rate
  Wire.beginTransmission(0x68);              // write the control register
  Wire.send(0x07);                           // register address 07H)
  Wire.send(rate);                           // 90H=1Hz, 91H=4kHz, 92H=8kHz, 93H=32kHz
  Wire.endTransmission();
}
 
void setup()
{
  Serial.begin(9600);
 
// Décommenter la partie suivante et mettez vos valeurs pour initialiser l'horloge
/*
  RTC.stop();
  RTC.set(DS1307_SEC,0);    // Secondes
  RTC.set(DS1307_MIN,59);   // Minutes
  RTC.set(DS1307_HR,20);    // Heures
  RTC.set(DS1307_DOW,4);    // Jour de la semaine
  RTC.set(DS1307_DATE,23);  // Jour du mois
  RTC.set(DS1307_MTH,12);   // Mois
  RTC.set(DS1307_YR,10);    // Année
  RTC.start();
*/
 
  // Mettre une resistance de pull up entre pin 7 et Vbat
  // 0=1hz, 1=4KHz, 2=8KHz, 3=32KHz
  Set_Square_Wave(0); // 1Hz
 
}
 
void loop()
{
  RTC.get(rtc,true);
 
  for(int i=0; i<7; i++)
  {
    Serial.print(rtc[i]);
    Serial.print(" ");
  }
  Serial.println();
 
  delay(1000);
 
}

Ce qui suit est à mettre dans : Arduino/libraries/DS1307

DS1307.cpp

extern "C" {
#include <../Wire/Wire.h>
}
#include "DS1307.h"
 
DS1307::DS1307()
{
  Wire.begin();
}
 
DS1307 RTC=DS1307();
 
// PRIVATE FUNCTIONS
 
// Aquire data from the RTC chip in BCD format
// refresh the buffer
void DS1307::read(void)
{
  // use the Wire lib to connect to tho rtc
  // reset the resgiter pointer to zero
  Wire.beginTransmission(DS1307_CTRL_ID);
    Wire.send(0x00);
  Wire.endTransmission();
 
  // request the 7 bytes of data    (secs, min, hr, dow, date. mth, yr)
  Wire.requestFrom(DS1307_CTRL_ID, 7);
  for(int i=0; i<7; i++)
  {
    // store data in raw bcd format
    rtc_bcd[i]=Wire.receive();
  }
}
 
// update the data on the IC from the bcd formatted data in the buffer
void DS1307::save(void)
{
  Wire.beginTransmission(DS1307_CTRL_ID);
  Wire.send(0x00); // reset register pointer
  for(int i=0; i<7; i++)
  {
    Wire.send(rtc_bcd[i]);
  }
  Wire.endTransmission();
}
 
// PUBLIC FUNCTIONS
void DS1307::get(int *rtc, boolean refresh)   // Aquire data from buffer and convert to int, refresh buffer if required
{
  if(refresh) read();
  for(int i=0;i<7;i++)  // cycle through each component, create array of data
  {
    rtc[i]=get(i, 0);
  }
}
 
int DS1307::get(int c, boolean refresh)  // aquire individual RTC item from buffer, return as int, refresh buffer if required
{
  if(refresh) read();
  int v=-1;
  switch(c)
  {
  case DS1307_SEC:
    v=(10*((rtc_bcd[DS1307_SEC] & DS1307_HI_SEC)>>4))+(rtc_bcd[DS1307_SEC] & DS1307_LO_BCD);
    break;
  case DS1307_MIN:
    v=(10*((rtc_bcd[DS1307_MIN] & DS1307_HI_MIN)>>4))+(rtc_bcd[DS1307_MIN] & DS1307_LO_BCD);
    break;
  case DS1307_HR:
    v=(10*((rtc_bcd[DS1307_HR] & DS1307_HI_HR)>>4))+(rtc_bcd[DS1307_HR] & DS1307_LO_BCD);
    break;
  case DS1307_DOW:
    v=rtc_bcd[DS1307_DOW] & DS1307_LO_DOW;
    break;
  case DS1307_DATE:
    v=(10*((rtc_bcd[DS1307_DATE] & DS1307_HI_DATE)>>4))+(rtc_bcd[DS1307_DATE] & DS1307_LO_BCD);
    break;
  case DS1307_MTH:
    v=(10*((rtc_bcd[DS1307_MTH] & DS1307_HI_MTH)>>4))+(rtc_bcd[DS1307_MTH] & DS1307_LO_BCD);
    break;
  case DS1307_YR:
    v=(10*((rtc_bcd[DS1307_YR] & DS1307_HI_YR)>>4))+(rtc_bcd[DS1307_YR] & DS1307_LO_BCD)+DS1307_BASE_YR;
    break;
  } // end switch
  return v;
}
 
void DS1307::set(int c, int v)  // Update buffer, then update the chip
{
  switch(c)
  {
  case DS1307_SEC:
    if(v<60 && v>-1)
    {
    //preserve existing clock state (running/stopped)
    int state=rtc_bcd[DS1307_SEC] & DS1307_CLOCKHALT;
    rtc_bcd[DS1307_SEC]=state | ((v / 10)<<4) + (v % 10);
    }
    break;
  case DS1307_MIN:
    if(v<60 && v>-1)
    {
    rtc_bcd[DS1307_MIN]=((v / 10)<<4) + (v % 10);
    }
    break;
  case DS1307_HR:
  // TODO : AM/PM  12HR/24HR
    if(v<24 && v>-1)
    {
    rtc_bcd[DS1307_HR]=((v / 10)<<4) + (v % 10);
    }
    break;
  case DS1307_DOW:
    if(v<8 && v>-1)
    {
    rtc_bcd[DS1307_DOW]=v;
    }
    break;
  case DS1307_DATE:
    if(v<32 && v>-1)
    {
    rtc_bcd[DS1307_DATE]=((v / 10)<<4) + (v % 10);
    }
    break;
  case DS1307_MTH:
    if(v<13 && v>-1)
    {
    rtc_bcd[DS1307_MTH]=((v / 10)<<4) + (v % 10);
    }
    break;
  case DS1307_YR:
    if(v<20 && v>-1)
    {
    rtc_bcd[DS1307_YR]=((v / 10)<<4) + (v % 10);
    }
    break;
  } // end switch
  save();
}
 
void DS1307::stop(void)
{
    // set the ClockHalt bit high to stop the rtc
    // this bit is part of the seconds byte
    rtc_bcd[DS1307_SEC]=rtc_bcd[DS1307_SEC] | DS1307_CLOCKHALT;
    save();
}
 
void DS1307::start(void)
{
    // unset the ClockHalt bit to start the rtc
    // TODO : preserve existing seconds
    rtc_bcd[DS1307_SEC]=0;
    save();
}

DS1307.h

/*
  DS1307.h - library for DS1307 rtc
*/
 
// ensure this library description is only included once
#ifndef DS1307_h
#define DS1307_h
 
// include types & constants of Wiring core API
#include
 
// include types & constants of Wire ic2 lib
#include <../Wire/Wire.h>
 
#define DS1307_SEC 0
#define DS1307_MIN 1
#define DS1307_HR 2
#define DS1307_DOW 3
#define DS1307_DATE 4
#define DS1307_MTH 5
#define DS1307_YR 6
 
#define DS1307_BASE_YR 2000
 
#define DS1307_CTRL_ID B1101000  //DS1307
 
 // Define register bit masks
#define DS1307_CLOCKHALT B10000000
 
#define DS1307_LO_BCD  B00001111
#define DS1307_HI_BCD  B11110000
 
#define DS1307_HI_SEC  B01110000
#define DS1307_HI_MIN  B01110000
#define DS1307_HI_HR   B00110000
#define DS1307_LO_DOW  B00000111
#define DS1307_HI_DATE B00110000
#define DS1307_HI_MTH  B00110000
#define DS1307_HI_YR   B11110000
 
// library interface description
class DS1307
{
  // user-accessible "public" interface
  public:
    DS1307();
    void get(int *, boolean);
    int get(int, boolean);
    void set(int, int);
    void start(void);
    void stop(void);
 
  // library-accessible "private" interface
  private:
    byte rtc_bcd[7]; // used prior to read/set ds1307 registers;
    void read(void);
    void save(void);
};
 
extern DS1307 RTC;
 
#endif

Normalement après avoir charger le programme et lancer l’interface serial, la led devrait se mettre à clignoter chaque seconde.

Edit de Jean-François : merci de mettre les balises [ code][ /code]

ça ressemble à une réinitialisation régulière du DS1307... Ton init se fait bien dans la partie setup, et pas dans la partie loop ?

On pourrait voir ton code et ton schéma de branchement ?

/*
  RTC.stop();
  RTC.set(DS1307_SEC,0);    // Secondes
  RTC.set(DS1307_MIN,59);   // Minutes
  RTC.set(DS1307_HR,20);    // Heures
  RTC.set(DS1307_DOW,4);    // Jour de la semaine
  RTC.set(DS1307_DATE,23);  // Jour du mois
  RTC.set(DS1307_MTH,12);   // Mois
  RTC.set(DS1307_YR,10);    // Année
  RTC.start();
*/

il faut vérifier que les /* */ sont bien remis après le premier démarrage