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 ---
- 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 ---
Modérateur : Jérémy
Mesure temperature DS3231 18F27K42
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
le fichier d'entete
Usage :
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
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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Mesure temperature DS3231 18F27K42
Bonjour paulfjujo, et tout le forum,
Pas si vieux que ça,
pour cette documentation.
A+
paulfjujo a écrit :Source du message pour le déja vieux MCU 18F26K22
Pas si vieux que ça,
![Merci Merci !](./images/smilies/CA0KWAQJ.png)
![tab ==>](./images/smilies/icon_vide.gif)
Mesure temperature DS3231 18F27K42
Merci paulfjujo pour ton partage et savoir faire.
@++
![Cool 8-)](./images/smilies/icon_cool.gif)
![Bravo :bravo:](./images/smilies/icon_bravo.gif)
![Merci Merci !](./images/smilies/CA0KWAQJ.png)
@++
Mesure temperature DS3231 18F27K42
Mesure temperature DS3231 18F27K42
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour à tous ,
Precision +-3°C sur la valeur absolue
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.
Gérard a écrit :+/- 3° n'est pas très précis. Vous en pensez quoi?
Precision +-3°C sur la valeur absolue
![siffleur :sifflotte:](./images/smilies/icon_sifflotte.gif)
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.
Mesure temperature DS3231 18F27K42
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 33 invités