Go Down

Topic: réglage de l'heure sur DS1307 (Read 3691 times) previous topic - next topic

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+

fdufnews


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.

#17
Jul 30, 2013, 06:12 pm Last Edit: Jul 30, 2013, 06:21 pm by Fabinou30 Reason: 1
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 ??
Venez visiter mon site web !!
http://arduino.leforum.eu

guix

#18
Jul 30, 2013, 06:42 pm Last Edit: Jul 30, 2013, 06:51 pm by guix Reason: 1
La calculatrice de Windows en mode Programmeur :)

Par contre voici des liens utiles:

http://www.miniwebtool.com/bcd-to-binary-converter/
http://www.miniwebtool.com/binary-to-bcd-converter/
http://www.miniwebtool.com/bcd-to-decimal-converter/
http://www.miniwebtool.com/decimal-to-bcd-converter/
http://www.miniwebtool.com/bcd-to-hex-converter/
http://www.miniwebtool.com/hex-to-bcd-converter/


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

68tjs

#19
Jul 30, 2013, 07:14 pm Last Edit: Jul 30, 2013, 07:44 pm by 68tjs Reason: 1
Rha la la
les deux pieds dans le même sabot  ]:D

Google , mot de recherche "convertisseurs  binaire vers hexadécimal"
Première réponse : http://sebastienguillon.com/test/javascript/convertisseur.html

Il faut tout vous faire ?
Quote
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.

Quote
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.


guix

Je n'ai pas dis que je ne comprenais pas le OR ou les nombres hex, juste que dans ce cas précis je ne comprends pas pourquoi il y a ce "0x80 |".

68tjs

Quote
pourquoi il y a ce "0x80 |".

fdufnews a déjà répondu et à conclu a une erreur.

Pour en avoir confirmation il faut lire la datesheet du DS1307.
Le registre pour la gestion de l'heure est le 02h (voir le tableau que JMe87 a tiré de la datasheet).
0x80 correspond à 0b10000000. Le seul 1 de cet octet correspond à la gestion du bit 7 de ce registre.

Effectivement ce bit n'est pas utilisé puisque sous le tableau on peut lire :
0 = Always reads back as 0.

Conclusion :
il ne faut pas avoir une confiance aveugle dans les librairies toutes faîtes et ne jamais négliger de lire les datasheets des composants qu'elles sont censée gérer.


-Standby

Quote
Pour en avoir confirmation il faut lire la datesheet du DS1307.


Lire la datasheet c'est une chose, la comprendre en est une autre..

Quote
pourquoi il y a ce "0x80 |".


Le bit de poids fort "Msb" additionné(corriger moi si je me trompe) au bit de poids faible "Lsb" avec un opérateur logique "Ou"
c'est simple je prend le chiffre 42 : 40 et le bit de poids fort et  2 le bit de poids faible.
The Mind is like a parachute it works best when opened.

icare

Bjr,

Le bit de poids fort "Msb" additionné(corriger moi si je me trompe) au bit de poids faible "Lsb" avec un opérateur logique "Ou"
c'est simple je prend le chiffre 42 : 40 et le bit de poids fort et  2 le bit de poids faible.

J'ai l'impression d'être dans une machine à laver et que l'on mélange le tout.
Je suppose que 42 et 40 sont exprimés en base 10 et les termes LSB et MSB sont propres à la base 2. Mais l'esprit y ai  :smiley-mr-green:
Base 10 = décimal (comme si tu comptais sur les doigts - 0 à 9)
Base 16 = hexadécimal (0 à 9 + A à F avec A=10, B=11, .... , F=15)
Base 8 = Octal (0 à 7) tu oublies c'est juste pour l'exemple !
Base 2 = binaire (de 0 à 1)
40 (base10) = 0x28 (base 16) = 0b101000 (base 2) et si l'on décompose cela nous donne
4x10^1 + 4x10^0 = 2x16^1 + 8x16^0 = 1x2^5 + 0x2^4 + 1x2^3 + 0x2^2 + 0x2^1 + 0x2^0
Rq: tout nombre à la puissance 0 est égal à 1
Si tu vérifies les calcul tu retrouveras les égalités.
Pour l'exemple ci-dessus, on à :
40 = 0b101000 = 0b1(MSB)01000(LSB)
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

mais alors ce 0x80 mets à m'état haut le bit de selection 12h/24h et c'est marqué ceci dans le datasheet : 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
Donc on est en mode 12h là nan ?
Venez visiter mon site web !!
http://arduino.leforum.eu

icare

Re,

mais alors ce 0x80 mets à m'état haut le bit de selection 12h/24h et c'est marqué ceci dans le datasheet : 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
Donc on est en mode 12h là nan ?

