compteur site compteur pour site  
MODULE HORLOGE DS 1307







PRÉAMBULE
Le module horloge DS1307 est une horloge / calendrier en temps réel RTC (Real Time Clock) qui permet de donner :
• L'Heure courante : 
  • L'Heures au format 12 ou 24 heures,
• Les Minutes,
• Les Secondes,

• La date :
  • Jours,
  • Mois (avec ajustement des années bissextiles),
  • Années (jusqu'en 2100),

Il existe plusieurs modules contenant un circuit DS 1307.
• Certains modules sont constitués uniquement du DS 1307,
• Sur d'autres une mémoire externe est ajoutée.

Nous nous concentrerons sur le DS 1307. La mémoire est une EEPROM et elle se programme comme n'importe quelle EEPROM sur bus I2C (Voir Page Mémoire 24LC512).
 
Le DS 1307
Les caractéristiques du circuit DS1307 sont :
• La commande appel ou programmation s'effectue via un bus I2C,
• Le circuit possède 56 octets de RAM intégré et disponible pour l'utilisateur,
• Le DS1307 possède un circuit de détection de puissance intégré qui détecte les pannes de courant et passe automatiquement sur l’alimentation de secours,
• L'alimentation de secours peut être constituée d'une pile ou d'une batterie. Sur certains modules le réceptacle de la pile est intégré,
• Le circuit possède une sortie qui génère un signal carré,
• L'adresse du composant sur le bus I2C n'est pas réglable (Adresse DS 1307 : 1101000). Si d'autres composant sont montés sur le bus I2C il faudra leur choisir une adresse différente,
• La programmation du circuit s'effectue en BCD (Binary Coded Decimal) : DCB (Décimal Codé Binaire),
• L'alimentation du circuit doit être compris entre 4,5 et 5,5 volts.

L'appel et la programmation de la date ou de l'heure se fait en utilisant le protocole du bus I2C.

Il existe certaines bibliothèques qui permettent d'utiliser ou de programmer le circuit mais certaines sont non fonctionnelles en tout ou partie ou trop limitatives.
C'est pourquoi je vais vous montrer la programmation directement en I2C en démystifiant le DCB (Décimal Codé Binaire).

module ds1307
                            
pile de sauvegarde
Module DS1307
                                                                          
Pile de sauvegarde

cablage ds 1307
Câblage DS 1307

Le DÉCIMAL CODÉ BINAIRE (BCD)
Le code BCD (Binary Coded Decimal) représente un chiffre par un ensemble de 4 bits au lieu de 8 habituellement. 

Pour se rapprocher de l'écriture d'un chiffre en base dix, en BCD ce chiffre est codé sur 4 bits seulement.

representation bcd
Représentation BCD

Ainsi un nombre est représenté par des mots de 4 bits représentant chaque chiffre du nombre indépendamment les uns des autres.

Exemple :

representation des chiffres et nombres en bcd
Représentation des chiffres et nombres en BCD

En utilisant le BCD, la manipulation des données numériques se faisant sur 4 bits au lieu de 8 ou plus simplifie l'électronique nécessaire pour le fonctionnement du circuit.

Le DS 1307
Le DS1307 possède en interne des registres 8 bits qui contiennent l'heure, la date, ....

Leurs utilisations se fait en utilisant le codage BCD.

Ainsi comme les 8 registres contenus dans les adresses allant de 00h à 07h (h = Hexadécimal) sont des registres 8 bits, ils sont programmés comme si les registres ne faisaient que 4 bits.

Les bits 0 à 3 contiennent une partie de la valeur (Les unités) et les bits 4 à 7 l'autre partie de la valeur (les dizaines) de réglage souhaitée.
Les REGISTRES du DS 1307
La programmation ou la lecture du DS1307 s'effectue via des registres 8 bits codées en BCD.
Ces registres sont contenus dans les adresses :
00h pour les secondes,
01h pour les minutes,
02h pour les heures,
03h pour les jours,
04h pour la date,
05h pour le mois,
06h pour l'année.

• Un autre registre est disponible à l'adresse 07h et permet soit d'avoir une sortie logique ou de générer un signal carré de fréquence variable.

• Une mémoire de 56 bits est disponible aux adresses comprises entre 08h et 3Fh (8 à 63 en décimal).

registres ds 1307
Registres du DS 1307
Registre des secondes : 00h
Les valeurs de ce registre est compris entre 00 à 59 il est nécessaire d'utiliser les deux parties de ce registre :
• Les bits 0 à 3 contiennent les valeurs des unités allant de 0 à 9,
• Les bits 4 à 6 contiennent les valeurs des dizaines allant de 1 à 5.

Le bit 7 CH est utilisé pour permettre le fonctionnement de l'horloge ou pour l'arrêter :
• Lorsque le bit est à 1 l'horloge fonctionne,
• Lorsque le bit est à 0 (par défaut) l'horloge est arrêtée,


registre 00h
Registre 00h

Registre des Minutes : 01h
Identique au registre des secondes sauf pour le bit 7 qui n'est pas utilisé.


registre 01h
Registre 01h

Registre des Heures : 02h
Le DS 1307 permet un réglage de l'heure en mode 12 ou 24 heures.

• Les bits 0 à 3 contiennent les valeurs des unités allant de :
   • 0 à 9 en mode 12 heures,
   • 0 à 3 en mode 24 heures.

• Le bit 6 contient le mode de fonctionnement de l'horloge. Ce mode est défini par la valeur de ce bit :
   • 1 pour le mode 12 heures,
   • 0 pour le mode 24 heures.

• Le bit 5 en fonction du bit 6 permet soit d'indiquer le mode de fonctionnement de l'horloge, AM/PM en mode 12 heures, soit l'indication des dizaines d'heures en mode 24 heures :
   • Pour le mode 12 heures le contenu de ce bit indique : 
        • 0 pour AM,
        • 1 pour PM.
   
   • Pour le mode 24 heures les bits 4 et 5 sont utilisés pour indiquer les dizaines d'heures : 0, 1 et 2.


registre 02h
Registre 02h

Registre des Jours : 03h
Les jours de la semaine sont indiqués comme suit : 1 pour Dimanche, 2 pour Lundi,....
Ainsi seulement 3 bits (0, 1, 2) sont nécessaires pour coder les jours de la semaine.

registre 03h
Registre 03h
Registre de la Date : 04h
Le principe est le même que pour le registre des minutes ou heures.

registre 04h
Registre 04h

Registre des Mois : 05h
Le principe est le même que pour le registre des minutes ou heures.

registre 05h
Registre 05h

Registre des Années : 06h
Le principe est le même que pour le registre des minutes ou heures.

registre 06h
Registre 06h

Registre de Contrôle : 07h
Ce registre permet de contrôler une sortie qui peut :
• Etre utilisée en tant que sortie logique,
• Générer un signal carré de fréquence variable.

registre 07h
Registre 07h

Sortie logique
Pour être utilisée en tant que sortie logique :
• Le bit 4 (SQWE) du registre de contrôle doit impérativement être à 0.

Le niveau logique est alors déterminé par le bit 7 (OUT) :
• Si OUT est à 0, la sortie est au niveau bas,
• Si OUT est à 1, la sortie est au niveau haut.

Par défaut OUT est à 0.

Générer un signal carré de fréquence variable
Pour être utilisée en tant que générateur de signal carré :
• Le bit 4 (SQWE) du registre de contrôle doit impérativement être à 1 pour activer la sortie de l'oscillateur.
   • Le bit 4 (SQWE) du registre de contrôle doit impérativement être à 0.

La fréquence du signal carré dépend alors de la valeur des bits 0 et 1 (RS0 et RS1).
• Lors de la première mise sous tension de l’appareil ces bits sont généralement mis à 1.

sortie a frequence variable
Sortie à fréquence variable

La PROGRAMMATION du DS 1307
La programmation du DS 1307 s'effectue via le bus I2C.
Ce bus permet la programmation et la lecture du DS 1307 en utilisant seulement 2 fils.
Pour effectuer cela il ne sera pas nécessaire de connaître les principes du protocole I2C puisque nous utiliserons la bibliothèque Wire.h de l'IDE Arduino.

En utilisant les fonctions de l'IDE Arduino on pourra simplifier la programmation ainsi que la lecture des registres.

Rappel :
• L'adresse du composant sur le bus I2C n'est pas réglable : Adresse DS 1307 : 1101000.
• La programmation du circuit s'effectue en BCD (Binary Coded Decimal) : DCB (Décimal Codé Binaire).

Principes de programmation
1). Déclarer la bibliothèque I2C,
2). Déclarer l'adresse du DS 1307 sur le bus I2C,
3). Déclare les fonctions de conversion :
   • Fonction décimale vers décimale codé binaire,
   • Fonction décimale codé binaire vers décimale,
