Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Mesure temperature DS3231 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1311
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » lun. 10 juin 2019 10:59

bonjour à tous,

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 msblsbtmp;
    
// read the two temperature registers:
    
DS_Temp[0]=0x11 ;
    
I2C1_WrDS3231_ADDR,  DS_Temp1,  _I2C_END_MODE_STOP );
    
I2C1_RdDS3231_ADDR,  DS_Temp2_I2C_END_MODE_STOP );
     
msb =DS_Temp[0];
    
lsbDS_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 ; ++tmpmsb -= 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_WrDS3231_ADDRtmp2_I2C_END_MODE_STOP );   
  do
  {
   
UART1_Write_CText(" Temperature interne DS3231 = ");
   
UART1_Write_TextDs3231_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 :
Lib_DS3231_18F27K42_with_Temper_1906.zip



le fichier *.mcl doit etre inclus dans Binaries

project_files.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou Fantastpic t'aideras

Mesure temperature DS3231 18F27K42
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1221
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » lun. 10 juin 2019 21:11

Bonjour paulfjujo, et tout le forum,

paulfjujo a écrit :Source du message pour le déja vieux MCU 18F26K22


Pas si vieux que ça, Merci ! pour cette documentation.

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Mesure temperature DS3231 18F27K42
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 614
Âge : 33
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#3 Message par venom » lun. 10 juin 2019 21:13

Merci paulfjujo pour ton partage et savoir faire. 8-) :bravo: Merci !






@++
En fait tout est une question de BIT ? :-D

Mesure temperature DS3231 18F27K42
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1102
Âge : 60
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#4 Message par Gérard » lun. 10 juin 2019 22:03

Bonjour,
Ci-dessous, un extrait de la doc.
Temperature Accuracy Temp VCC = 3.3V or VBAT = 3.3V -3 +3 °C

+/- 3° n'est pas très précis. Vous en pensez quoi?
Le 18 / 04 / 2019 je suis devenu papy de jumeaux, une fille et un garçon. Quel bonheur.

Mesure temperature DS3231 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1311
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » mar. 11 juin 2019 14:42

bonjour à tous ,

Gérard a écrit :+/- 3° n'est pas très précis. Vous en pensez quoi?


Precision +-3°C sur la valeur absolue
:sifflotte: si on a de la chance on peut tomber su un modele à + - 0 °C

une sonde DS18B20 semblerait plus precise , bien que j'ai déja pu constater >1°C d'ecart entre 2 sondes DS18B20
placées cotes à cote et corps relié par un elastic ..
la resolution de la DS18B20 est de 0,0625°C (mode +-11 bits ou 12bits signes)
au lieu de 0,25°C pour la DS3231 (+-9bits ou 10 bits signes)


La mesure de temperature interne est utilisée par la DS3231 pour corriger la frequence de l'oscillateur interne 32KHz
au demarrage et ensuite
toute les 64 secondes ( si j'ai bien interprété la Datasheet)
Il y a aussi une registre en 0x10 pour corriger manuellement
( une sorte de OSCTUNE ) , encore faut -il avoir une autre source temporelle fiable (GPS, DCF77 ..)

2 exemples de mesures comparatives DS3231 et DS18B20
hier et aujourd'hui

10-06-18 21:38:01 Temp DS3231= 24.50°C ;23.50°C
10-06-18 21:38:02 Temp DS3231= 24.50°C ;23.43°C
10-06-18 21:38:03 Temp DS3231= 24.50°C ;23.43°C
10-06-18 21:38:04 Temp DS3231= 24.50°C ;23.43°C

11-06-18 14:21:03 Temp DS3231= 22.25°C ;21.06°C
11-06-18 14:21:04 Temp DS3231= 22.25°C ;21.06°C
11-06-18 14:21:06 Temp DS3231= 22.25°C ;21.06°C

la 1ere mesure est celle issue du capteur interne DS3231, la 2eme celle d'une sonde DS18B20 (avec fourreau inox)
on voit la difference de resolution


Le 18F27K42 n'est pas facile ...
je bataille aujourd'hui pour transposer mon programme Horloge Anneau 60 leds + 4 max7219 matrice avec 18F26K22
sur ce nouveau MCU ..
il y a beaucoup de difference à prendre en compte à tous niveaux UART,ADC,Timers,interrupt,I2C ...etc
et en plus .. l'assignation des pins

le 18F26K22 est vraiment le (plus vieux et) facile à utiliser parmi tous les MCU que j'ai déja testé. ..
mais son prix sur le marché à plus que triplé.. il devient rare.
Aides toi, le ciel ou Fantastpic t'aideras

Mesure temperature DS3231 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1311
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » sam. 15 juin 2019 10:39

paulfjujo a écrit :bonjour à tous ,

Gérard a écrit :+/- 3° n'est pas très précis. Vous en pensez quoi?


Precision +-3°C sur la valeur absolue
:sifflotte: si on a de la chance on peut tomber su un modele à + - 0 °C

une sonde DS18B20 semblerait plus precise , bien que j'ai déja pu constater >1°C d'ecart entre 2 sondes DS18B20
placées cotes à cote et corps relié par un elastic ..
la resolution de la DS18B20 est de 0,0625°C (mode +-11 bits ou 12bits signes)
au lieu de 0,25°C pour la DS3231 (+-9bits ou 10 bits signes)


La mesure de temperature interne est utilisée par la DS3231 pour corriger la frequence de l'oscillateur interne 32KHz
au demarrage et ensuite
toute les 64 secondes ( si j'ai bien interprété la Datasheet)
Il y a aussi une registre en 0x10 pour corriger manuellement
( une sorte de OSCTUNE ) , encore faut -il avoir une autre source temporelle fiable (GPS, DCF77 ..)

2 exemples de mesures comparatives DS3231 et DS18B20
hier et aujourd'hui

10-06-18 21:38:01 Temp DS3231= 24.50°C ;23.50°C
10-06-18 21:38:02 Temp DS3231= 24.50°C ;23.43°C
10-06-18 21:38:03 Temp DS3231= 24.50°C ;23.43°C
10-06-18 21:38:04 Temp DS3231= 24.50°C ;23.43°C

11-06-18 14:21:03 Temp DS3231= 22.25°C ;21.06°C
11-06-18 14:21:04 Temp DS3231= 22.25°C ;21.06°C
11-06-18 14:21:06 Temp DS3231= 22.25°C ;21.06°C


13-06-18 13:30:15 Temp DS3231= 23.50°C ;22.87°C
13-06-18 13:30:16 Temp DS3231= 23.50°C ;22.87°C

14-06-18 12:32:42 Temp DS3231= 23.50°C ;23.75°C
14-06-18 12:32:43 Temp DS3231= 23.50°C ;23.68°C

la 1ere mesure est celle issue du capteur interne DS3231, la 2eme celle d'une sonde DS18B20 (avec fourreau inox)
on voit la difference de resolution


Le 18F27K42 n'est pas facile ...
je bataille aujourd'hui pour transposer mon programme Horloge Anneau 60 leds + 4 max7219 matrice avec 18F26K22
sur ce nouveau MCU ..
il y a beaucoup de difference à prendre en compte à tous niveaux UART,ADC,Timers,interrupt,I2C ...etc
et en plus .. l'assignation des pins

le 18F26K22 est vraiment le (plus vieux et) facile à utiliser parmi tous les MCU que j'ai déja testé. ..
mais son prix sur le marché à plus que triplé.. il devient rare.
Aides toi, le ciel ou Fantastpic t'aideras


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités