DS1307 [RESOLU]

Bonjour tout le monde.

Je me trouve devant une situation qui commence à me faire perdre le moral.
Mon module ds1307 ne veut pas me donner l'heure...!

J'ai essayé plusieurs librairie et rien n'y fait. Actuellement je m'attarde sur la librairie RTC de chez adafruit GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC Arduino library .

Lorsque j'ouvre le moniteur l'heure et afficher et elle est bien celle de mon PC mais elle ne s’incrémente pas, les secondes ne tourne pas.

Pour le module c'est moi qui l'ai fait suivant le schéma du datasheet, les branchements sont ok
et pour le raccordement à l'arduino (uno) je me trouve avec SDA->A4 et SCL->A5 comme c'est expliquer dans le tuto de chez adafruit.

Je suis tombé sur un topic d'un forum ou une personne avait le même problème et apparemment c'était à cause d'une erreur de bit qu'il faut forcé.
voici le lien: http://www.edaboard.eu/mon-ds1307-ne-demarre-pas-t376631.html

Quelqu'un à déjà eu ce problème ici?? ou une solution pour débugger??

Merci d'avance.

Salut,

Avant de forcer des bits ou quoi que ce soit d'autre, tu nous donnes ton code stp? Histoire de savoir si tu actualises l'envoi sur le port série... (impression écran aussi tant qu'on y est, du moniteur série).

C'est clair que sans code on risque pas de pouvoir t'aider ...

Voici le code pour le premier imprim ecran ou le ds1307 n'est pas synchronisé
et la ligne RTC.adjust(DateTime(DATE, TIME)); et mise en commentaire.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {
    DateTime now = RTC.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
    
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now.unixtime() + 7 * 86400L + 30);
    
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
    delay(3000);
}

Pour le 2eme imprim j'ai simplement dé-commenté la ligne RTC.adjust(DateTime(DATE, TIME));

Ps: Les photos sont en pieces jointe je crois si ça a marché.

Tu as essayé mon tuto avec le code mis dans le sujet ?

http://arduino.cc/forum/index.php/topic,77849.0.html

Salut Jean-François, oui je l'ai déjà essayé je n'arrive pas à compiler ton code arduino. Je fais peut être une erreur de manip ou mon IDE et peut être trop ressente ça met déjà arrivé. J'ai mis un imp. écr. avec les erreurs.

J'ai aussi regardé ton montage. La différence avec le mien ce trouve au niveau des résistances de pullup et de la broche SQW/OUT (A noter que je ne mens sert pas, elle fait juste de la figuration). Mais apparemment la plupart des montage utilise des 2k2 7k5 ou 10k y a pas vraiment standard si je puis dire... certain mette aussi un condo de 0.1uF céramique entre la masse et l'alim.

Juste une petite question d’électronique au sujet des pullup, j'ai utiliser des 7k5 1/2W en carbone je sais qu'elles sont énormes (niveau puissance). Cela peut il entré en jeu?
Et aussi la pin 1 du ds1307 c'est bien celle-la je me suis pas trompé? (voir photo module)

La pin 1 est bien celle que tu as montrée.

Quartz HS ?

pouic13:
Salut Jean-François, oui je l'ai déjà essayé je n'arrive pas à compiler ton code arduino. Je fais peut être une erreur de manip ou mon IDE et peut être trop ressente ça met déjà arrivé. J'ai mis un imp. écr. avec les erreurs.

J'ai aussi regardé ton montage. La différence avec le mien ce trouve au niveau des résistances de pullup et de la broche SQW/OUT (A noter que je ne mens sert pas, elle fait juste de la figuration). Mais apparemment la plupart des montage utilise des 2k2 7k5 ou 10k y a pas vraiment standard si je puis dire... certain mette aussi un condo de 0.1uF céramique entre la masse et l'alim.

Juste une petite question d’électronique au sujet des pullup, j'ai utiliser des 7k5 1/2W en carbone je sais qu'elles sont énormes (niveau puissance). Cela peut il entré en jeu?
Et aussi la pin 1 du ds1307 c'est bien celle-la je me suis pas trompé? (voir photo module)

bonjour
avec les ds1307 les 2 "bourdes" les plus communes
confondre les pin A4 A5 avec 4 et 5
utiliser une Bat 3V de recup "morte" , le ds1307 à besoin d'une batt de sauvegarde en bonne forme meme si alimenté en externe

La puce et neuve le quartz et neuf c'est un 32...kHz la pile est une 3v neuve elle aussi.
J'ai essayé d'inverser SDA et SCL côté arduino rien ne bouge.

Je ne sais pas comment fonctionne les codes pour les librairies.
Vue que j'utilise un arduino uno je ne sais pas si les pin A4 et A5 sont configurés par default dans la librairie RTC ou ci celle-ci les reconnait seul.

