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 ---
Tout ce qui n'a pas de catégorie !
DS3231 et température
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#1 Message par Gérard » mar. 28 mai 2024 16:55 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Je viens de rouvrir un ancien programme où j'utilise cette RTC où la température est disponible.
En page 15 de la doc, il est dit que le registre de température est codée en complément à 2.
J'ai un creux et Wikipédia ne m'a pas aidé.
Merci de rafraichir ma mémoire.

HS : bravo les courageux de CNC. :bravo:
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

DS3231 et température
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3256
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » mar. 28 mai 2024 18:13 lien vers la Data-Sheet : Cliquez ici

bonjour Gerard,



c'est la valeur qu'il faut rajouter pour obtenir 0xFF
exemple pour un byte =0x63 complement à 2 = 0x9C
0x63 + 0x9C=0xFF
usage de la fonction XOR
msb = msb ^ 0xFF;
msb=0x63;
msb=msb xor 0xFF; - > 0x9C
si on refait
msb=msb xor 0xFF ; -> 0x63

on s'en sert beaucoup pour inverser la video sur un LCD grafique

par contre la lecture temperature de la RTC est un peu capilotractée ....
je l'utilise dans mon appli Chaudiere .. juste pour info
:sifflotte: même si c'est en C !

nota : l'argument passé dans la fonction, depend sur quoi on affiche le resultat
0 => pour affichage caractere degré sur terminal
1 => pour usage caractere special LCD


Code : Tout sélectionner


void Ds3231_Temp_CP
(char mode) ;


 void Ds3231_Temp_CP(char mode)
  {
   // " range: -99 to +127 degree
   unsigned 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 & 0x80)
   { // SIGN_bit = 1: negative
      tmp1 = '-';
      // two's complement conversion:
      msb = msb ^ 0xFF;
      if (!lsb)
         ++msb; // required if the fractional portion is zero
      else
         lsb
=lsb | 0x01 ; // 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)
      if (( lsb & 64)==0)    
         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';
         if (lsb & 0x01) // negative fract. (see above): 25 <> 75
            lsb=lsb & 0x7F;
         if (lsb & 0x80)
            msb = '7'; 
           
         
      
}
   } // fract. part

   DS_Temp[4]= msb;
   DS_Temp[5]= tmp1;
  if (mode==0)  DS_Temp[6]=176; else DS_Temp[6]= 0;  // for LCD
   DS_Temp[7]= 'C';
   DS_Temp[8]=0;
}
 // end of Ds3231_Temp_CP()
 


usage dans le main
CPrint(" Temperature DS3231 => ");
Ds3231_Temp_CP(0);
Print(DS_Temp);
CRLF1();


resulta sur terminal
Re-Lecture et affichage des 8 registres RTC DS3231
Mardi 28/05/24 18H07M52S
Temperature DS3231 => 25.7°C
Aide toi, le ciel ou FantasPic t'aidera

DS3231 et température
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#3 Message par Gérard » mar. 28 mai 2024 21:19 lien vers la Data-Sheet : Cliquez ici

Merci Paul pour ton retour.
Donc si T > 0, alors bit 8 = 0 et la valeur des autres bits est en lecture normale, en binaire, pas en BCD comme les autre valeurs (h, mn ...)
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

DS3231 et température
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3256
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » mer. 29 mai 2024 17:45 lien vers la Data-Sheet : Cliquez ici

bonjour Gerard et à tous,


oui, tout a fée .. pas de BCD
ça ressemble d'ailleurs à du codage de DS18B20 (capteur de temperature OWS signal numerique) !

Meme si cette mesure de temperature est entachée par l'auto echauffement
interne de la DS3231, ça peut donner une bonne idée de la temperature ambiante
autour du circuit .
celle ci sert aussi à compenser les derives internes ( quartz,etc...)
ce qui est absent dans la DS1307 ..et amène ici
beaucoup de discussions. à mon avis ,inutiles !

