RTC DS1307

Bonjour,

J’ai un petit problème que je n’arrive pas à résoudre.
Tout d’abord il faut savoir que j’utilise un arduino mega et un RTC dont voici le

lien: Module RTC DS1307 linker LK-RTC - Modules Linker | GO TRONIC

Alimenté pour une pile ayant maintenant une tension de 2.94v ayant la référence CR2032.

Lorsque j’enlève la pile du module et que je relie les deux borniers par un fil le module est bien détecté par mon programme qui scan les adresse i2c.
Lorsque je met la pile plus rien n’est détecté, je ne sais pas comment résoudre le problème.

J’ai vérifié la datasheet du composant et dans mon cas Vbat = 2.94v et Vcc = 4.94v.

Voici le code que j’utilise pour scanner les adresses:

/* SCANNER I2C  Version 2.00 --------------------------------------------

   Scan le bus i2c  a la recherche de peripheriques.
   Scan des adresses 1 (0x01) a 127 (0x7F)
   L'adresse 0 (reservee) est simulee et non lue.

   Affichage du resultat en grille de 16 lignes de 8 colonnes (16x8=128).

   L'affichage de chaque adresse est signalee par :
    - son adresse en hexadecimale (0x00) si elle est  occupee,
    - 4 dieses (####) si elle est  occupee par un peripherique en defaut
    - 4 points (....) si elle est inoccupee,

   Un resume indique, en fin de programme, le nombre de peripheriques trouves
   et, eventuellement, le nombre de peripheriques en defaut.

   Pour refaire un scan, il suffit d'appuyer sur le bouton Reset car :
    - tout le code est dans la fonction setup()
    - la fonction loop() n'est pas utilisee

   Ameliorations possibles :
    - Affichage en hexadecimal des adresses en defaut
    - Affichage des adresses en hexadecimmal et des valeurs de retour
      de la fonction  Wire.endTransmission()
    - Affichage du type de peripherique detecte
    - ...

  ----------------------------------------------------------------------*/

#include <Wire.h> /* Indispensable pour la gestion de l'I2C */

