La mesure de temperature interne DS3231 a déja été traitée par ailleurs
mais pas vu dans le cas particulier du 18F27k42
DS32131:
le MSB est dans le registre d'adresse 0x11 et le LSB à l'adresse 0X12
codage mesure sur 10 bits signé => -25 à +125°C theorique:
MSB= Signe data data data data data data data
LSB= data data 0 0 0 0 0 0
resolution 0,25°
A noter que sur ce MCU, l'adresse DS3231 est donnée sur 7 bits ( adresse device)
et non plus sur 8 bits comme avec la Librairie soft I2C pour le déja vieux MCU 18F26K22
#define DS3231_ADDR 0x68 // 7 bits RTC DS3231 HARDWARE I2C
Code : Tout sélectionner
char * Ds3231_Temp_CP(char mode)
{
char DS_Temp[9];
// " range: -99 to +127 degree
char msb, lsb, tmp;
// read the two temperature registers:
DS_Temp[0]=0x11 ;
I2C1_Wr( DS3231_ADDR, DS_Temp, 1, _I2C_END_MODE_STOP );
I2C1_Rd( DS3231_ADDR, DS_Temp, 2, _I2C_END_MODE_STOP );
msb =DS_Temp[0];
lsb= DS_Temp[1];
tmp = ' ';
if (msb.B7)
{ // SIGN_bit = 1: negative
tmp = '-';
// 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;
tmp = '1';
}
}
// the first char is a space, '-' or '1':
DS_Temp[0]=tmp;
//Lcd_Chr_CP(tmp);
// convert msb (binary value) to 2 ASCII digits
for ( tmp = '0' ; msb > 9 ; ++tmp, msb -= 10 );
// display integer portion:
DS_Temp[1]=tmp;
DS_Temp[2]=msb+'0';
// decimal point:
DS_Temp[3]= '.';
// compute fract. part:
msb = '0';
tmp = '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';
tmp = '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]= tmp;
if (mode==0) DS_Temp[6]='°'; else DS_Temp[6]= 0xDF; // for LCD
DS_Temp[7]= 'C';
DS_Temp[8]=0;
return DS_Temp;
} // end of Ds3231_Temp_CP()
le fichier d'entete
Code : Tout sélectionner
// rev 10-06-2019
// rajout mesure temperature DS3231
// revu et modifié pour 18F27K42
// version pour 18F26K22
// rev 04/11/2018 correctif bug sur MAJ Annee suite deplacement jour semaine
// rev 15/10/2018 pour AI2 application
// 04-09-2018
// enlevé init locale
// 12-06-2018 rajout option Visu ou non sur Display (updated) Time
// rev 28-05-2018 correctif jS
// rev 09-05-2017
// avec RTC DS1307
// modif : lecture de tous les registres RTC en 1 seule fois
//rajout de void BCD_To_Ascii(unsigned char cc,unsigned char *pp);
//#define DS3231_ADDR 0xD0 // 8 bits RTC DS3231 SOFTWARE I2C on 18F26K22
#define DS3231_ADDR 0x68 // 7 bits RTC DS3231 HARDWARE I2C
extern int Status;
extern unsigned char Adr;
extern char time[];//="00:00:00";
extern char date[];//="00/00/00";
extern unsigned short second,minute,heure,jS,jour,mois,Annee;
extern unsigned short DateTime[];
extern unsigned char Buffer1[];
extern unsigned int Index1;
extern unsigned char ch[3];
extern char Visu;
extern void CRLF1(void);
extern unsigned int i1;
extern volatile int Flag_Buffer1;
extern unsigned char c1;
extern unsigned char CRam1[32];
extern void UART1_Write_CText(const char *txt);
//rev 01-05-2018
extern const code char Jour0[];//="Dimanche";
extern const code char Jour1[];//="Lundi";
extern const code char Jour2[];//="Mardi";
extern const code char Jour3[];//="Mercredi.";
extern const code char Jour4[];//="Jeudi";
extern const code char Jour5[];//="Vendredi";
extern const code char Jour6[];//="Samedi";
extern const code char * JourSemaine[];//={Jour0,Jour1,Jour2,Jour3,Jour4,Jour5,Jour6};
extern const char Blancs[];//=" ";
char * Ds3231_Temp_CP(char mode) ;
void write_DS3231(unsigned short address,unsigned short w_data) ; // I2C WRITE
unsigned short read_DS3231(unsigned short address) ;
void Refresh_Date_Time(void);
void Display_Date_Time(char Visu); // 12-06-2018
void MAJ_RTC(void);
void BCD_To_Ascii(unsigned char cc,unsigned char *pp);
unsigned short Dec2Bcd(unsigned short decnum);
void read_all_DS3231(void) ;
void BCD_To_Ascii(unsigned char cc,unsigned char * px);
Usage :
Code : Tout sélectionner
UART1_Write_CText(" Init I2C1 HW \r\n");
I2C1_Init();
UART1_Write_CText(" Init RTC DS3231 \r\n");
UART1_Write_CText(" Active sortie SQW=1Hz: \r\n");
/*
slave_address: slave address.
ptrdata: pointer to the received data.
count: number of bytes to be received.
END_mode: mode in which the I²C module will be set after the reading. Available modes : Value Description
_I2C_END_MODE_RESTART I²C bus will issue a restart.
_I2C_END_MODE_STOP I²C bus will issue a stop.
*/
tmp[0]=0x0E;
tmp[1]=0b01000000;
I2C1_Wr( DS3231_ADDR, tmp, 2, _I2C_END_MODE_STOP );
do
{
UART1_Write_CText(" Temperature interne DS3231 = ");
UART1_Write_Text( Ds3231_Temp_CP(0));
CRLF1();
Delay_ms(1000);
}
while(1);
affichage terminal:
Temperature interne DS3231 = 25.25°C
Temperature interne DS3231 = 25.25°C
Temperature interne DS3231 = 25.25°C
Temperature interne DS3231 = 25.00°C
Temperature interne DS3231 = 25.00°C
Temperature interne DS3231 = 25.00°C
Temperature interne DS3231 = 25.00°C
Temperature interne DS3231 = 25.00°C
Temperature interne DS3231 = 25.00°C
Temperature interne DS3231 = 25.00°C
Temperature interne DS3231 = 25.00°C
la lib :
le fichier *.mcl doit etre inclus dans Binaries