Has anyone simulated a DS18B20 temperature sensor with a potentiometer before? I need to do this for a project that has 5 of them running, each with its own I/O and not running on a 1-wire bus though. All of them are running in 12-bit mode too. I'm going to use another PIC to be the fake sensors but I'm not sure how to even start to get this work properly. I know I have to load an array of 9 bytes with the first two being the temperature and the last one being the CRC. The rest I don't care about because I don't look at them anyways. Any help would be greatly appreciated
Code:owout sensor,1,[$CC,$44] ' Send start temperature conversion command low RailPullUp ' Turn on transistor between rail and data pin pause 750 ' Allow enough time to process Tconv high RailPullUp ' Turn off transistor between rail and data pin owout sensor,1,[$CC,$BE] ' Send read scratch pad command owin sensor,0,[STR dq\9] ' Read all 9 bytes and store them in dq array rawtemp.Byte0 = dq[0] ' Isolate raw temperature from the rest rawtemp.Byte1 = dq[1] gosub getcrc ' Calculate the CRC of the data if sensorerror[sensor] = 1 and y < 3 then ReadDS18B20 gosub converttemp ' Convert raw data into real temps if sensorerror[sensor] = 1 then y = 0 tempc = 0 tempf = 320 signc = 3 signf = 3 endif high portb.7 high portb.6 high portb.5 goto ReadTempDone ConvertTemp: if negbit = 1 then belowzero ' If below 0ºC then goto different subroutine signc = 3 ' Display + symbol for negative temp. signf = 3 ' Display + symbol for positive temp. dummy = 625 * rawtemp ' Multiply to load internal register with 32-bit value tempc = DIV32 1000 ' Divide internal register by 10 to calculate precision ºC dummy = 0 dummy = 1125 * rawtemp ' Multiply to load internal register with 32-bit value tempf = DIV32 1000 ' Make it manageable tempf = tempf + 320 ' Make it into ºF return BelowZero: signc = 2 ' Display - symbol for negative temp. signf = 3 ' Display + symbol for positive temp. dummy = 0 rawtemp.byte0 = rawtemp.byte0 ^ 255 rawtemp.Byte1 = rawtemp.byte1 ^ 255 dummy = 625 * rawtemp + 1 ' Multiply inversion to load internal register with 32-bit value tempc = DIV32 1000 ' Divide internal register by 100 to calculate precision ºC tempf = (tempc + 5000) * 900 ' Multiply to load interal register with 32-bit value tempf = DIV32 500 ' Divide internal register by 500 if rawtemp >= 285 then ' Check if temperature is + or - ºF tempf = tempf - 12200 ' Process if temperature is to be negative signf = 2 ' Display a - symbol for negative temperature else tempf = 12200 - tempf ' Process if temperature is to be positive signf = 3 ' Display + symbol for a positive temp. endif return '------------------------ Calculate the CRC from Byte 9 ------------------------ GetCRC: for x = 0 to 7 ' Get CRC for each of the 8 bytes databyte = dq[x] ' Assign array pointer using value of x gosub CalcCRC ' Pick which method to use to get CRC value next x ' Repeat until all bytes are done if dq[8] <> crccalc then ' Do the CRC values match? sensorerror[sensor] = 1 ' Set flag indicating a problem with this sensor y = y + 1 else sensorerror[sensor] = 0 ' Set flag indicating no problem with this sensor y = 0 endif crccalc = 0 ' Reset CRC calculation variable return '--------------------- CRC Bit Calcuation Method ------------------------------- CalcCRC: for i = 0 to 7 ' Do for all 8 bits in data byte databit = crccalc.0 ^ databyte.0 ' XOR bit0 of data byte and crc databyte = databyte >> 1 ' Position data byte for next bit test if databit = 0 then Shift ' If test bit not set, just shift crc_calc crccalc = crccalc ^ $18 ' If set, account for EXOR feedback shift: ' Shift right the crc_calc byte crccalc = crccalc >> 1 ' CRC bit 0 to bit bucket crccalc.7 = databit ' Data bit rotates into CRC bit 7 next i return






Bookmarks