DS1820-EM

Fork of DS1820 by HM Yoong

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;
}