réglage de l'heure sur DS1307

Salut tout le monde, je vais recevoir dans quelques jours un module DS1307 (http://www.evola.fr/product_info.php/horloge-temps-reel-ds1307-p-156) permettant de garder l'heure en mémoire mais j'ai cependant une question.
Dans le livre de Christian Tavernier "Arduino, Maîtrisez sa programmation et ses cartes d'interface (shields)" au chapitre I2C, il est expliqué comment utiliser ce module par liaison I2C.
Cependant, pour écrire régler l'heure et la date il est écrit ceci :
void MiseALHeure()
{
Wire.beginTransmission(0x68); //Condition de départ
Wire.send(0); //Initialisation pointeur de registre
Wire.send(0x00); //Secondes
Wire.send(0x00); //Minutes
Wire.send(0x80 | 0x12); //Heure en mode 24h
Wire.send(0x05); //Jour 01-07
Wire.send(0x20); //Date 0-31
Wire.send(0x01); //Mois 0-12
Wire.send(0x11); //Année 00-99
Wire.send(0x10); //Gestion de la sortie SQWOUT
Wire.endTransmission(); //Condition d'arrêt
}

Et il y à la ligne "Wire.send(0x80 | 0x12); //Heure en mode 24h" que je ne comprend pas, pourriez-vous me la detailler s'il vous plait ?
car ce code ne me permet pas de régler l'heure actuelle, c'est juste un exemple mais comment je peux faire alors pour changer le réglage de l'heure ?? à quoi correspond le 0x80 et le 0x12 le quel je dois changer pour modifier l'heure ??

Salut :slight_smile:

Je te conseille de chercher une librairie fonctionnelle, il y en a plusieurs, à commencer par la librairie "time"

http://playground.arduino.cc/Code/time

Oui mais cette librairie n'a pas de rapport avec le DS1307 si ?? je peut gérer le DS1307 à liaison I2C par cette librairie ?
Aurais-tu des exemples ?

Bonjour,
Tu as la signification des différents bits (attention tout doit être en BCD) page 8 : http://datasheets.maximintegrated.com/en/ds/DS1307.pdf
@+

Fabinou30:
Oui mais cette librairie n'a pas de rapport avec le DS1307 si ?? je peut gérer le DS1307 à liaison I2C par cette librairie ?
Aurais-tu des exemples ?

Si si elle a un rapport il faut bien lire ce qui est écrit dans la page donnée en lien. Dans le zip que tu charges (lien au début du 4ème paragraphe) il y a une librairie DS1307 en complément de la librairie time et un exemple. En fait la librairie time est une surcouche qui permet de gérer le temps issue de différente source (serveur NTP, GPS, RTC, ...)

fdunews, y'a pas des exemples du'tilisation de cette lib DS1307RTC ?? car dans l'IDE j'ai que des exemples pour librairie time et time alarm.

icare, le tableau ne m'aide pas car je ne comprend pas comment il fonctionne. Tu pourrais m'expliquer juste la ligne que je ne comprends pas ?? (celle noté au début du post)

Voilà le premier resultat de google: Google Code Archive - Long-term storage for Google Code Project Hosting.

:slight_smile:

Fabinou30:
fdunews, y'a pas des exemples du'tilisation de cette lib DS1307RTC ?? car dans l'IDE j'ai que des exemples pour librairie time et time alarm.

Oui c'est vrai y'a que 3 exemples (voir la copie d'écran)
Puis c'est pas comme s'il n'y avait que 3 fonctions dans la librairie. set, read et write.

L'exemple TimeRTCSet permet de configurer l'heure à partir d'un message reçu par le port série.

fdufnews:

Fabinou30:
fdunews, y'a pas des exemples du'tilisation de cette lib DS1307RTC ?? car dans l'IDE j'ai que des exemples pour librairie time et time alarm.

Oui c'est vrai y'a que 3 exemples (voir la copie d'écran)
Puis c'est pas comme s'il n'y avait que 3 fonctions dans la librairie. set, read et write.

L'exemple TimeRTCSet permet de configurer l'heure à partir d'un message reçu par le port série.

m'ouai bah au vus des exemples, ça me parait plus simple de gérer directement la liaison I2C avec le module.
J'en reviens donc au début, qui pourrais m'expliquer cette ligne ??

m'ouai bah au vus des exemples, ça me parait plus simple de gérer directement la liaison I2C avec le module.

C'est aussi mon point de vue, mais ça c'est à toi de le faire.
Pour cela tu as la datasheet du DS1307 qui n'est pas compliquée du tout.
Le seul point a ne pas rater, et tu ne peux pas le rater puisqu'Icare te l'a signalé, c'est que les données doivent être codées en BCD -> Binaire Codé Décimal. Décimal Codé Binaire (#@?§ d'anglo saxons qui inversent tout)
Pour comprendre le BCD tu as Wikipédia à ta disposition.
Pour gagner du temps dans l'écriture de la programmation tu es autorisé à lire et à comprendre le contenu des librairies toutes faites et à t'inspirer de ce qui a déjà été fait pour la transposition Décimal <-> BCD.
bon courage..

68tjs:

m'ouai bah au vus des exemples, ça me parait plus simple de gérer directement la liaison I2C avec le module.

C'est aussi mon point de vue, mais ça c'est à toi de le faire.
Pour cela tu as la datasheet du DS1307 qui n'est pas compliquée du tout.
Le seul point a ne pas rater, et tu ne peux pas le rater puisqu'Icare te l'a signalé, c'est que les données doivent être codées en BCD -> Binaire Codé Décimal. Décimal Codé Binaire (#@?§ d'anglo saxons qui inversent tout)
Pour comprendre le BCD tu as Wikipédia à ta disposition.
Pour gagner du temps dans l'écriture de la programmation tu es autorisé à lire et à comprendre le contenu des librairies toutes faites et à t'inspirer de ce qui a déjà été fait pour la transposition Décimal <-> BCD.
bon courage..

ouai mais y'a un exemple dans le livre de Christian Tavernier mais y'a qu'une ligne que je ne pige pas et ça m'em*****

La reponse se trouve ici :

datasheets.maximintegrated.com/en/ds/DS1307.pdf

et la

cherche un peu, je te mets sur la voie mais si on t'explique tout, tu n'apprendras rien

Jacques

je pige rien à ce tableau et ça m'énerve.
Ce tableau est en binaire et moi j'ai pas de binaire dans cette ligne : "Wire.send(0x80 | 0x12); //Heure en mode 24h"
Donc vraiment je crois que je vais finir par abandonner car là ça me prends la tête ce truc.
Je suis juste dégouté d'avoir ce module et de ne pas pouvoir l'utiliser

Je crois qu'il va falloir reprendre les bases (sans jeux de mot) cours binaire et hexadécimal

Je pige rien à ce tableau et ça m'énerve.

Principe de base : Ce n'est pas en s'énervant que cela s'améliorera.

Préalable à bien comprendre :Différence entre un nombre et un chiffre :
La distinction est facile dès qu'on parle de nombres supérieurs à 9 :
En système de numérotation décimal pour représenter des nombres on dispose de 10 symboles que l'on appelle des chiffres : 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9
125 est un nombre construit à partir des chiffres 1, 2 et 5.

En fait le nombre 125 dans un système à base 10 (= mode décimal) est construit ainsi:
125 = 1100 + 210 + 5*1
Pour le coder en BCD on code en binaire le chiffre des centaines, puis celui des dizaines puis celui des unités.
Comme pour coder en binaire le chiffre 9 il faut 4 bits 125 s'écrira ainsi :
Forme générale : XXXX YYYY ZZZZ
Soit pour 125 :
Centaine : 1 -> XXXX = 0001
Dizaine : 2 -> YYYY = 0010
Unité : 5 -> ZZZZ = 0101

Application au DS1307 -> cas des secondes
Les secondes peuvent prendre toutes les valeurs entre 0 et 59.
Donc pour les unités il faudra coder des chiffres de 0 à 9 soit 4 bits.
Pour les dizaines le chiffre maximum sera égal à 5, 4 bits suffiront.

C'est bien pour cela que dans l'octet qui gère les secondes les bits 0, 1, 2 et 3 servent à coder les unités de secondes et les bits 4, 5 et 6 servent à coder les dizaines de secondes.

Ce tableau est en binaire et moi j'ai pas de binaire dans cette ligne : "Wire.send(0x80 | 0x12);

Déja le minimum que tu dois connaître pour programmer c'est de reconnaitre un nombre en notation décimale, binaire ou hexadécimale :
125 c'est du décimal
0b_quelquechose c'est du biniare
0x_quelquechose c'est de l'hexadécimal (base 16).
Peut importe la "présentation cosmétique" un nombre reste égal à lui même :
125 = 0b01111101 = 0x7D

Tant que tu ne maîtrisera pas ces notions il faudra te contenter d'utiliser des bibliothèques toute faites comme celle que l'on t-a déjà proposé.

Bonjour
Je pense qu'il y a une erreur dans le livre de C. Tavernier.
Au lieu de 0x80|0x12 ce devrait être 0x40|0x12; 0x40 met le bit 6 en 1 d'où heure en 24h (au lieu de am, pm 12h)
A+

lve123:
Bonjour
Je pense qu'il y a une erreur dans le livre de C. Tavernier.
Au lieu de 0x80|0x12 ce devrait être 0x40|0x12; 0x40 met le bit 6 en 1 d'où heure en 24h (au lieu de am, pm 12h)
A+

Non petite erreur d'interprétation de la doc:

Bit 6 of the hours register is defined as the 12-hour or 24-hour mode-select bit. When high, the 12-hour mode is selected. I

Lorsque le bit est à 1 on passe en mode 12h.
Il faut purement et simplement supprimer ce 0x80.

donc si j'enleve le 0x80 je suis en mode 24h et si je le mets je suis en mode 12h ?

Et petit question utile, existe-t-il des convertisseurs en ligne pour binaire vers hexadécimal ??

La calculatrice de Windows en mode Programmeur :slight_smile:

Par contre voici des liens utiles:

Désolé moi non plus je ne comprend pas cette ligne 0x80 | 0x12.

Rha la la
les deux pieds dans le même sabot ]:smiley:

Google , mot de recherche "convertisseurs binaire vers hexadécimal"
Première réponse : Convertisseur décimal, hexadécimal, binaire

Il faut tout vous faire ?

Désolé moi non plus je ne comprend pas cette ligne 0x80 | 0x12.

Le symbole | veut dire OU Logique, c'est donné et expliqué dans tout les liens qu'on vous a donné.

Avec le "splendide convertisseur" que vous auriez du trouver tout seul on traduit en binaire.
Pourquoi en binaire ?
Parce que pour faire des opérations sur les bits eh bien il faut utiliser des bits, c'est pas plus compliqué.

0X80 s'écrit en binaire : 10000000
0X12 s'écrit en binaire : 10010

C'est bien évident que les premiers zéro ne sont pas indiqués, dans la vie courante quand vous avez 6 chaises vous n'écrivez pas que vous avez 0006 chaises, se serait idiot, eh bien le convertisseur il fait pareil.

Donc pour faire notre OU LOGIQUE ( | ), sans se tromper, on va ajouter les zéros non significatifs.
Comme cela les bits seront bien alignés selon leur rang.
0x80 -> 10000000
0x12 -> 00010010

On va faire le ou sur les bits de même rang.
Table de vérité :
BitA BitB Résultat
0 0 0
1 0 1
0 1 1
1 1 1

Donc le résultat de 0x80|0x12 = 10010010
Ce résultat correspond à l'octet qu'il faut envoyer au DS1307 par l'interface I2C.

donc si j'enleve le 0x80 je suis en mode 24h et si je le mets je suis en mode 12h ?

Je ne sais pas comment interpréter tes écrits. mais attention ce n'est pas à prendre comme un "if" d'un langage de programmation, c'est un "OU logique" sur les bits comme je l'ai expliqué plus haut.

Attention : j'ai seulement expliqué l'expression "0x80|0x12" en aucun cas je ne contredis Fdufnews quand il dit que 0x80 est inutile, ne mélangez rien s'il vous plait.

Et allez faire un tour sur le site du zéro.

Edit :
Ne faites pas l'impasse sur la compréhension du mécanisme pour changer de base.
Les convertisseurs s'est très pratique mais de grâce comprenez les mécanismes mis en jeu.