4). Envoyer la trame de lecture ou de programmation,
5). Libérer le bus I2C.

Déclaration bibliothèque I2C
Dans un programme la première chose à faire est de déclarer la fonction "Wire.h" :
# include <Wire.h>

Déclarer l'adresse du DS 1307
Il faut déclarer l'adresse du DS 1307 sur le bus I2C pour ensuite pouvoir s'adresser à ce composant et à lui seul.
• #define DS1307_ADDRESS 0x68

0x68 en hexadécimal correspond à l'adresse fixe du composant : 1101000.

Réalisation des fonctions de conversion
Ensuite pour pouvoir envoyer des ordres au DS 1307, il faut convertir les nombres Décimaux en DCB (Décimal Codé Binaire).

Cela est rendu possible par la création d'une fonction qui se chargera de cela.

Fonction Décimale vers Décimale Codé Binaire
//Fonction décimale vers décimale codé binaire.
byte decToBcd (byte bcd)
{ return ((bcd/10*16) + (bcd%10)); }

type :
C'est le type de variable que la fonction peut renvoyer.
• "void" lorsque la fonction ne renvoie aucune valeur de sortie,
• "Byte" par exemple, qui contiendra une valeur de type byte.

nomDeLaFonction : c'est le nom choisit pour la fonction : decToBcd.
 
