phil99
 Guru
 Joined: 11/02/2018 Location: AustraliaPosts: 3321 |
| Posted: 06:13am 31 May 2026 |
|
|
|
Ok, so if you don't know which DS18x20 you have these two functions should work with any, including slow ones. In the first one you can optionally set the Conversion Time in mS. Usage:- Print DS18x20ct(mm.info(pinno GPxx)) ' the default Conversion Time is 750mS or Print DS18x20ct(mm.info(pinno GPxx, mS_delay) '1000mS should cover most.
The second doesn't need it as it checks if the conversion is finished before reading. If not finished it returns to the main loop. After reading it starts a new conversion, whish happens in the background as it returns to the main loop. Usage:- Print DS18x20(mm.info(pinno GPxx))
Function DS18x20ct(PinNbr As INTEGER, Delay As INTEGER) As FLOAT ' derived from DS18x20 test code by TassyJim Local INTEGER T1,T2,T3,CpC,F OneWire WRITE PinNbr,1,1,&h33 'read "family" ROM code OneWire READ PinNbr,0,1,F ':Print F, "16=DS1820/DS18S20, 32=DS18S22, 40=DS18B20", OneWire RESET PinNbr ' reset before command OneWire WRITE PinNbr, 8, 2, &hCC, &h44 ' start conversion, adjust for slow units If Delay < 10 then Delay = 750 ' maximum normal conversion time Pause Delay OneWire RESET PinNbr ' reset before command OneWire WRITE PinNbr, 1, 2, &hCC, &hBE ' command read data OneWire READ PinNbr, 0, 8, T1,T2,T3,T3,T3,T3,T3,CpC 'get the data 'process the data If F=16 Then DS18x20ct = Str2bin(int16,Chr$(T1)+Chr$(T2))\2 -0.25 + (CpC-T3)/CpC If F=40 or F=34 Then DS18x20ct = Str2bin(int16,Chr$(T1)+Chr$(T2))/16 End Function
PinNbr = MM.Info(pinno GP7) Dim DStemp = DS18x20(PinNbr) 'purge old data and start new conversion Dim integer n
Do 'Main Loop t = timer Print n; DStemp = DS18x20(PinNbr) 'get Temp, if ready If DStemp <> 1000 Then Print Print "Temp =";DStemp;"`C" n = 0 EndIf Do : Loop until Timer > 49.9 inc n,50 Loop
Function DS18x20(PinNbr As INTEGER) As FLOAT ' Adapted from DS18x20 test code by TassyJim Local INTEGER done, T1, T2, T3, CpC, F DS18x20 = 1000 ' standard error code OneWire READ PinNbr, 4, 1, done ' is conversion finished? If done = 0 Then Exit Function ' if not return to program 'Get the data OneWire WRITE PinNbr,1,1,&h33 'read "family" ROM code OneWire READ PinNbr,0,1,F ':Print F; " 16=DS1820/DS18S20, 32=DS18S22, 40=DS18B20", OneWire RESET PinNbr ' reset before command OneWire WRITE PinNbr, 1, 2, &hCC, &hBE ' command read data OneWire READ PinNbr, 0, 8, T1,T2,T3,T3,T3,T3,T3,CpC ' get the data ' process the data If F=16 Then Value = Str2bin(int16,Chr$(T1)+Chr$(T2))\2 -0.25 + (CpC-T3)/CpC If F=40 or F=34 Then Value = Str2bin(int16,Chr$(T1)+Chr$(T2))/16 DS18x20 = Cint(Value * 10) / 10 'round to 1/10ths
'Start conversion, ready for next read OneWire RESET PinNbr ' reset before command OneWire WRITE PinNbr, 8, 2, &hCC, &h44 ' start conversion End Function End |