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

Duré d'acquisition capteur OWS DS18B20
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#11 Message par paulfjujo » dim. 16 avr. 2023 17:43

bonsoir à tous,


J'ai enfin trouver la réponse que j'attendais sur FUTURA par JIHERVE :+1:
et le document
document Interfacing the DS18X20/DS1822 1-Wire®Temperature Sensor in a MicrocontrollerEnvironment
la fonction Reading Device Temperature en page 12
copy ci jointe

Interfacing_DS18X20_DS1822_1-Wire_Temp_Sensor_in_a_MCU_ Analog Devices.pdf


:-D il n' y a pas de test bit et tout au plus un delay de seulement 5µS !

si vous arrivez à faire tourner la fonction donnée par Analog device , faites moi-signe
(car au moins 3 bugs dedans !)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Duré d'acquisition capteur OWS DS18B20
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#12 Message par satinas » dim. 16 avr. 2023 17:53

Bonjour,
Je comprends rien depuis le début à ce que tu racontes. Il n' y a aucun problème pour lire à tout moment le scratchpad, et si la conversion est en cours, on récupère le résultat précedent. C'est ce que j'ai fait dans ce post avec les valeurs lues en cours de conversion. Il y a 2 transactions différentes, convert et read, et le read peut être lancé quand on veut.
Pour éviter de bloquer la cpu dans l'attente, il faut toutes les 800ms lire la température et lancer une nouvelle conversion, on a alors du temps pour faire autre chose.

Duré d'acquisition capteur OWS DS18B20
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#13 Message par paulfjujo » dim. 16 avr. 2023 20:24

bonsoir Satinas,

j'ai sans doute mal exprimé mon questionnement ....
et aussi avec une datas sheet DS18B20 imcomplete !

Mon but etait de savoir si il avait une duree MINimum de convertion (apres lancement de la demande de lecture mesure via 0x44) ,
sachant que la datasheet ne parle que de duree MAXImum de 750mS ( en resolution 11bits) et en testant le bit de fin de conversion ,
sans specifier une durée Standard ou duree Mini.
(parametres habituels dans une data sheet!)

il s'avere que je peux tres bien faire une acqusition en 10 ms .. j'ai donc ma réponse

test sur 1000 mesures consecutives .. 1 mesure chaque 10mS !
DS18B20_test_1000mesures.jpg


meme si on dit qu'on lit le contenu du scratchpad precedent , il faut bien un certain temps pour faire la conversion..
sinon ma mesure n'evolurait pas. .. ici avec 10mS ,ça passe sans tester le retour de fin de conversion!

Nota: j'ai bien conscience que saisir une mesure à 10mS , devant le temps de réponse d'une sonde DS18B20 noyée dans un etui INOX
n'a aucun sens ... mais je sais aussi maintenant que je n'aurais pas à attendre 3x750mS pour obtenir mes 3 mesures DS18B20
:sifflotte: That's all !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le dim. 16 avr. 2023 20:31, modifié 1 fois.
Aide toi, le ciel ou FantasPic t'aidera

Duré d'acquisition capteur OWS DS18B20
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#14 Message par satinas » dim. 16 avr. 2023 20:29

Alors donne-moi le code qui permet d'obtenir ces mesures, car là je comprendrais enfin.
Je vais quand même tester avant :)
Tu lancerais pas la conversion avant que la conversion précédente soit finie ? si c'est ça je n'y aurais jamais pensé, pas assez téméraire.
Pourquoi 3x750ms ? Tu lances les conversion en même temps, donc une seule fois 750ms.
Au téléphone on aurait réglé cela en 5 minutes, marre des forums.
Modifié en dernier par satinas le dim. 16 avr. 2023 20:37, modifié 1 fois.

Duré d'acquisition capteur OWS DS18B20
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#15 Message par paulfjujo » dim. 16 avr. 2023 20:36

Code : Tout sélectionner



#define AVEC_TEMPO

float getTemperature2()
{
  unsigned char i;
  float temperature1;
  unsigned char scratchPad[9] = {0,0,0,0,0,0,0,0,0};
//  for (i=0;i<9;i++) scratchPad[i] =0;
  onewireInit_1();
  onewireWriteByte_1(0xCC);
  onewireWriteByte_1(0x44);
  #ifdef AVEC_TEMPO
   __delay_us(50);    //was __delay_us(485);
  #else
   while (1) {
  if (onewireReadBit_1())  // au moins 1 capteur connecté
     break;
 }
#endif
  onewireInit_1();
  onewireWriteByte_1(0xCC);
  onewireWriteByte_1(0xBE);
  for (= 0; i < 2; i++)  scratchPad[i] = onewireReadByte_1();
  onewireInit_1();
  temperature1 =( ( scratchPad[1] * 256.0) + scratchPad[0] )*Resolution   ;
  return temperature1;
}
==============================================================