Personne n'a eu de souci avec des ds1307?

Bonjour,

Personne n'a eu de souci avec des ds1307?

Si si rassure toi ! Voila ce qui m'a "sauvé"

http://code.google.com/p/libds1307/downloads/detail?name=DS1307.zip&can=2&q=

Bon tests ...

Salut ludobabs merci pour ton aide mais j'ai déjà essayé ce code.
Le moniteur s'actualise bien mais les secondes reste figées.

Il n'y pas de manip à faire pour configurer le ds1307?
Ou juste une histoire de variable à remplacer dans la librairie?

Je bloque complètement. J'irais bien fouiller dans les librairies (ce que j'ai déjà fait) mais je ne connais pas du tout leur langage.
Comme je l'ai dit dans mon premier ou deuxième post je ne sais plus, une personne c'est retrouvée avec le même problème. Mais dans son cas c'était le bit des secondes qui foiré.

Il n'y pas un moyen de vérifier ça avec une lecture des port i2c ou un truc dans ce genre?

Bonjour,

Essaye de changer la configuration du DS1307 à la main (registre "CONTROL") en utilisant la librairie Wire et le datasheet du composant.

J'ai fait un tutoriel qui pourrait te donner des indices sur la manip :wink:

Merci skywodd je vais essayé.
Pour la petite histoire j'ai deja vue tas page et j'ai pris peur en voyant le code :grin: (je ne connais que les rudiments du langage C)
je vais m'attarder un peu decu.

Lorsque je rentre ce code:

#include <Wire.h> // Inclusion de la librairie Wire pour 
		  //la gestion de l'I2C qui nous permettra de communiquer avec le DS1307
#include "structure.h" // Inclusion de notre fichier de structure qui définit le type "Date"
#include <avr/pgmspace.h> // Inclusion de la librairie PGMSPACE qui permet l'utilisation de PROGMEM
	 
#define PSTR2(s) (__extension__({static unsigned char __c[] PROGMEM = (s); &__c[0];})) // Macro permettant de stocker facilement du texte en PROGMEM
#define DS1307_ADDRESS 0x68 // Adresse I2C du module DS1307
	 	 
// Fonction de convertion bcd -> décimal
byte bcd2dec(byte bcd) 
{
 return ((bcd / 16 * 10) + (bcd % 16));
}
	 
// Fonction de convertion decimal -> bcd
byte dec2bcd(byte dec) 
{
 return ((dec / 10 * 16) + (dec % 10));
}
 
// Fonction configurant le DS1307 avec la date/heure fourni
void ecrire(Date *date) 
{
 Wire.beginTransmission(DS1307_ADDRESS); // Début de transaction I2C
 Wire.send(0); // Arrête l'oscillateur du DS1307
 Wire.send(dec2bcd(date->secondes)); // Envoi des données
 Wire.send(dec2bcd(date->minutes));
 Wire.send(dec2bcd(date->heures));
 Wire.send(dec2bcd(date->jourDeLaSemaine));
 Wire.send(dec2bcd(date->jour));
 Wire.send(dec2bcd(date->mois));
 Wire.send(dec2bcd(date->annee));
 Wire.send(0); // Redémarre l'oscillateur du DS1307
 Wire.endTransmission(); // Fin de transaction I2C
}
 
// Fonction récupérant l'heure et la date courante à partir du DS1307
void lire(Date *date) 
{
 Wire.beginTransmission(DS1307_ADDRESS); // Début de transaction I2C
 Wire.send(0); // Demande les info à partir de l'adresse 0 (soit toutes les info)
 Wire.endTransmission(); // Fin de transaction I2C

 Wire.requestFrom(DS1307_ADDRESS, 7); // Récupère les info (7 octets = 7 valeurs 
                                      // correspondant à l'heure et à la date courante)

 date->secondes = bcd2dec(Wire.receive()); // stockage et conversion des données reçu
 date->minutes = bcd2dec(Wire.receive());
 date->heures = bcd2dec(Wire.receive() & 0b111111);
 date->jourDeLaSemaine = bcd2dec(Wire.receive());
 date->jour = bcd2dec(Wire.receive());
 date->mois = bcd2dec(Wire.receive());
 date->annee = bcd2dec(Wire.receive());
}
	 