(  ) : Les deux parenthèses sont obligatoires.
• Le contenu des parenthèses est vide si la fonction est de type "void",
• Le contenu des parenthèses contient des paramètres qui seront retournés par la fonction.
   • Le paramètre renvoyé à la fonction doit être du même type que celui qui a été déclaré dans le "type".

{  } : Les accolades contiennent le code de la fonction. 
• Le contenu des accolades doit contenir le mot clé "return" si la fonction doit retourner un paramètre,
• Si la fonction ne retourne aucun paramètre ce mot clé n'est pas nécessaire.

Lorsque le programme rencontre une "fonction" il ira exécuter les instructions de cette fonction et reprendra ensuite son cours normal.

Les fonctions ne doivent pas être contenu dans la fonction loop ou setup.

Instructions de programmation
Il faut dans un premier temps initialiser la transmission et transmettre l'adresse du composant visée par l'instruction :
Wire.beginTransmission (adresse sur le bus I2C);

Indiquer quelle adresse ou à partir de quelle adresse on veut envoyer des informations dans le DS 1307 :
• Wire.write(adresse);

L'instruction utilisée pour envoyer des ordres sur le bus I2C est : 
• Wire.write (instructions);

La fin de transmission sera effectuée par l'instruction :
• Wire.endTransmission( );

Lorsque l'on désire entrer une valeur dans le DS 1307 il n'est pas obligatoire d'accéder à tous les registres.
On ne peut viser que le registre qui nous intéresse ou les registres quelle que soit leurs nombres.