#ifndef ONEWIRE_H_   
#define ONEWIRE_H_

#define _XTAL_FREQ 64000000

//onewirePin defines
#define onewirePin PORTAbits.RA0
#define onewirePinDirection TRISAbits.TRISA0 //0 = output, 1 = input

#define onewirePin1 PORTAbits.RA1
#define onewirePinDirection1 TRISAbits.TRISA1 //0 = output, 1 = input

#define onewirePin2 PORTAbits.RA2
#define onewirePinDirection2 TRISAbits.TRISA2 //0 = output, 1 = input


void onewireWriteBit_0(int b);
void onewireWriteBit_1(int b) ;
void onewireWriteBit_2(int b) ;


unsigned char onewireReadBit_0();
unsigned char onewireReadBit_1();
unsigned char onewireReadBit_2();

unsigned char onewireInit();
unsigned char onewireInit_0();
unsigned char onewireInit_1();
unsigned char onewireInit_2();

unsigned char onewireReadByte();
unsigned char onewireReadByte_0();
unsigned char onewireReadByte_1();
unsigned char onewireReadByte_2();

void onewireWriteByte(char data);
void onewireWriteByte_0(char data);
void onewireWriteByte_1(char data);
void onewireWriteByte_2(char data);

unsigned char onewireCRC(unsigned char* addr, unsigned char len);
void Relecture_Current_ID_datas(void);

#endif
=============================

// rev 07-04-2023
#include <xc.h>
#include <pic18f27k42.h>
#include "OneWire_barker.h"

#define onewirePin PORTAbits.RA0
#define onewirePinDirection TRISAbits.TRISA0 //0 = output, 1 = input

#define onewirePin0 PORTAbits.RA0
#define onewirePinDirection0 TRISAbits.TRISA0 //0 = output, 1 = input

#define onewirePin1 PORTAbits.RA1
#define onewirePinDirection1 TRISAbits.TRISA1 //0 = output, 1 = input

#define onewirePin2 PORTAbits.RA2
#define onewirePinDirection2 TRISAbits.TRISA2 //0 = output, 1 = input



void onewireWriteBit(int b) 
{
  b = b & 0x01;
  if (b) {
    // Write '1' bit
    onewirePinDirection = 0;
    onewirePin = 0;
    __delay_us(5);
    onewirePinDirection = 1;
    __delay_us(60);
  } else {
    // Write '0' bit
    onewirePinDirection = 0;
    onewirePin = 0;
    __delay_us(70);
    onewirePinDirection = 1;
    __delay_us(2);
  }
}


void onewireWriteBit_0(int b) 
{
  //b = b & 0x01;
  if (b>0) {
    // Write '1' bit
       onewirePinDirection0 = 0;
       onewirePin0 = 0;
        __delay_us(5);
        onewirePinDirection0=1;  
      __delay_us
(60);
  } else
    
{
    // Write '0' bit
    onewirePinDirection0 = 0;
    onewirePin0 = 0;
    __delay_us(70);
    onewirePinDirection0 = 1;
    __delay_us(2);
  }
}

void onewireWriteBit_2(int b) 
{
 // b = b & 0x01;
  if (b>0) {
    // Write '1' bit
       onewirePinDirection2 = 0;
       onewirePin2 = 0;
        __delay_us(5);
        onewirePinDirection2=1;  
      __delay_us
(60);
  } else
    
{
    // Write '0' bit
    onewirePinDirection2 = 0;
   onewirePin2 = 0;
    __delay_us(70);
    onewirePinDirection2 = 1;
    __delay_us(2);
  }
}


void onewireWriteBit_1(int b) 
{
//  b = b & 0x01;
  if (b>0) {
    // Write '1' bit
       onewirePinDirection1 = 0;
       onewirePin1 = 0;
        __delay_us(5);
        onewirePinDirection1=1;  
      __delay_us
(60);
  } else
    
{
    // Write '0' bit
    onewirePinDirection1 = 0;
   onewirePin1 = 0;
    __delay_us(70);
    onewirePinDirection1 = 1;
    __delay_us(2);
  }
}


