DS1307 [RESOLU]

Je n'ai pas de carte pré-fabriqué, j'utilise une puce DS1307. Sur le datasheet son adresse est marqué: 1101000 (d'ou le 0x68 XD ).

J'ai bidouiller encore un peu à l'aide des infos que tu ma fournies et je peu lire, écrire et modifier puis relire et reécrire tous les registres (secondes 0x00, minutes 0x01... ainsi que la ram 0x08).

Mais l'oscillation toujours rien, en regardant le datasheet apparemment le DS1307 peut fonctionné sans sont étage d'oscillation et la seul maniéré de contrôler si l'oscillateur marche c'est avec la sortie SWQ/OUT comme vous me l'avez déjà fait contrôler.
J'ai aussi essayer d'activé et de désactivé le bit 7 de l'adresse 0 mais ça ne fait toujours rien.

On apprend pas mal chose en étant dans la caca lol.

je peu lire, écrire et modifier puis relire et reécrire tous les registres (secondes 0x00, minutes 0x01... ainsi que la ram 0x08).

Bien on avance.
Il faudrait mettre tout les registres à 0. C'est à faire une seule fois.

Normalement l'oscillateur devrait se mettre en route. Si l'oscillateur est en route les bits des secondes, minutes etc devraient s'incrémenter. Tu devrais pouvoir le vérifier en faisant des opération de lectures à intervalle régulier.

Pour réaliser le programme qui va bien je te déconseille d'utiliser la librairie RTC quand cela ne va pas il faut aller au plus simple.

Je verrais bien l'architecture suivante : (attention c'est du principe ce n'est pas du code !!)

setup()
{
Wire.begin
Serial.begin
Ecrit_dans_les_registres
}

loop()
{
Lit_dans_les_registre ; // les registres 0 et 1 sont suffisants
Affiche_contenu_des__registres ; // Utiliser Serial.print(octet_lu, BIN) qui affiche sous forme binaire
delay(1000) ; // une mesure toutes les secondes
}

En te contentant de surveiller que les registres des secondes et des minutes tu simplifies au maximum.
Inutile de faire une conversion Décimal_codé_ Binaire en décimal la seule chose qui compte a ce stade c'est :
est-ce que les bits changent ou pas quand le temps s'écoule ?

S'ils ne changent pas il faudra arrêter l'acharnement thérapeutique.
S'ils changent ce sera encourageant et il sera possible d'aller plus loin.

S'ils ne changent pas il faudra arrêter l'acharnement thérapeutique.

je crois qu'on en est là XD

Je te mets le code quand même:

#include <Wire.h>


//fonction ecriture 
void ecrit_ds1307(uint8_t registre, uint8_t donnee)
{
    Wire.beginTransmission(0x68);  // indique au DS1307 d'adresse hexadecimale 0x68 que le maître veut lui parler
     Wire.write(registre);    // Le maître indique à l'esclave qu'il veut intervenir sur le registre indiqué
     Wire.write(donnee);    // Le mâitre écrit l'octet "donnee"
  Wire.endTransmission(0x68);     // le maître libère l'esclave
}

//fonction lecture
uint8_t lit_ds1307(uint8_t registre)
{
  uint8_t lecture ;
//Positionnement sur l'octet à lire 
  Wire.beginTransmission(0x68); // indique au DS1307 d'adresse hexadecimale 0x68 que le maître veut lui parler
  Wire.write(registre);       // Le maître indique à l'esclave qu'il veut intervenir sur le registre indiqué
  Wire.endTransmission(0x68);  // le maître libère l'esclave
//lecture
  Wire.requestFrom(0x68, 1) ;  // Le maître réclame à l'esclave 1 octet à partir du registre précédement activé
    lecture = Wire.read();      // Le maître lit l'octet.
  return lecture;  // la fonction est de type uint8_t elle renvoie un octet.
}



void setup()
{
  Serial.begin(9600);
  Wire.begin();
  ecrit_ds1307(0x00, 1);
  ecrit_ds1307(0x01, 2);
}

void loop()
{
  Serial.println( lit_ds1307(0x00), BIN);
  Serial.println( lit_ds1307(0x01), BIN);
  delay(1000);
  
}

Et ça donne quoi dans le serial monitor ?

Avec ce code ça me donne 1 et 10 (y me zap tout les zéro devant le 1 pas trop compris) mais ça ne s'incrémente pas il me renvoie toujours les mêmes valeurs c'est un DS1307 fidèle :stuck_out_tongue:

Par contre c'est normale qu'il accept les valeurs décimales?
Dans les code que vous m'avez donné vous utilisez tous plus ou moins des convertisseurs DEC>BCD.
J'ai essayer de lui envoyer des décimales (comme dans l'exemple) ou du binaire et il prend les deux? j'ai fait une boulette ou c'est normale?