void setup()
{
  /* Les variables du programme */
  byte adresse;       /* variables de gestion des adresses */
  byte resultat;      /* Variable de retour d'interrogation d'une adresse */
  byte nb_existe = 0; /* compteur de peripheriques trouves */
  byte nb_defaut = 0; /* compteur de peripheriques en defaut */

  Wire.begin();       /* Initialise le bus i2C */
  Serial.begin(9600); /* Initialise le port serie */

  /* Petite banniere en ASII... juste pour le fun
     Veuillez bien recopier les lignes ci-dessous pour un affichage correct
     PS: n'oubliez pas que le \ doit etre precede d'un \ pour son affichage */
  Serial.println("  ____                             ___   ____     ____ ");
  Serial.println(" / ___|    ___    __ _   _ __     |_ _| |___ \\   / ___|");
  Serial.println(" \\___ \\   / __|  / _` | | '_ \\     | |    __) | | |    ");
  Serial.println("  ___) | | (__  | (_| | | | | |    | |   / __/  | |___ ");
  Serial.println(" |____/   \\___|  \\__,_| |_| |_|   |___| |_____|  \\____|");
  Serial.println();

  Serial.println("\nDebut du scan"); /* Affiche un saut de ligne puis le debut du scan */

  /* Debut de la grille d'affichage ou on simule l'adresse 0 par 4 points (.... )
     car elle est reservee par les fabriquants pour des fonctions speciales.
     PS: le tableau est decale d'une tabulation pour une meilleure lisibilite */
  Serial.print("\t.... ");

  /* Demarre le scan */
  for (adresse = 1; adresse < 128; adresse++ )
    /* Il y a 128 adresses disponibles au maximun (de 0 a 127)
        rappel : on ne teste pas l'adresse 0 (voir ci-dessus) */
  {
    Wire.beginTransmission(adresse);    /* Commence une transmission a l'adresse indiquee */
    resultat = Wire.endTransmission();
    /* resultat = statut de la transmission :
        0 : succès (peripherique OK)
        1 : donnée trop longue pour le buffer d'émission (erreur)
        2 : NACK reçu sur l'adresse de transmission (pas de peripherique)
        3 : NACK reçu sur la transmission de donnée (pas de peripherique)
        4 : autre erreur  (erreur donc...) */

    /* POUR TEST UNIQUEMENT : (on a pas forcement de peripherique en defaut sous la main)
     *  Decommenter une ou les lignes ci-dessous pour simuler un ou plusieurs peripherique en defaut
     *  Adaptez les adresses (de 1 a 127) en fonction de votre configuration
     *  Adapter les resultats en fonction du traitement que vous envisagez */
    //if (adresse == 17) resultat = 4; /* simule une erreur autre que 1,2 ou 3 */
    //if (adresse == 93) resultat = 1; /* simule une erreur de données */

    /* Traitement du resultat */
    if (resultat == 0)  /* Il y a un peripherique OK a cette adresse */
    {
      /* Mise en forme et affichage de l'adresse du peripherique en Hexadecimal */
      if (adresse < 16)Serial.print("0x0");
      else Serial.print("0x");
      Serial.print(adresse, HEX);
      Serial.print(" ");
      nb_existe++; /* Increment le nombre de peripheriques trouves */
    }
    else if ((resultat == 4) || (resultat == 1)) /* Indication d'un peripherique en defaut */
    {
      Serial.print("#### ");
      nb_existe++;  /* Increment le nombre de peripheriques trouves */
      nb_defaut++;  /* Incremente le nombre de peripheriques en defaut */
    }
    else  Serial.print(".... ");/* adresse inoccupee */
    /* resultat = 2 ou 3 (NAK) -> pas de reponse d'un peripherique*/

    /* Decommentez la ligne ci-dessous si vous avez des erreurs de lecture */
    //delay(25); /* temps d'attente pour ne pas generer d'erreur de lecture */

    if (((adresse + 1) % 8) == 0) /* Pour formatage de l'affichage en 8 colonnes */
      /* le +1 c'est parce que l'on part de l'adresse 1 et non de l'adresse 0 */
    {
      Serial.println();   /* Passage a la ligne apres avoir affiche 8 adresses */
      if (adresse < 127)Serial.print("\t");
      /* tabulation pour la mise en forme de l'affichage sauf apres la derniere adresse */
    }
    /* Fin du traitement du resultat et passage a l'adresse suivante */
  }

  /* Fin du scan */
  Serial.println("Fin du Scan\n");

  /* Affichage des resultats complementaires **/
  if (nb_existe == 0)Serial.println("Aucun peripherique I2C !"); /* Pas de peripherique I2c */
  else
  {
    /* Affichage d'un resume sous la forme :
        X peripherique(s) reconnu(s).
       ou
        X peripherique(s) reconnu(s) dont X peripherique(s) en defaut.
       avec gestion des pluriels et du point terminal */

    Serial.print(nb_existe); /* nombre de peripheriques I2c reconnus */
    if (nb_existe < 2)Serial.print(" peripherique reconnu"); /* affichage pour un seul */
    else Serial.print(" peripheriques reconnus");         /* affichage pour plusieurs */

    if (nb_defaut != 0)  /* S'il y a des peripheriques en defaut */
    {
      Serial.print(" dont ");  /* poursuit la phrase de resume */
      Serial.print(nb_defaut); /* Nombre de peripheriques en defaut */
      if (nb_defaut < 2)Serial.println(" peripherique en defaut."); /* affichage pour un seul */
      else Serial.println(" peripheriques en defaut.");             /* affichage pour plusieurs */
    }
    else Serial.println("."); /* Termine la phrase par un point s'il n'y a pas de peripherique en defaut */
  }
  /* Message de fin de scan */
  Serial.println("\nAppuyez sur le bouton Reset de l'Arduino pour recommencer.\n");
  Serial.println(); /* Saut de ligne supplémentaire */
}


void loop()
{
  /* Rien ici car tout s'execute dans le setup ! */
}

Bonjour

Vous alimentez bien le module en 5v + GND ?

Oui c'est bien ça

Je veut dire vous banchez bien le 5V et le GND quand vous testez avec la pile, et écriture CR2032 sur le dessus ?

Question bête mais des fois :slight_smile:

Oui ahah :)

Mais effectivement la masse est bien relié, les tensions sont dans l'intervalle accepté par le DS1307, hors lorsque la pile est mise, plus aucune détection.

Je clôture ce poste en vous informant que mon module RTC avait un problème, j'en est acheté un nouveau et ça fonctionne.