Square-Wave Output

Cette sortie est nommée SQW/OUT.

DS1307_-_Block_Diagram.png

Le pilotage de la sortie SQW/OUT se fait à l'aide du registre accessible à l'adresse 0x07.

DS1307_-_Registers.png

Le registre de contrôle ne comporte que 4 bits utiles, dont le bit SQWE qui permet de sélectionner le mode de fonctionnement de la sortie SQW/OUT.

DS1307_-_Control_Register_bits.png

Bit 4: Square-Wave Enable (SQWE). This bit, when set to logic 1, enables the oscillator output. The frequency of the square-wave output depends upon the value of the RS0 and RS1 bits. With the square-wave output set to 1Hz, the clock registers update on the falling edge of the square wave. On initial application of power to the device, this bit is typically set to a 0.

Sortie logique

Pour être utilisée en tant que sortie logique, le bit SQWE du registre de contrôle doit impérativement être égal à 0. Le niveau logique est alors déterminé par le bit OUT. Si OUT = 0, la sortie est au niveau bas. Si OUT = 1, la sortie est au niveau haut. Par défaut, OUT = 0.

Sortie de générateur de signal carré

Pour être utilisée en tant que sortie de générateur de signal carré, le bit SQWE du registre de contrôle doit impérativement être égal à 1. La fréquence de ce signal est spécifiée par les bits RS0 et RS1 et peut avoir les valeurs suivantes :

  • 1 Hz (RS0 = 0, RS1 = 0) ;
  • 4,096 kHz (RS0 = 1, RS1 = 0) ;
  • 8,192 kHz (RS0 = 0, RS1 = 1) ;
  • 32,768 kHz (RS0 = 1, RS1 = 1).

DS1307_-_Control_Register_sqw.png

Par défaut, RS0 = 1 et RS1 = 1.

Bibliothèque RTClib

La bibliothèque RTClib de JeeLabs - ou ses différents forks tel que ceux d'iDreamMicro ou d'Adafruit - est probablement la bibliothèque Arduino la plus utilisée pour piloter l'horloge temps réel DS1307.

Cette bibliothèque se concentrait sur la gestion du temps de l'horloge et est depuis peu capable d'en exploiter la mémoire vive. On ajoutera des méthodes pour utiliser la sortie SQW/OUT :

  • pilotage du niveau logique ;
  • génération d'un signal carré.

API

On ajoute dans l'API une énumération indiquant les fréquences que peut générer le DS1307 (lignes 33 à 40).

Les prototypes de deux nouvelles méthodes font également leur apparition :

  • setSqwOutLevel (ligne 47) pour fixer le niveau de sortie ;
  • setSqwOutSignal (ligne 48) pour configurer le générateur de signal carré.
// RTC based on the DS1307 chip connected via I2C and the Wire library
class RTC_DS1307 {
public:
    
    // SQW/OUT frequencies.
    enum Frequencies
    {
        Frequency_1Hz,
        Frequency_4096Hz,
        Frequency_8192Hz,
        Frequency_32768Hz
    };

    static void begin() {}
    static void adjust(const DateTime& dt);
    static DateTime now();
    
    // SQW/OUT functions.
    void setSqwOutLevel(uint8_t level);
    void setSqwOutSignal(Frequencies frequency);
    
    // RAM registers read/write functions. Address locations 08h to 3Fh.
    // Max length = 56 bytes.
    static uint8_t readByteInRam(uint8_t address);
    static void readBytesInRam(uint8_t address, uint8_t length, uint8_t* p_data);
    static void writeByteInRam(uint8_t address, uint8_t data);
    static void writeBytesInRam(uint8_t address, uint8_t length, uint8_t* p_data);

    // utility functions
    static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
    static uint8_t bin2bcd (uint8_t val) { return val + 6 * (val / 10); }
};

La méthode setSqwOutLevel propose une API similaire à celle de la méthode digitalWrite d'Arduino. Ainsi le niveau de sortie peut être désiré peut être fixé à l'aide des macros HIGH et LOW.

Implémentation

Côté implémentation, on écrit les méthodes exposées dans l'API.

Afin d'éviter des nombres magiques, on définit quelques macros pour décrire le registre de contrôle du DS1307 situé à l'adresse 0x07.

#define DS1307_ADDRESS          0x68
#define DS1307_CONTROL_REGISTER 0x07
#define DS1307_RAM_REGISTER     0x08

// DS1307 Control register bits.
#define RTC_DS1307__RS0         0x00
#define RTC_DS1307__RS1         0x01
#define RTC_DS1307__SQWE        0x04
#define RTC_DS1307__OUT         0x07

La méthode setSqwOutLevel écrit la valeur du registre de contrôle du DS1307 en fonction du niveau de sortie souhaité.

void RTC_DS1307::setSqwOutLevel(uint8_t level) {
    uint8_t value = (level == LOW) ? 0x00 : (1 << RTC_DS1307__OUT);  
    Wire.beginTransmission(DS1307_ADDRESS);
  	Wire.write(DS1307_CONTROL_REGISTER);	
  	Wire.write(value);
    Wire.endTransmission();
}

La méthode setSqwOutSignal écrit la valeur du registre de contrôle du DS1307 en fonction de la fréquence du signal carré souhaitée.

void RTC_DS1307::setSqwOutSignal(Frequencies frequency) {
    uint8_t value = (1 << RTC_DS1307__SQWE);
    switch (frequency)
    {
        case Frequency_1Hz:
            // Nothing to do.
        break;
        case Frequency_4096Hz:
            value |= (1 << RTC_DS1307__RS0);
        break;
        case Frequency_8192Hz:
            value |= (1 << RTC_DS1307__RS1);
        break;
        case Frequency_32768Hz:
        default:
            value |= (1 << RTC_DS1307__RS1) | (1 << RTC_DS1307__RS0);
        break;
    }
    Wire.beginTransmission(DS1307_ADDRESS);
  	Wire.write(DS1307_CONTROL_REGISTER);	
  	Wire.write(value);
    Wire.endTransmission();
}

Mise en œuvre

Le sketch d'exemple ds1307_sqwout.ino configure le DS1307 de manière à obtenir un signal carré de fréquence 1 Hz sur la sortie SQW/OUT (ligne 15).

// SQW/OUT signal functions using a DS1307 RTC connected via I2C and Wire lib.
// 2012-11-14 idreammicro.com http://opensource.org/licenses/mit-license.php

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC;

void setup () {
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();
    
    // Set SQW/Out signal frequency to 1 Hz.
    RTC.setSqwOutSignal(RTC_DS1307::Frequency_1Hz);
}

void loop () {
    // Nothing to do.
}

On vérifie le bon fonctionnement de la bibliothèque en observant le signal à l'oscilloscope pour les différentes fréquences qu'est capable de générer le DS1307.

  • 1 Hz  :

0001.png

  • 4,096 kHz  :

4096.png

  • 8,192 kHz  :

8192.png

  • 32,768 kHz  :

32768.png

Conclusion

L'utilisation la plus intéressante de la sortie SQW/OUT du DS1307 est probablement la génération d'un signal carré. Ce signal peut par exemple servir à déclencher des actions à intervalles réguliers ou encore à fournir un signal d'horloge à un autre composant.

Comme de coutume lorsqu'iDreamMicro utilise un logiciel libre comme base de travail, une pull request a été soumise à JeeLabs pour réintégrer les nouvelles méthodes d'utilisation de la sortie SQW/OUT du DS1307 dans le projet original.

[Télécharger la bibliothèque]

Articles relatifs