// Fonction vérifiant la présence d'une demande de synchronisation en provenance du pc et récupérant les données de synchronisation ou à défaut récupérant la date et l'heure courante
void synchronisation(Date *date) 
{
 Serial.print("SYNC"); // Envoi de la commande de synchronisation
 int i;
 for(i = 0 ; (Serial.available() < 3) && (i < 6) ; i++) // Attente de 3s max
 delay(500);
 if(i != 6)  // Il n'y as pas eu de timeout
  {
   if(Serial.read() == 'A')
    if(Serial.read() == 'C')
     if(Serial.read() == 'K') // Si le pc à répondu par une commande 
      {			     //ACK c'est que la synchronisation peut commencer
       while(Serial.available() < 7); // Attente des 7 octets de configuration
 	   date->secondes = Serial.read(); // Réception et conversion des données reçu
	   date->minutes = Serial.read();
	   date->heures = Serial.read();
           date->jourDeLaSemaine = Serial.read();
	   date->jour = Serial.read();
	   date->mois = Serial.read();
	   date->annee = Serial.read();
	   ecrire(date); // Stockage dans le DS1307 des donnes reçu
      }
  }
	
  else lire(date); // Si le pc n'as pas répondu à la demande de synchronisation 
                  //la fonction ce content de lire les données courante du DS1307
}



	 // Setup()
void setup() {
Serial.begin(9600); // Initialisation du port série
Wire.begin(); // Initialisation du bus I2C
synchronisation(&date); // Tentative de synchronisation avec le pc
}
	 
// loop()
void loop() 
{
 Serial.print(lire(&date);
 delay(1000); // Rafraichissement de 1Hz
	}

Il me ressort ces erreurs là:

sketch_feb09a.ino: In function ‘void ecrire(Date*)’:
sketch_feb09a:25: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:26: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:27: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:28: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:29: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:30: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:31: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:32: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:33: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a.ino: In function ‘void lire(Date*)’:
sketch_feb09a:41: error: ‘class TwoWire’ has no member named ‘send’
sketch_feb09a:47: error: ‘class TwoWire’ has no member named ‘receive’
sketch_feb09a:48: error: ‘class TwoWire’ has no member named ‘receive’
sketch_feb09a:49: error: ‘class TwoWire’ has no member named ‘receive’
sketch_feb09a:50: error: ‘class TwoWire’ has no member named ‘receive’
sketch_feb09a:51: error: ‘class TwoWire’ has no member named ‘receive’
sketch_feb09a:52: error: ‘class TwoWire’ has no member named ‘receive’
sketch_feb09a:53: error: ‘class TwoWire’ has no member named ‘receive’
sketch_feb09a.ino: In function ‘void setup()’:
sketch_feb09a:91: error: ‘date’ was not declared in this scope
sketch_feb09a.ino: In function ‘void loop()’:
sketch_feb09a:97: error: ‘date’ was not declared in this scope

J'ai suivis ton tuto skywodd et j'ai bien créé un fichier nommé "structure.h" que j'ai placé au même endroit que mon sketch. Alor quesqu'y me raconte là... :cold_sweat:
Je suis passé a coté de quoi??

Esque c'est comme ça que je fait pour afficher la date dans mon moniteur avec le pointeur de la structure? Serial.print(lire(&date);

Ce tutoriel était fait pour arduino 0023 ou antérieur.
Remplace Wire.send par Wire.write et Wire.receive par Wire.read :wink:

Bon déjà ça de moins :stuck_out_tongue:

Par contre il ne veut toujours pas pour le pointeur "date" y me dit qu'il n'est pas déclaré dans le scope.
Je suis un peut de sont avis mdr je ne le trouve pas.
Y a bien la structure "Date" mais c'est tout.
Dans les fonction tu marque ex: void synchronisation(Date *date){}
mais je n'ai pas vu de pointeur "date" déclaré vers la structure"Date"? Y faut le rajouté?

pouic13:
Par contre il ne veut toujours pas pour le pointeur "date" y me dit qu'il n'est pas déclaré dans le scope.

Regarde en haut du code complet, tu as la déclaration de "date" juste après celle du lcd :wink:

Haaaa il était caché le bougre!!!! :0

Fou....... bon on ce rapproche ont ce rapproche
Dernière je fait comment pour lire ma structure parce que bien sur Serial.print(lire(&date)); ne marche pas...

pouic13:
Fou....... bon on ce rapproche ont ce rapproche
Dernière je fait comment pour lire ma structure parce que bien sur Serial.print(lire(&date)); ne marche pas...

Tu fait d'abord un lire(&date) et ensuite tu affiches chaque champs de la structure un à un.
Regarde comment je faisait avec la fonction affichage() :wink:
(sauf qu'avec Serial.println() tu n'as pas besoin d'écrire caractère par caractère en bougeant un curseur)

void loop() 
{
 lire(&date);
 Serial.println(date->secondes,DEC);
 delay(1000); 
}

(je me limite au seconde :smiley: )

il n'accepte pas "->" c'est ma syntaxe qui est mauvaise?