Non, 0x80 met à 1 le bit7 qui n'est pas utilisé. 0x80 met à 0 le bit6 donc en mode 24 heures.
Quote
The DS1307 can be run in either 12-hour or 24-hour mode. 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. In the 12-hour mode, bit 5 is the AM/PM bit with
logic high being PM. In the 24-hour mode, bit 5 is the second 10-hour bit (20 to 23 hours). The hours value must be
re-entered whenever the 12/24-hour mode bit is changed.

Dans code d'origine, on aurait du mettre 0x40 au lieu de 0x80 pour se mettre en mode 12heures
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

fdufnews


Bjr,

Le bit de poids fort "Msb" additionné(corriger moi si je me trompe) au bit de poids faible "Lsb" avec un opérateur logique "Ou"
c'est simple je prend le chiffre 42 : 40 et le bit de poids fort et  2 le bit de poids faible.

J'ai l'impression d'être dans une machine à laver et que l'on mélange le tout.
Je suppose que 42 et 40 sont exprimés en base 10 et les termes LSB et MSB sont propres à la base 2. Mais l'esprit y ai  :smiley-mr-green:


Faudrait voir à ne pas mélanger bit et byte (bit et octet en français)
bit est utilisé en numération binaire
byte est utilisé en numération hexadécimale.

Maintenant MSB (Most Significant Bit) et LSB (Least Significant Bit) sont préférentiellement utilisés en binaire pour désigner le bit de poids le plus faible et le bit de poids le plus fort.
Cependant on trouve quelque fois dans la littérature MSB et LSB dans la numération hexadécimal. Il faut alors comprendre Most Significant Byte et Least Significant Byte que l'on traduirait pas Quartet de poids fort et Quartet de poids faible.
En fait cela dépend du contexte.

Ce fil de discussion montre par ailleurs qu'il est préférable de définir des constantes avec des define pour manipuler des registres plutôt que mettre directement des valeurs cela permet au moins de comprendre ce qu'a voulu faire le codeur.

Code: [Select]
#define 12h_MODE 0x40
#define AM_PM 0x20
.....

   registre |= 12h_MODE; // passe la RTC en mode 12h

et quand même plus clair que
Code: [Select]
registre |=0x40;
et cela permet de détecter plus facilement les erreurs

Alors merci à tous, vous m'avez permis de comprendre ce code et d'utiliser ce module.
Je sais désormais que je dois mettre 0x80 pour mode 24h et 0x40 pour mode 12h et vous m'avez même expliqué pourquoi cela changeais quelque chose.
Merci à tous, c'est l'une de mes premières questions où je suis si bien accueillis et où certains on suivis ce topic jusqu'à la résolution.
Merci à la communauté Arduino que je resolliciterai sans doute.
Venez visiter mon site web !!
http://arduino.leforum.eu

68tjs

Quote
Je sais désormais que je dois mettre 0x80 pour mode 24h et 0x40 pour mode 12h

P**** c'est dur !
0x80 s'écrit en binaire 10000000. Tu n'interviens que sur le bit 7 qui ne fait strictement rien.
Le bit 7 est toujours maintenu à 0 parce qu'inutilisé ou réservé pour une évolution du produit.

Pour le mode 24h il faut mettre le bit 6 à "0" et à "1" pour le mode 12h.
Oublie cette histoire de 0x80. La librairie est écrite par un illustre inconnu qui peut s'être trompé , la datasheet est écrite par le fabricant du produit qui doit impérativement le vendre. D'après toi quelle est la source la plus sure ?

Sur le tableau que JMe87 à pris le temps de te transmettre on voit clairement que le réglage en mode 12/24 h est assuré par le bit 6 qui peut prendre la valeur 0 ou 1.
Dans le registre qui gère l'heure les bits :
- B0 B1 B2 et B3 gèrent les unité d'heure comprise entre 0 et 9
- B4 B5  gèrent les dizaines d'heure comprises soit entre 0 et 1, soit entre 0 et 2 selon la valeur de B6
- B6 gère le choix du mode 12h ou 24h
- B7 est inutilisé.

Il suffit de lire comprendre le tableau !

mhhh alors pour choisir mode 24h ou 12h faut soit mettre 0x40 soit rien c'est ça ??
je comprends qu'il faut agir sur le bit 6 et j'ai utilisé un convertisseur en écrivant : 1000000 en binaire vers hexadécimal, résultat = 40 donc j'en deduis que c'est 0x40 c'est bien ça ?
Venez visiter mon site web !!
http://arduino.leforum.eu

Go Up