mieux vaut remplacer une DS1307 par un DS3231 et basta..
Aide toi, le ciel ou FantasPic t'aidera

DS3231 et température
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#5 Message par Gérard » jeu. 30 mai 2024 07:41 lien vers la Data-Sheet : Cliquez ici

Bonjour Paul et à tous,

Tant qu'on reste dans des températures positives, pas de souci de complément à 2.
J'ai effectivement remarqué que la température affichée est de 2 degrés supérieure à la température effective. Une petite correction soft suffit pour solutionner ce petit souci.
Depuis que je connais la DS3231, je n'utilise plus de DS1307.
J'ai survolé la discussion que tu cites et je suis de ton avis, elle n'est pas très utile.
Ce n'est pas la DS qui dérive mais le quartz associé.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

DS3231 et température
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#6 Message par Gérard » mar. 3 déc. 2024 15:28 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Il me vient une autre question : comment choisir l'adresse de l'EEPROM?
Il y a bien 3 soudures masquées A0, A1 et A2. Peut-on choisir VCC ou GND?

Encore une question : comment mettre des données dans cette mémoire?
Perso, je programme les EEPROM avec mon PICKit2.

Merci pour vos retours.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

DS3231 et température
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3256
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » mar. 3 déc. 2024 20:22 lien vers la Data-Sheet : Cliquez ici

bonsoir,


Gérard a écrit :Bonjour à tous,

Il me vient une autre question : comment choisir l'adresse de l'EEPROM?
Il y a bien 3 soudures masquées A0, A1 et A2. Peut-on choisir VCC ou GND?




Oui,

Gérard a écrit :Encore une question : comment mettre des données dans cette mémoire?
Perso, je programme les EEPROM avec mon PICKit2.
Merci pour vos retours.


un bout de code en C

Code : Tout sélectionner




adresse de base par defut de 24C32 
0xA0
#define EEPROM_4K_ADR 0xA0 

// ***************  24C32  4K bytes **********************

void Write_To_24C32(unsigned int Adrunsigned char cx)
{
I2C1_Is_Idle();
I2C1_Start();
err=I2C1_Wr(EEPROM_4K_ADR );      // write
err=I2C1_Wr(hi(Adr));    // send data (data to be written)
err=I2C1_Wr(lo(Adr));
err=I2C1_Wr(cx);    // send data (data to be written)
I2C1_Stop();
I2C1_Is_Idle();
Delay_ms(5);
}


unsigned char Read_From_24C32(unsigned int Adr)
{
unsigned char c3;
I2C1_Is_Idle();
 
Delay_ms(1);
I2C1_Start();
err=I2C1_Wr(EEPROM_4K_ADR );  // write
err=I2C1_Wr(hi(Adr));    // send adress to be read)
err=I2C1_Wr(lo(Adr));
I2C1_Is_Idle();
I2C1_Repeated_Start();
err=I2C1_Wr(EEPROM_4K_ADR+);  // Read
c3=I2C1_Rd(0u);    // data to be read)
I2C1_Stop();
I2C1_Is_Idle();
return 
c3;
}



 
Aide toi, le ciel ou FantasPic t'aidera

DS3231 et température
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#8 Message par Gérard » mar. 3 déc. 2024 21:22 lien vers la Data-Sheet : Cliquez ici

Merci Paul, je vais étudier tout ça.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

DS3231 et température
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#9 Message par Gérard » mer. 4 déc. 2024 20:13 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Paul, j'ai (un peu) honte, après avoir regardé ton exemple en C, j'ai consulté la doc de mon compilateur et ça se rejoint.
J'ai appelé trop vite au secours.

Encore merci pour ton aide.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

DS3231 et température
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1937
Âge : 67
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#10 Message par Gérard » jeu. 5 déc. 2024 21:57 lien vers la Data-Sheet : Cliquez ici

Je viens de tomber sur un site où j'ai trouvé le schéma du module.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.


Retourner vers « Coin Fourre-tout »

Qui est en ligne

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