//rev 08/03/2021 #define DS3231_ADDR 0xD0 //0x68 I2C Hardware : sur 7 bits sinon 0xD0 sur 8 bitsRTC_DS3231_2021-03.inc const char MOIS0[] ="erreur "; const char MOIS1[] ="Janvier "; const char MOIS2[] ="Fevrier "; const char MOIS3[] ="Mars "; const char MOIS4[] ="Avril "; const char MOIS5[] ="Mai "; const char MOIS6[] ="Juin "; const char MOIS7[] ="Juillet "; const char MOIS8[] ="Aout "; const char MOIS9[] ="Septembre "; const char MOIS10[]="Octobre "; const char MOIS11[]="Novembre "; const char MOIS12[]="Decembre "; const char * Douze_Mois[]={MOIS0,MOIS1,MOIS2,MOIS3,MOIS4,MOIS5,MOIS6,MOIS7,MOIS8,MOIS9,MOIS10,MOIS11,MOIS12 }; const code char Jour0[]="Error "; const code char Jour1[]="Lundi "; const code char Jour2[]="Mardi "; const code char Jour3[]="Mercredi "; const code char Jour4[]="Jeudi "; const code char Jour5[]="Vendredi "; const code char Jour6[]="Samedi "; const code char Jour7[]="Dimanche "; const code char * JourSemaine[]={Jour0,Jour1,Jour2,Jour3,Jour4,Jour5,Jour6,Jour7}; const code char All_Jour_Semaine[]="ErLuMaMeJeVeSaDi"; extern void BCD_To_Ascii(unsigned char cc,unsigned char * px); extern void Print (char *t); extern void CPrint (const char *t); extern void Envoi_Char(char c); extern void CRLF1(void); void Display_Date_Time(char Visu); // 12-06-2018 void Ds3231_Temp_CP(char mode) ; void DS3231_Read_All_Registers(void); unsigned char Lecture_Affichage_Registre_DS3231(char n, char imprime); void I2C1_Write(unsigned char addr8, unsigned char addr_data, unsigned char* b, signed char n); void MAJ_RTC(void); void Ds3231_Temp_CP(char mode) { // " range: -99 to +127 degree char msb, lsb, tmp1; // read the two temperature registers: msb=Lecture_Affichage_Registre_DS3231(0x11,0); lsb=Lecture_Affichage_Registre_DS3231(0x12,0); tmp1 = ' '; if (msb.B7) { // SIGN_bit = 1: negative tmp1 = '-'; // two's complement conversion: msb ^= 0xFF; if (!lsb) ++msb; // required if the fractional portion is zero else lsb.B0 = 1; // negative fract. sign, normally it is 0 } else { if (msb > 99) { msb -= 100; tmp1 = '1'; } } // the first char is a space, '-' or '1': DS_Temp[0]=tmp1; //Lcd_Chr_CP(tmp); // convert msb (binary value) to 2 ASCII digits for ( tmp1 = '0' ; msb > 9 ; ++tmp1, msb -= 10 ); // display integer portion: DS_Temp[1]=tmp1; DS_Temp[2]=msb+'0'; // decimal point: DS_Temp[3]= '.'; // compute fract. part: msb = '0'; tmp1 = '0'; if (lsb) { // positive 7,6 bits: 01(25), 10(50), 11(75) // negative 7,6 bits: 01(75), 10(50), 11(25) if (!lsb.B6) msb = '5'; // 50 else { msb = '2'; tmp1 = '5'; if (lsb.B0) // negative fract. (see above): 25 <> 75 lsb.B7 = !lsb.B7; if (lsb.B7) msb = '7'; } } // fract. part DS_Temp[4]= msb; DS_Temp[5]= tmp1; if (mode==0) DS_Temp[6]='°'; else DS_Temp[6]= 176; // for LCD DS_Temp[7]= 'C'; DS_Temp[8]=0; } // end of Ds3231_Temp_CP() void Display_Date_Time(char Visu) { unsigned char Adresse,Registre; signed char Nb; int i; Adresse=DS3231_ADDR; Registre=0; Nb=7; for(i=0;i<8;i++) tmp[i]=0; p1=&tmp[0]; DS3231_Read_All_Registers(); time[0]=0; date[0]=0; BCD_To_Ascii(heure,time) ; time[2]='H'; BCD_To_Ascii(minute,time+3 ); time[5]='M'; BCD_To_Ascii(second,time+6); time[8]='S';time[9]=0; BCD_To_Ascii(jour,date); date[2]='/'; BCD_To_Ascii(mois,date+3); date[5]='/'; BCD_To_Ascii(Annee,date+6); date[8]=0; Month=Bcd2Dec(mois); Sec= Bcd2Dec(second); if( Visu==1) { Print(date); CPrint(Blancs); Print(time); CPrint(Blancs); } } void Print_Date_Complete(void) { DS3231_Read_All_Registers(); time[0]=0; BCD_To_Ascii(jour,date); date[2]='/'; BCD_To_Ascii(mois,date+3); date[5]='/'; BCD_To_Ascii(Annee,date+6); date[8]=0; CPrint(JourSemaine[jS]);Envoi_Char(' '); BCD_To_Ascii(jour,CRam1);Print (CRam1);Envoi_Char(' '); Month=Bcd2Dec(mois); CPrint(Douze_Mois[Month]);Envoi_Char(' '); BCD_To_Ascii(Annee,CRam1);Print (CRam1);Envoi_Char(' '); BCD_To_Ascii(heure,time) ; time[2]='H'; BCD_To_Ascii(minute,time+3 ); time[5]='M'; BCD_To_Ascii(second,time+6); time[8]='S';time[9]=0; Print(time); CRLF1(); } void MAJ_RTC(void) { int m,i,j,k; m=2; // passe par dessus "U;" // U;24;08;17;17;36;02# j=0; //Status=0; U1RXIE_bit=0; //Print(Buffer1);CRLF1(); *(Buffer1+Index1)=0; if ((Index1<22)&&(Index1>18)) { // CPrint(" Index1 = "); // WordToStr(Index1,CRam1); // Print(CRam1); // CRLF1(); for (i=2;i 1Hz Reset second to 0 sec. and stop Oscillator I2C1_Write(DS3231_ADDR,0x0E,p1,1); CPrint("Ecriture en bloc dans DS3231... OK\r\n"); // CRLF1(); } else { CPrint("\r\n Rappel format de cde : \"U;JJ;MM;AA;HH;MM;jS;#\" \r\n"); CPrint(" U;24;08;17;18;36;04# pour 24 Aout 2017 18H36 04=Jeudi\r\n\r\n"); } } void DS3231_Read_All_Registers() { //Lecture des 7 registre RTC DS3231 // RAZ table d'echange for (i=0;i<10;i++) tmp[i]=0 ; p1=&tmp[0]; // pointeur sur debut de table SQA=1; // choix debut RTC registre=0 while (!I2C1STAT0_BFRE) ; I2C1STAT1_CLRBF = 1; I2C1ADB1 = DS3231_ADDR; // Adresse Devide avec R/W=0 ( 0xD0) I2C1CNT = 1; // Charge Nb de bytes à ecrire I2C1TXB = *(p1++); // Charge l'adresse du registre concerné I2C1PIR_PCIF = 0; // Raz flag STOP I2C1CON0_S = 1; // Start transmission while (!I2C1PIR_PCIF) ; // attente du STOP // lecture des 7 regitres via interruption while (!I2C1STAT0_BFRE) ; // attente bus libre p1=&tmp[0] ; I2C1PIR_PCIF=0; I2C1ERR=0; I2C1RXIE_bit=1; // arme interrupt I2C reception I2C1ADB1 = (DS3231_ADDR+1); // adresse devic e+ R/W=1 )lecture en 0xD1 I2C1CNT =7; // nombre de regitre à lire I2C1IE_bit=1 ; // autorise IT I2C I2C1CON0_S = 1; // Start Delay_us(10); while (!I2C1PIR_PCIF) ; I2C1STAT1_CLRBF =0; // clear I2C1RXIF bi I2C1IE_bit=0; I2C1PIR_PCIF=0; SQA=0; second=tmp[0]; minute=tmp[1]; heure=tmp[2]&0x3F; jS=tmp[3]; if (jS>7) jS=0; jour=tmp[4]; mois=tmp[5]& 0x1F; Annee=tmp[6]; tmp[7]=0; tmp[8]=0; } unsigned char Lecture_Affichage_Registre_DS3231(char n, char Imprime) { static char Reponse; while (!I2C1STAT0_BFRE) ; I2C1STAT1_CLRBF = 1; I2C1ADB1 = DS3231_ADDR; // Adresse Devide avec R/W=0 ( 0xD0) I2C1CNT = 1; // Charge Nb de bytes à ecrire I2C1TXB = n; // Charge l'adresse du registre concerné I2C1PIR_PCIF = 0; // Razflag STOP I2C1CON0_S = 1; // Start transmission while (!I2C1PIR_PCIF) ; // attente du STOP //lecture I2C while (!I2C1STAT0_BFRE) ; // attente bus libre p1=&tmp[0] ; I2C1PIR_PCIF=0; I2C1ERR=0; I2C1IE_bit=1; // autorise interrupt I2C I2C1RXIE_bit=1; // arme interrupt I2C reception I2C1ADB1 = (DS3231_ADDR+1); I2C1CNT =1; I2C1IE_bit=1 ; I2C1CON0_S = 1; Delay_us(10); while (!I2C1PIR_PCIF) ; I2C1STAT1_CLRBF =0; // RAZ du bit interrupt I2C1RXIF I2C1IE_bit=0; // inhibe IT I2C I2C1PIR_PCIF=0; SQA=0; Reponse=tmp[0]; // recupère la valeur Minute de la RTC if (Imprime==1) { BCD_To_Ascii(tmp[0],CRam1); Print(CRam1); Envoi_Char(TAB); } return Reponse; // CRLF1(); }