ibutton read with modified ds18b20 libraries

Dependencies:   mbed

Due to the lack of programs for ibutton interfacing with mbed, i built this one (still needs a lot of development), it's in a very basic state, but i'm working on it...

Revision:
0:4f399e4b64a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ds1990.cpp	Fri Aug 23 08:36:59 2013 +0000
@@ -0,0 +1,87 @@
+#include "ds1990.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() {
+    if (Reset(sensor) != 0) {
+        inError();
+    } else {
+        conversionInProgress = 1;       // led on
+        WriteByte(sensor, SKIP_ROM);            // Skip ROM
+        WriteByte(sensor, CONVERT);             // Convert
+        while (ReadBit(sensor) == 0) {
+            // wait for conversion to complete
+        }
+        conversionInProgress = 0;       // led off
+    }
+}
+
+uint32_t GetTemperature() {
+    uint32_t result = 0;
+    if (Reset(sensor) != 0) {
+        inError();
+    } else {
+        ScratchPad_t scratchpad;
+        WriteByte(sensor, SKIP_ROM);    // Skip ROM
+        WriteByte(sensor, READ_SCRATCHPAD);    // Read Scrachpad
+        scratchpad.LSB = ReadByte(sensor);
+        scratchpad.MSB = ReadByte(sensor);
+        Reset(sensor);    // terminate read as we only want temperature
+        result = ((scratchpad.MSB << 8) | scratchpad.LSB);
+    }
+    return result;
+}
+
+ROM_Code_t ReadROM() {
+    ROM_Code_t ROM_Code;
+    if (Reset(sensor) != 0) {
+        inError();
+    } else {
+        
+        WriteByte(sensor, READ_ROM);    // Read ROM
+        for (uint32_t i = 0; i < 8; ++i) {
+            ROM_Code.rom[i] = ReadByte(sensor);
+        }
+    }
+    return ROM_Code;
+}
+
+// temperature is store as 7.4 fixed point format (assuming 12 bit conversion)
+void showTemperature(float *f) {
+    DoConversion();
+    uint32_t temp = GetTemperature();
+    *f = (temp & 0x0F) * 0.0625;    // calculate .4 part
+    *f += (temp >> 4);    // add 7.0 part to it
+    //return(f);
+    //s.printf("Temp is %2.1fC\n\r", f);    // display in 2.1 format
+}