Le plus simple est d'enregistrer la valeur souhaitée dans une variable et d'indiquer cette variable dans les instructions de programmation.
C'est ce qui est fait dans l'exemple suivant.

Exemple
Dans cet exemple on :
• Initialise la transmission,
• Indique que l'on veut commencer la programmation à partir de l'adresse 0,
• On écrit ensuite dans tous les registres du DS 1307,
• On met fin à la transmission.

Wire.beginTransmission(DS1307_ADRESSE); // Initialise la transmission et transmet l'adresse du DS 1307 
Wire.write(adresse); //A partir de quelle adresse écrit-on dans le DS1307  
 
Wire.write(decToBcd(seconde)); //Ecriture des secondes en utilisant la fonction decToBcd pour la conversion nécessaire au DS 1307
Wire.write(decToBcd(minute)); 
• Wire.write(decToBcd(heure)); 
• Wire.write(decToBcd(jour)); 
• Wire.write(decToBcd(date)); 
• Wire.write(decToBcd(mois)); 
• Wire.write(decToBcd(annee)); 
• Wire.write(decToBcd(sqwe)); //Utilisation du registre situé à l'adresse 07h
  
• Wire.endTransmission(); //Met fin à la transmission
La LECTURE du DS 1307
Avant de pouvoir exploiter les informations en provenance du DS 1307, il faut convertir les nombres DCB (Décimal Codé Binaire) en nombres Décimaux.

La fonction qui se chargera de cela est :

Fonction Binaire vers Décimale
//Fonction décimale codé binaire vers décimale.  
byte bcdToDec (byte decimal) 
{ return ( (decimal/16*10) + (decimal%16) ); }

Instructions de lecture
Il faut dans un premier temps initialiser la transmission et transmettre l'adresse du composant visée par l'instruction :
Wire.beginTransmission (adresse sur le bus I2C);

Indiquer quelle adresse ou à partir de quelle adresse on veut lire les informations contenues dans le DS 1307 :
• Wire.write(adresse);

Effectuer une requête indiquant le nombre de bit que l'on désire :
Wire.requestFrom(DS1307_ADRESSE, 7); // 7 = Nbre bit que l'on désire lire

L'instruction utilisée pour lire le registre du DS 1307 sur le bus I2C est : 
• Wire.read( );
Utilisée sous la forme :
• seconde = bcdToDec(Wire.read()); // La valeur du registre est stockée dans la variable "seconde" en convertissant en décimal la valeur du registre du DS 1307.

La fin de transmission sera effectuée par l'instruction :
• Wire.endTransmission( );

Lorsque l'on désire lire la valeur d'un registre dans le DS 1307 il n'est pas obligatoire d'accéder à tous les registres.
• On ne peut viser que le registre qui nous intéresse ou les registres quelle que soit  leurs nombres.

Le plus simple est d'enregistrer la valeur souhaitée dans une variable et d'indiquer cette variable dans les instructions de lecture.
• C'est ce qui est fait dans l'exemple suivant.

Exemple
Wire.beginTransmission(DS1307_ADRESSE); // Initialise la transmission et transmet l'adresse du DS 1307 
Wire.write(adresse); //A partir de quelle adresse lit-on dans le DS1307 
Wire.endTransmission(); 
 
Wire.requestFrom(DS1307_ADRESSE, 7); //7 = Nbre bit que l'on désire lire
 
seconde = bcdToDec(Wire.read()); // La valeur du registre est stockée dans la variable "seconde" en convertissant en décimal la valeur du registre du DS 1307.
• minute = bcdToDec(Wire.read()); 
• heure = bcdToDec(Wire.read() ); 
• jour = bcdToDec(Wire.read()); //1-7 -> Dimanche - Samedi 
• date = bcdToDec(Wire.read()); 
• mois = bcdToDec(Wire.read()); 
• annee = bcdToDec(Wire.read());
 
 
Wire.endTransmission();