bonjour à tous,
Apres avoir testé un mode 1 seul bus , 3 x DS18B20 avec gestion des ID# quasi obligatoire,
je suis passé à une solution 3 bus OWS , 1 pour chaque sonde
Si on suit la datasheet du DS18B20 , apres une requete de demande de convertion CONVER T[0x44]
on test ensuite un bit precisant la fin de conversion
pour pouvoir ensuite lirte le contenu des registres Scratchpad, qui contient entre autre la mesure de temperature sur 2 bytes ..
Tout celà fonctionne bien ..mais il faut attendre plus de 750mS ( en mode resolution 12 bits)
J'ai fait des test en mettant un delay de 485µS au lieu dudit test bit
et j'obtiens un resultat apres 103mS seulement ..
Les 3 mesures sont coherentes ...
pourquoi 485µS ... notion de Slot time reset à 480µS dans la data sheet ( donc au pif , je l'avoue!)
d'autre part on trouve
WRITE TIME SLOTS
master read 0 slot 60µS
master read 1 15µS
le plus mauvais des cas de lecture de 12 bits à 1 serait =>12 x60 .. 720µS
on est loin de l'ordre de grandeur 750mS de la data sheet ..
Je suis donc avec "un montage qui tombe en marche "
et je ne sais pas pourquoi ?
J'ai testé le mode Resolution 11 bits , avec test du bit .. 352 mS pour afficher ma mesure (coherent aussi avec la datasheet)
et aussi 103mS avec un delay au lieu du test bit ..
Avez vous déja obtenu une mesure DS18B20 avec un temps global
inferieur à celui donné par la spec scheet qui parle d'un temps MAX ...mais pas d'un temps MIN
MCU=PIC18F27K42 FOSC=64MHz interne
3 sondes DS18B20 sur RA0,RA1,RA2
la partie acquisition
la boucle principaleCode://definition de spins #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 float getTemperature1() { unsigned char i; float temperature0; unsigned char scratchPad[9] = {0,0,0,0,0,0,0,0,0}; onewireInit_0(); onewireWriteByte_0(0xCC); onewireWriteByte_0(0x44); #ifdef AVEC_TEMPO __delay_us(485); #else // 780mS avec le test bit ci dessous while (1) { if (onewireReadBit_0()) // au moins 1 capteur connecté break; } #endif onewireInit_0(); onewireWriteByte_0(0xCC); onewireWriteByte_0(0xBE); for (i = 0; i < 2; i++) scratchPad[i] = onewireReadByte_0(); onewireInit_0(); temperature0 = ((scratchPad[1] * 256) + scratchPad[0])*0.0625; return temperature0; }
Code:i=0; CPrint(" Mesures 3 temperatures DS18B20 sur 3 bus OWS : \r\n"); CRLF1(); do { sprintf(txt," %05d\r\n",i); Print(txt); F1= getTemperature1(); sprintf(txt," T1.INTER.= %5.3f%c C",F1,176); Print(txt);CRLF1(); sprintf(CRam1,"%3.2f C",F1); LCD_Write_Text_At(1,12,CRam1); LCD_Chr_At(1,17,0); // degre C F2= getTemperature2(); sprintf(txt," T2.EXTER.= %5.3f %cC",F2,176); Print(txt);CRLF1(); sprintf(CRam1,"%3.2f C",F2); LCD_Write_Text_At(2,12,CRam1); LCD_Chr_At(2,17,0); // degre C F3= getTemperature3(); sprintf(txt," T3.EAU = %5.3f %cC\r\n",F3,176); Print(txt); sprintf(CRam1,"%3.2f C",F3); LCD_Write_Text_At(3,12,CRam1); LCD_Chr_At(3,17,0); // degre C CRLF1(); __asm("btg LATA,4"); // LED_Rouge i++; } while (1);
Nouveaux tests en mode 11 bits +-0,125°C
AVEC Tempo apres requete 0x44
#define AVEC_TEMPO
10 series de 3 mesures
14:18:25:961 - 14:18:22805 = 3,1sec
103mS par mesure ( incluant l'afichage Terminal + affichage LCD)
(14:18:22.805) 00400
(14:18:22.805) T1.INTER.= 17.875° C
(14:18:22.891) T2.EXTER.= 19.125 °C
(14:18:22.986) T3.EAU = 17.750 °C
(14:18:23.072)
(14:18:23.099) 00401
(14:18:23.099) T1.INTER.= 17.875° C
(14:18:23.181) T2.EXTER.= 19.125 °C
(14:18:23.275) T3.EAU = 17.750 °C
(14:18:23.361)
... etc ...
(14:18:25.426) 00409
(14:18:25.426) T1.INTER.= 17.875° C
(14:18:25.491) T2.EXTER.= 19.125 °C
(14:18:25.586) T3.EAU = 17.750 °C
(14:18:25.672)
(14:18:25.721) 00410
(14:18:25.721) T1.INTER.= 17.875° C
(14:18:25.782) T2.EXTER.= 19.125 °C
(14:18:25.876) T3.EAU = 17.750 °C
(14:18:25.961)
le mem test tests en mode 11 bits +-0,125°C
avec //#define AVEC_TEMPO
donc avec le test bit apres requete 0x44
10 series de 3 mesures
14:23:38.810 - 14:23:28.229 =10,58 sec
donc 0.352 sec par mesure ( incluant l'afichage Terminal + affichage LCD)
(14:23:28.229) 00010
(14:23:28.541) T1.INTER.= 17.875° C
(14:23:28.986) T2.EXTER.= 19.250 °C
(14:23:29.082) T3.EAU = 17.750 °C
(14:23:29.166)
(14:23:29.195) 00011
(14:23:29.506) T1.INTER.= 17.875° C
(14:23:29.950) T2.EXTER.= 19.250 °C
(14:23:30.045) T3.EAU = 17.750 °C
(14:23:30.131)
... etc .....
(14:23:36.911) 00019
(14:23:37.221) T1.INTER.= 17.875° C
(14:23:37.665) T2.EXTER.= 19.250 °C
(14:23:37.760) T3.EAU = 17.750 °C
(14:23:37.846)
(14:23:37.874) 00020
(14:23:38.185) T1.INTER.= 17.875° C
(14:23:38.631) T2.EXTER.= 19.250 °C
(14:23:38.724) T3.EAU = 17.750 °C
(14:23:38.810)
-----