y me zap tout les zéro devant le 1 pas trop compris

Parce que c'est ce fait on n'indique pas les données qui ne servent à rien.
Ce qui a pu te tromper c'est que moi je les ai fait apparaître pour être plus démonstratif mais ce n'est nullement obligatoire.

Ce qui a pu te tromper c'est que moi je les ai fait apparaître pour être plus démonstratif mais ce n'est nullement obligatoire.

C'est ce que j'ai pensé la première foi que j'ai lancé mon programme. Mais bon ça ne change rien au résultat lol

Le message de tout à l'heure n'était pas fini, il est parti plus vite que son ombre :grin:

y me zap tout les zéro devant le 1 pas trop compris

Parce que c'est ce qui ce fait, on n'indique pas les données qui ne servent à rien.
Ce qui a pu te tromper c'est que moi je les ai fait apparaître pour être plus démonstratif mais ce n'est nullement obligatoire.

Avec ce code ça me donne 1 et 10

C'est normal puisque dans le registre 0 tu as écrit 1 (en système décimal) et dans le registre 1 tu as écrit 2 (en système décimal), or 2 en système décimal s'écrit "10" en système binaire ( cela se lit: "un", "zéro" , et non pas "dix" qui est réservé au système décimal).
Comme tu as demandé un affichage en binaire cela te donne "10", si tu avait demandé un affichage classique tu aurais eu un "2".

vous utilisez tous plus ou moins des convertisseurs DEC>BCD

Je n'ai jamais utilisé de code BCD, je me suis toujours contenté d'un affichage brut de l'octet en binaire pur.
Le Décimal_codé_binaire est une représentation bien particulière qu'il est nécessaire de manipuler pour avoir une indication exploitable du DS1307 mais comme je l'ai écrit pour le moment on ne s'occupe que de voir si des bits changent ou pas.

Par contre c'est normale qu'il accept les valeurs décimales? J'ai essayer de lui envoyer des décimales (comme dans l'exemple)

Il y a de la confusion dans l'air :
Le même nombre peut avoir plusieurs représentation mais cela reste le même nombre.
Un registre du DS1307 est équivalent à un nombre entier de longueur 8 bits c'est à dire que sa valeur maximale est
11111111 si exprimé en binaire ou 255 si exprimé en décimal. Ce n'est qu'une question de représentation.
C'est pour cela qu'il existe une "convention" d'écriture pour indiquer au compilateur quel est le sytème de numérotation utilisé :
13 -> représentation décimale.
0bxxx -> représentation binaire.
0xYYYY-> représentation hexadécimale.

Le système binaire ne connaît que deux chiffres : 0 et 1
Le système octal ne connaît que 8 chiffres : 0 1 2 3 4 5 6 7
Le système décimal ne connaît que 10 chiffres: 0 1 2 3 4 5 6 7 8 9
Le système hexadécimal ne connaît que 16 chiffres : 0 1 2 3 4 5 6 7 8 9 A B C D E F

Dans tous les système quand on atteint le nombre de chiffres maximal on crée un nombre en revenant à 0 pour les unités et ajoutant devant un "1"
Notes au passage qu'un "nombre" et un "chiffre" sont deux notions différentes

Donc un "1" "0" ( un , zéro ) sera égal à dix en décimal. mais en écriture binaire il correspondra à un "2" décimal
"15" décimal s'écrira "F" exprimé en Hexadécimal,
"16" décimal s'écrira "10" en hexadécimal.

Si ce que je viens d'écrire te parait obscur je t'invite a te documenter sur les systèmes de numérotation, tu trouveras de vrais cours bien plus compréhensibles que ce que je pourrais écrire.

j'ai bien compris ce que tu viens de m’expliqué.
Qaund je dis

Par contre c'est normale qu'il accept les valeurs décimales? J'ai essayer de lui envoyer des décimales

Je pensé que le ds1307 n'allait pas aimé que je lui écrive en décimale.
Ce qui après relecture me semble saugrenu... C'est l'histoire du "BCD" qui m'a déstabilisé.
Je croyé que pour écrire sur mon module je devais utilisé des 0 et des 1.

