Bonjour,
pour le DS1307 voici les fonctions pour travailler avec en C.
Pour lancer l'horloge, le bit 7 (CH) dans le registre des secondes doit être mis à 0 (voir la fonction active_horloge()).
Code:
#define DS1307_DevAdr_Wr 0xD0 //DS1307 Adresse en mode écriture
#define DS1307_DevAdr_Rd 0xD1 //DS1307 Adresse en mode lectrure
// Registres DS1307
#define seconds_reg 0x00
#define minutes_reg 0x01
#define hours_reg 0x02
#define day_reg 0x03
#define date_reg 0x04
#define month_reg 0x05
#define year_reg 0x06
#define control_reg 0x07
le code
Code:
void active_horloge()
{
char temp, clock_go;
clock_go = 0; // mise à 0 du bit CH (Clock Halt) => bit 7 du DS1307
clock_go = Dec2Bcd(clock_go);
temp = ds1307_read_RTC(seconds_reg);
clock_go = clock_go | temp;
ds1307_write(seconds_reg, clock_go) ;
ds1307_write(control_reg, 0b10010000) ; // sortie SQW à 1Hz
//==============================================================================
// Init Temps et calendrier
//==============================================================================
void RTC_Initial_values()
{
I2C_Stop();
delay_ms(5);
ds1307_write(seconds_reg, 0x00); // pointe sur le registre des secondes
ds1307_write(minutes_reg,0x00); // pointe sur le registre des minutes (0mn)
ds1307_write(hours_reg,0x16); // pointe sur le registre des heures (16h)
ds1307_write(day_reg,0x00); // pointe sur le registre des jours de la semaine(lundi, mardi, etc)
ds1307_write(date_reg,0x04); // pointe sur le registre de la date du jour (n° du jour ici 04)
ds1307_write(month_reg,0x08); // pointe sur le registre des mois (Aout=08)
ds1307_write(year_reg,0x09); // pointe sur le registre des années (2009=09)
}
//***************************************************************//
//*** routine de lecture dans un registre du ds1307 ***//
//***************************************************************//
char lecture_ds1307_registre(char rtcreg)
{
char rtc_data=0;
I2C_start();
I2C_Wr(0xd0); // adresse du DS1307
I2C_Wr(rtcreg); // On pointe sur le registre à lire
I2C_Repeated_Start(); // On relance un start I2C
I2C_Wr(0xd1);
rtc_data=I2C_Rd(0); // On lit le registre sans acknowledge
while (I2C_Is_Idle()==0); // On attend tant que le bus I2C est occupé (busy)
i2c_stop();
return(rtc_data); // récupération de la data et renvoi du paramètre
}
//==============================================================================
// Routine d'écriture dans les registres de l'horloge DS1307
//==============================================================================
void ds1307_ecrire(unsigned char rtcreg, unsigned char rtc_data)
{
while (I2C_Is_Idle() == 0) ; // On attend la libération du bus I2C
I2c_start(); // Start du bus I2C
I2c_Wr(DS1307_DevAdr_Wr); // 1101 000x est l'adresse et le dernier bit (x=0) indique la direction (0=write; 1=read)
I2c_Wr(rtcreg); // indique dans quel registre on souhaite écrire
I2c_Wr(rtc_data); // on écrit la data dans le registre
while (i2c_Is_Idle() == 0) ;// on attend la libération du bus
I2c_stop(); // arrêt du bus
} Je regarderai pour le DS1621 plus tard.
@+