unsigned char onewireReadBit() {
  unsigned char result;

  onewirePinDirection = 0;
  onewirePin = 0;
  __delay_us(1);
  onewirePinDirection = 1;
  __delay_us(5);
  result = onewirePin;
  __delay_us(55);
  return result;

}



unsigned char onewireReadBit_0() {
  unsigned char result;

  onewirePinDirection0 = 0;
  onewirePin0 = 0;
  __delay_us(1);
  onewirePinDirection0 = 1;
  __delay_us(5);
  result = onewirePin0;
  __delay_us(55);
  return result;

}


unsigned char onewireReadBit_1() {
  unsigned char result;

  onewirePinDirection1 = 0;
  onewirePin1 = 0;
  __delay_us(1);
  onewirePinDirection1 = 1;
  __delay_us(5);
  result = onewirePin1;
  __delay_us(55);
  return result;

}


unsigned char onewireReadBit_2() {
  unsigned char result;

  onewirePinDirection2 = 0;
  onewirePin2 = 0;
  __delay_us(1);
  onewirePinDirection2 = 1;
  __delay_us(5);
  result = onewirePin2;
  __delay_us(55);
  return result;

}


unsigned char onewireInit() {
  onewirePinDirection = 0;
  onewirePin = 0;
  __delay_us(500);
  onewirePinDirection = 1;
  __delay_us(60);
  if (onewirePin == 0) {
      __delay_us(100);
      return 1;
  }
  return 0;
}

unsigned char onewireInit_0()
{
  onewirePinDirection0 = 0;
  onewirePin0 = 0;
  __delay_us(500);  // 480µS minimum!
  onewirePinDirection0 = 1;
  __delay_us(60); //15 à 60 µS
  if (onewirePin0 == 0) {
      __delay_us(100);//480µS mini
      return 1;
  }
  return 0;
}


unsigned char onewireInit_1()
{
  onewirePinDirection1 = 0;
  onewirePin1 = 0;
  __delay_us(500);  // 480µS minimum!
  onewirePinDirection1 = 1;
  __delay_us(60); //15 à 60 µS
  if (onewirePin1 == 0) {
      __delay_us(100);//480µS mini
      return 1;
  }
  return 0;
}

unsigned char onewireInit_2() {
  onewirePinDirection2 = 0;
  onewirePin2 = 0;
  __delay_us(500);
  onewirePinDirection2 = 1;
  __delay_us(60);
  if (onewirePin2 == 0) {
      __delay_us(100);
      return 1;
  }
  return 0;
}



unsigned char onewireReadByte() {
  unsigned char result = 0;
  unsigned char loop0;
  for ( loop0 = 0; loop0 < 8; loop0++) 
  
{
    // shift the result to get it ready for the next bit
    result >>= 1;
    // if result is one, then set MS bit
    if (onewireReadBit()>0)
      result |= 0x80;
  }
  return result;
}


unsigned char onewireReadByte_0() {
  unsigned char result = 0;
  unsigned char loop0;
  for ( loop0 = 0; loop0 < 8; loop0++) {
    // shift the result to get it ready for the next bit
    result >>= 1;
    // if result is one, then set MS bit
    if (onewireReadBit_0()>0)
      result |= 0x80;
  }
  return result;
}



unsigned char onewireReadByte_1() {
  unsigned char result = 0;
  unsigned char loop0;
  for ( loop0 = 0; loop0 < 8; loop0++) {
    // shift the result to get it ready for the next bit
    result >>= 1;
    // if result is one, then set MS bit
    if (onewireReadBit_1()>0)
      result |= 0x80;
  }
  return result;
}


unsigned char onewireReadByte_2() {
  unsigned char result = 0;
  unsigned char loop0;
  for ( loop0 = 0; loop0 < 8; loop0++) {
    // shift the result to get it ready for the next bit
    result >>= 1;
    // if result is one, then set MS bit
    if (onewireReadBit_2()>0)
      result |= 0x80;
  }
  return result;
}


void onewireWriteByte(char datax)
{
  // Loop to write each bit in the byte, LS-bit first
    unsigned char loop;
  for ( loop = 0; loop < 8; loop++) 
  
{
    onewireWriteBit(datax & 0x01);
    // shift the data byte for the next bit
    datax >>= 1;
  }
}

void onewireWriteByte_0(char datax)
{
  // Loop to write each bit in the byte, LS-bit first
    unsigned char loop;
  for ( loop = 0; loop < 8; loop++) 
  
{
    onewireWriteBit_0(datax & 0x01);
    // shift the data byte for the next bit
    datax >>= 1;
  }
}


