Go Down

Topic: DS1307 [RESOLU] (Read 8 times) previous topic - next topic

pouic13

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?   



skywodd

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 ;)
http://skyduino.wordpress.com/2012/01/07/tutoriel-arduino-horloge-rtc-ds1307-librairie-liquidcrystal/
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

pouic13

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

pouic13

Lorsque je rentre ce code:
Code: [Select]
#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à:
Code: [Select]
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à... :smiley-roll-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?
Code: [Select]
Serial.print(lire(&date);

skywodd

Ce tutoriel était fait pour arduino 0023 ou antérieur.
Remplace Wire.send par Wire.write et Wire.receive par Wire.read ;)
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Go Up