DS1820-EM
Fork of DS1820 by
DS18B20.cpp
- Committer:
- liviur2
- Date:
- 2014-05-27
- Revision:
- 2:8e118d297c83
- Parent:
- 1:78f2fa466c55
File content as of revision 2:8e118d297c83:
#include "DS18B20.h" #include "DS1Wire.h" #include "mbed.h" #include <stdint.h> // Device byte commands over 1-wire serial enum COMMANDS { READ_ROM = 0x33, CONVERT = 0x44, READ_SCRATCHPAD = 0xBE, SKIP_ROM = 0xCC }; // device onboard register layout typedef struct { uint8_t LSB; uint8_t MSB; uint8_t Th; uint8_t Tl; uint8_t config; uint8_t reserved0xFF; uint8_t reserved0xCH; uint8_t reserved0x10; uint8_t CRC; } ScratchPad_t; DigitalOut conversionInProgress(LED4); // conversion in progress DigitalOut resetFailure(LED1); // for error reporting //extern DigitalInOut sensor; // sensor pin static void inError() { while (1) { resetFailure = !resetFailure; wait(0.2); } } void DoConversion(DigitalInOut& pin) { if (Reset(pin) != 0) { inError(); } else { conversionInProgress = 1; // led on WriteByte(pin, SKIP_ROM); // Skip ROM WriteByte(pin, CONVERT); // Convert while (ReadBit(pin) == 0) { // wait for conversion to complete } conversionInProgress = 0; // led off } } uint32_t GetTemperature(DigitalInOut &pin) { uint32_t result = 0; if (Reset(pin) != 0) { inError(); } else { ScratchPad_t scratchpad; WriteByte(pin, SKIP_ROM); // Skip ROM WriteByte(pin, READ_SCRATCHPAD); // Read Scrachpad scratchpad.LSB = ReadByte(pin); scratchpad.MSB = ReadByte(pin); Reset(pin); // terminate read as we only want temperature result = ((scratchpad.MSB << 8) | scratchpad.LSB); } return result; } ROM_Code_t ReadROM(DigitalInOut &pin) { ROM_Code_t ROM_Code; if (Reset(pin) != 0) { inError(); } else { WriteByte(pin, READ_ROM); // Read ROM for (uint32_t i = 0; i < 8; ++i) { ROM_Code.rom[i] = ReadByte(pin); } } return ROM_Code; } // temperature is store as 7.4 fixed point format (assuming 12 bit conversion) void displayTemperature(Serial& s, DigitalInOut& pin) { DoConversion(pin); uint32_t temp = GetTemperature(pin); float f = (temp & 0x0F) * 0.0625; // calculate .4 part f += (temp >> 4); // add 7.0 part to it s.printf("Temp is %2.2fC\n\r", f); // display in 2.1 format } float getTemp(DigitalInOut &pin) { DoConversion(pin); uint32_t temp = GetTemperature(pin); float f; if((temp & 0xff00)== 0xff00){ temp = ~temp + 1; f = (temp & 0x000F) * 0.0625; // calculate .4 part f += ((temp >> 4)&0x000f); // add 7.0 part to it f = -f; }else{ f = (temp & 0x000F) * 0.0625; // calculate .4 part f += (temp >> 4); // add 7.0 part to it } // s.printf("T = %x | mask = %x | %2.2f\n", temp, (temp & 0xff00), f); return f; }