void onewireWriteByte_1(char datax)
{
  // Loop to write each bit in the byte, LS-bit first
    unsigned char loop;
  for ( loop = 0; loop < 8; loop++) 
  
{
    onewireWriteBit_1(datax & 0x01);
    // shift the data byte for the next bit
    datax >>= 1;
  }
}

void onewireWriteByte_2(char datax)
{
  // Loop to write each bit in the byte, LS-bit first
    unsigned char loop;
  for ( loop = 0; loop < 8; loop++) 
  
{
    onewireWriteBit_2(datax & 0x01);
    // shift the data byte for the next bit
    datax >>= 1;
  }
}



unsigned char onewireCRC(unsigned char* addr, unsigned char len) {
  unsigned char i, j;
  unsigned char inbyte=0;
  unsigned char mix=0;
  unsigned char crc = 0;

  for (= 0; i < len; i++)
  {
    inbyte = addr[i];
    for (= 0; j < 8; j++)
    {
      mix = (crc ^ inbyte) & 0x01;
      crc >>= 1;
      if (mix) crc ^= 0x8C;
      inbyte >>= 1;
    }
  }
  return crc;
}




package :
_18F27K42_LCD_PCF8574_DS18B20_2023.zip



affichage terminal YAT 11500 bds

(5:00.775) Presentation : PIC18F27K42 + 3x OWS sensor DS18B20 sur PORT RA0,RA1,RA2)
(5:00.811) Directory :C:\MPLABX_Projects\_18F27K42_OWS_DS18B20_2023.X
(5:00.811) Project : 18F27K42_OWS_DS18B20_2023
(5:00.811) Source : main.c _2023-0416
(5:00.811) Config Internal Fosc 64MHz
(5:00.811) Autres : DS18B20_barker.h OneWire_barker.h LCD_4bits_I2C.h UART1_Functions.h
(5:00.811) Eeprom : Eeprom_PIC.h
(5:00.811) RA0,RA1,RA2=3xDS18B20,RA4=led,RA3=SQA,RC6=TX UART1
(5:00.811) RB0 interrupt pin, BP1...BP5 RB1..R5
(5:00.849) LCD 4x20 cars I2C1 HW : RC3=SCL,RC4=SDA
(5:00.849)
(5:00.849) Compile le Apr 16 2023 a 20:37:45 UTC
(5:00.849) avec version XC8 : 2360 et PACK PIC18F-K_DFP 1.6.125
(5:00.849)
(5:00.849) Init_I2C();
(5:00.849) Test presence devices sur Bus I2C1
(5:00.849) @ decimal # 78 soit @Device 7bits = 0X27 PCF8754 for LCD 2x16cars
(5:00.871)
(5:00.871)
(5:00.871) adresse LCD= 39 soit 0X27
(5:00.871)
(5:00.871) Sequence d'Init LCD 2x20 via I2C1 PCF8574
(5:00.871) .123456789A
(5:02.006) Affichage sur LCD 4x20
(5:03.247) Chargement caracteres Speciaux set #1 en CGRAM
(5:03.702) DEGREE
(5:03.910) EURO
(5:04.120) OHM
(5:04.329) PF
(5:04.538) Droite
(5:04.747) Gauche
(5:04.958) CANCEL
(5:05.166) Check.
(5:05.943)
(5:06.943)
(5:06.943)
(5:06.990) Config et Init One Wire
(5:06.990) set Resolution +-0.0625 °C sur les 3 capteurs
(5:07.394) Mesures 3 temperatures DS18B20 sur 3 bus OWS :
(5:07.403)
(5:07.403) 00000
(5:07.469) T1.INTER.= 17.875° C
(5:07.506) T2.EXTER.= 18.875 °C
(5:07.604) T3.EAU = 18.000 °C
(5:07.686)
(5:08.729) 00001
(5:08.798) T1.INTER.= 17.875° C
(5:08.834) T2.EXTER.= 18.875 °C
(5:08.930) T3.EAU = 17.750 °C
(5:09.016)
(5:10.060) 00002
(5:10.072) T1.INTER.= 17.875° C
(5:10.165) T2.EXTER.= 18.875 °C
(5:10.260) T3.EAU = 18.000 °C
(5:10.344)
(5:11.388) 00003
(5:11.399) T1.INTER.= 17.875° C
(5:11.514) T2.EXTER.= 18.875 °C
(5:11.589) T3.EAU = 18.000 °C