Mais je crois avoir mal compris ce qu'était le BCD je retourne voir google :stuck_out_tongue: .

Me revoilà !! ]:smiley:

J'ai une très grande nouvelle!! Mon DS1307 n'est pas foutu et marche!! oui il arrive à me donner l'heure correctement!!

Mais...Oui il y a un MAIS!!! que lorsqu'il est monté sur un breadboard c'est quoi son probléme!! =(

J'ai racheté un autre ds1307 et lui aussi me fait pareil les deux ne marche que sur la breadboard avec les "MEMES composant". (même pile, même quartz, même résistances)
J'avais même refait un circuit tout neuf pour le nouveau.

Je ne comprend plus rien c'est normale ça?

Je ne comprend plus rien c'est normal ça?

Non mais si tu faisais le schéma réel et complet: interne à la carte DS07 et liaisons avec l'arduino, cela aiderait pour trouver une explication.

Première vérification à faire : toutes les liaisons masses nécessaires sont-elles effectuées ?

Ben le schéma n'a pas changé c'est toujours les mêmes branchements j'ai juste refait le même circuit mais sur une breadboard et ça marche nikel.

ds1307.jpeg

les deux ne marchent que sur la breadboard
.....
J'avais même refait un circuit tout neuf pour le nouveau.

De là a en déduire qu'il y a un problème sur ton circuit....

De là a en déduire qu'il y a un problème sur ton circuit....

Mais avec un circuit comme ça y pas 50 façons de ce tromper. La seul chose qui change de la bread ce sont les soudures mais j'ai vérifié et revérifié avec un ohm-mètre toutes les connections sont bonnes. Un truc doit perturber l'oscillation mais là a force d'avoir le nez dedans je ne vois plus rien.

ds1307ci.jpeg

Mais avec un circuit comme ça y pas 50 façons de ce tromper

il faut être pragmatique. Si le composant est bon et que le soft tourne sur la breadboard, il ne reste que ton circuit.

La seul chose qui change de la bread ce sont les soudures mais j'ai vérifié et revérifié avec un ohm-mètre toutes les connections sont bonnes.

Les connexions sont bonnes OK.
Mais as-tu vérifié s'il n'y avait pas des connexions en trop? Je m'explique, il peut y avoir un petit pont de soudure, une petite paille de cuivre entre 2 broches. L'ohmmètre ne remplacera jamais une inspection visuelle avec une bonne loupe. C'est d'ailleurs une bonne habitude de le faire avant de monter les composants parce que s'il y a un pont sous le boîtier, tu peux chercher longtemps. Et cela arrive souvent même sur ces circuits imprimés réalisés chez des professionnels.

Je suis entrains de m'arracher les cheveux.
Je viens de monter mon ds1307 avec le minimum c.a.d deux résistance de 4k7 et le quartz +les broches pour le connecter et il marche.

Ca viens bien de mon circuit mais alors où???
C'est quand même impressionnant parce que j'ai fait deux circuit qui ne marche pas lol
Enfin qui ont la même erreur et je n'arrive pas à l'identifier. XD

fdufnews j'ai bien vérifier même à l'oeil mais rien... je comprend vraiment pas et c'est pas faute d'avoir cherché et recherché.

Bon ça y est on y est tout marche comme il faut.

Ca venait bien de mes circuits.

Je ne sais toujours pas où est mon erreur mais bon j'en ai refait un 3eme et celui-ci marche donc bon. Comme on dit jamais deux sans trois.

En tout cas merci pour votre aide.
@ bientôt!!!

pouic13:
Ca venait bien de mes circuits.

Je ne sais toujours pas où est mon erreur mais bon j'en ai refait un 3eme et celui-ci marche donc bon. Comme on dit jamais deux sans trois.

Peut être un problème de micro-coupure d'une piste ?

pouic13:
Bon ça y est on y est tout marche comme il faut.

Ca venait bien de mes circuits.

Je ne sais toujours pas où est mon erreur mais bon j'en ai refait un 3eme et celui-ci marche donc bon. Comme on dit jamais deux sans trois.

En tout cas merci pour votre aide.
@ bientôt!!!

Bonsoir
le principal c'est que finalement ce soit bien tombé en marche :grin:
les DS1307 sont quand même des compos "fiables" et pas mal tolerant.

peut être un problème de gravure