pages

9 mars 2016

DS1307 : utilisation d'un circuit d'horloge

Le circuit DS1307 est un circuit d'horloge qui s'interface en I2C avec un microcontrôleur.


Horloge avec le circuit DS1307



DS1307 : Présentation


Ce circuit est communément nommé "horloge temps réel (RTC en anglais)", il permet de gérer le temps à partir d'un oscillateur à quartz et s'interface en I2C.

Les mois de moins de 31 jours, les années bissextiles sont gérés jusqu'à l'année 2100.

Il est disponible sous forme d'un circuit seul ou sous forme d'une platine avec la pile et les composants nécessaires à son fonctionnement.

Le datasheet de ce circuit de chez Maxim est disponible sur le net par ex ICI.

Certaines figures sont extraites de ce datasheet et sont la propriété de la société Maxim.

Bloc diagramme :


ds1307 diagramme


On peut noter la présence d'une SRAM de 56 bytes qui est sauvegardée par la batterie.

Au niveau matériel ce circuit dispose de deux pins pour le quartz, deux pins pour l'interface I2C, une pin de sortie, une pin pour la pile ou batterie et deux pins pour l'alimentation.

mcp79410 utilisation

Dans le bloc diagramme ci dessus un bloc nous intéresse plus particulièrement c'est celui intitulé "CLOCK CALENDAR AND CONTROL REGISTERS", c'est cet ensemble de registres qui permettent le contrôle du circuit et la lecture ou l'écriture des valeurs concernant le Temps.
Les différents registres sont indiqués dans le tableau ci dessous :

mcp79410 registres

Nous commencerons la description par le registre de contrôle situé à l'adresse 07 :
  • les bits 0 et 1 permettent de choisir la fréquence disponible sur la pin SQW/OUT
  • le bit 4 (SQWE) valide l'oscillateur quand il est à 1 et reporte la valeur du bit 7 quand il est à 0
  • le bit 7 (OUT) contrôle le niveau de la pin SQW/OUT quand le bit 4 est à 0
Le tableau qui résume tout :

mcp79410 registre controle


DS1307 : Utilisation


Pour les autres registres le codage est en BCD (décimal codé binaire), le registre 00 en plus du codage des secondes dispose d'un bit, le bit 7, qui permet d'autoriser ou non le fonctionnement de l'oscillateur, mis à 0 il autorise le fonctionnement de l'oscillateur.

Attention à la mise sous tension ce bit est mis à 1, ne pas oublier de le mettre à 0 pour que l'oscillateur fonctionne.

Pour cela :

    seconde=Lec_ds1307(0x00)&0b01111111;       // mise à 0 du bit 7(CH)
    Ecr_ds1307(0x00,seconde);                              // démarrage oscillateur

Cette solution met le bit 7 à 0 à chaque démarrage, il est aussi possible de faire un test sur ce bit et de mettre ce bit à 0 seulement si celui ci est à 1.

Pour utiliser ce circuit nous utiliserons la librairie I2C fournie avec XC8 et nous écrirons deux fonctions pour faire la conversion BCD vers décimal et décimal vers BCD et deux fonctions pour lire et écrire dans les registres ou la SRAM du circuit.

Pour les fonctions de conversion c'est simple (!!!), une ligne de code :

De décimal vers Bcd :       return ((a/10*16)+(a%10));

De Bcd vers décimal :       return ((a/16*10)+(a%16));


DS1307 : Les fonctions en C


La fonction d'écriture dans un registre :

  • envoi d'un "StartI2C",
  • envoi de l'adresse du circuit DS1307 avec le bit R/W au niveau bas,
  • envoi de l'adresse du registre choisi,
  • envoi de la donnée à écrire,
  • envoi d'un "StopI2C pour terminer la séquence.

La fonction de lecture dans un registre :

  • envoi d'un "StartI2C",
  • envoi de l'adresse du circuit DS1307 avec le bit R/W au niveau bas,
  • envoi de l'adresse du registre choisi,
  • envoi d'un "StopI2C",
  • envoi d'un "StartI2C",
  • envoi de l'adresse du circuit DS1307 avec le bit R/W au niveau haut,
  • lecture de la donnée,
  • test si fin de lecture,
  • envoi "StopI2C" pour terminer la séquence.
Ces différentes fonctions sont regroupées dans les fichiers lib_ds1307.h et lib_ds1307.c .

Quelques mises en garde :

  • si la pile ou la batterie n'est pas connectée au circuit il faut mettre la pin correspondante (3) au 0V,
  • la fréquence de fonctionnement du bus I2C est de 100KHz pour ce circuit,
  • ne pas oublier de charger le registre "SSPADD" avec la valeur calculée par la formule suivante  (voir AN735 page 3) :



sspadd formule

Dans notre cas nous obtenons : ((10000000/100000)/4) -1 = 24

MPLABX et XC8 : Programme de démonstration


Le fichier zip suivant contient les différents fichiers nécessaires pour tester le circuit DS1307.
Dans le fichier de test l'utilisation de la mémoire SRAM est également testée.
La platine de test est celle utilisée dans nos précédent billets.

2 commentaires:

  1. combien de temps faut-il pour le transfert en écriture

    RépondreSupprimer
  2. The TOTO - TOTO - Titanium Metal Art
    TOTO - samsung galaxy watch 3 titanium Titanium Metal Art. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. titanium key ring TOTO. TOTO. titanium iphone case TOTO. TOTO. fallout 76 black titanium TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. TOTO. titanium engine block TOTO. TOTO. TOTO. TOTO.

    RépondreSupprimer