nota ; les durees incluent l'affichage sur terminal ET sur le LCD 4x20
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Duré d'acquisition capteur OWS DS18B20
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#16 Message par satinas » dim. 16 avr. 2023 20:59

ok tu interromps la conversion en cours, et tu t'étonnes que le datasheet n'en parle pas ?
Tu utilises les commandes standard, je ne vois pas ce qu'il y a de nouveau dans le document dont tu parles.
Pourquoi 3x750ms et pas une seule fois 750ms ?

Duré d'acquisition capteur OWS DS18B20
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#17 Message par paulfjujo » dim. 16 avr. 2023 21:02

satinas a écrit :ok tu interromps la conversion en cours, et tu t'étonnes que le datasheet n'en parle pas ?
Tu utilises les commandes standard, je ne vois pas ce qu'il y a de nouveau dans le document dont tu parles.
Pourquoi 3x750ms et pas une seule fois 750ms ?



parceque j'ai 3 bus
Aide toi, le ciel ou FantasPic t'aidera

Duré d'acquisition capteur OWS DS18B20
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#18 Message par satinas » dim. 16 avr. 2023 21:14

Pourquoi le pic ne peut pas piloter les 3 bus en même temps ?

Duré d'acquisition capteur OWS DS18B20
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#19 Message par paulfjujo » lun. 17 avr. 2023 09:18

bonjour Satinas et à tous,

ok tu interromps la conversion en cours, et tu t'étonnes que le datasheet n'en parle pas ?


Analog Device l'a fait ! Haro sur Analog Device ?
ce seraient des rigolos ?

Là tu touches le fond de mon questionnement... ( :sifflotte: et pas ailleurs !)
la datasheet ne parle que d'une duree maxi ..pas de durée mini !
pourquoi avoir un resultat coherent SANS traiter l'etat du bit fin de conversion
..meme apres seulement 10mS ?
elle a pourtant bien eu lieu cette conversion !
il faut bien admettre que la datasheet, (le constructeur) ne révele pas forcément tout .

J'attends que d'autres forumeurs fassent aussi des tests .. pour confirmer ou infirmer ce constat ( :-D amiable)

Pourquoi le pic ne peut pas piloter les 3 bus en même temps ?


je dirais en temps masqués ...
en utilisant des Masques Logiques sur les 3 bits RA0,RA1,R2 du port A
et en recuperant les 3 scratpad dans la foulée ( ..presque en meme temps) !
..oui , une bonne idée à creuser ..

j'avais fait mon programme de test en deroulement lineaire ,
un morceau de programme par sonde pour bien separer les resultats sur ecran (sequentielement) et LCD
avec eventuellement une resolution differente sur un des 3 capteurs ...
mais je vais aussi tester TON IDEE.

A+
Aide toi, le ciel ou FantasPic t'aidera

Duré d'acquisition capteur OWS DS18B20
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#20 Message par satinas » lun. 17 avr. 2023 10:38

Bonjour,
Je n'arrive pas à avoir un résultat qui change si je mets une tempo inférieure à 800ms, comment fais-tu ?
Je ne lis que les 2 premiers octets.

- start convert (CC/44)
- wait 1ms (ou 10, 50, 100, 250, 800)
- read t° (CC/BE)
- start convert
- ...

Code : Tout sélectionner

ms  température

001 0183 24.1875
001 0183 24.1875
001 0183 24.1875
010 0183 24.1875
010 0183 24.1875
010 0183 24.1875
050 0183 24.1875
050 0183 24.1875
050 0183 24.1875
100 0183 24.1875
100 0183 24.1875
100 0183 24.1875
250 0183 24.1875
250 0183 24.1875
250 0183 24.1875
800 0185 24.3125

001 0185 24.3125
001 0185 24.3125
001 0185 24.3125
010 0185 24.3125
010 0185 24.3125
010 0185 24.3125
050 0185 24.3125
050 0185 24.3125
050 0185 24.3125
100 0185 24.3125
100 0185 24.3125
100 0185 24.3125
250 0185 24.3125
250 0185 24.3125
250 0185 24.3125
800 0186 24.3750

001 0186 24.3750
001 0186 24.3750
001 0186 24.3750
010 0186 24.3750
010 0186 24.3750
010 0186 24.3750
050 0186 24.3750
050 0186 24.3750
050 0186 24.3750
100 0186 24.3750
100 0186 24.3750
100 0186 24.3750
250 0186 24.3750
250 0186 24.3750
250 0186 24.3750
800 0187 24.4375


Retourner vers « Langage C »

Qui est en ligne

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