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...

Files at this revision

API Documentation at this revision

Comitter:
Renato
Date:
Fri Aug 23 08:36:59 2013 +0000
Commit message:
Function to read ibutton serial & family

Changed in this revision

DS1Wire.cpp Show annotated file Show diff for this revision Revisions of this file
DS1Wire.h Show annotated file Show diff for this revision Revisions of this file
ds1990.cpp Show annotated file Show diff for this revision Revisions of this file
ds1990.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1Wire.cpp	Fri Aug 23 08:36:59 2013 +0000
@@ -0,0 +1,60 @@
+#include "DS1Wire.h"
+#include "mbed.h"
+#include <stdint.h>
+
+// Timing delay for 1-wire serial standard option
+enum DELAY { A = 6, B = 64, C = 60, D = 10, E = 9, F = 55, G = 0, H = 480, I = 70, J = 410 };
+
+   
+int Reset(DigitalInOut& pin) {
+    pin.output();
+    pin = 0;    // drive bus low
+    wait_us(H);
+    pin.input(); // release bus
+    wait_us(I);
+    uint32_t result = pin;  // read bus value
+    wait_us(J);
+    return result;
+}
+
+void WriteBit(DigitalInOut& pin, uint32_t bit) {
+    pin.output();
+    if (bit) {
+        pin = 0;        // drive bus low
+        wait_us(A);        // delay A
+        pin.input();      // release bus
+        wait_us(B);        // delay B
+    } else {
+        pin = 0;    // drive bus low
+        wait_us(C);    // delay C
+        pin.input();  // release bus
+        wait_us(D);    // delay D
+    }
+}
+
+uint32_t ReadBit(DigitalInOut& pin) {
+    uint32_t bit_value;
+    pin.output();
+    pin = 0;        // drive bus low
+    wait_us(A);        // delay A
+    pin.input();      // release bus
+    wait_us(E);        // delay E
+    bit_value  = pin;    // master sample bus
+    wait_us(F);
+    return bit_value;
+}
+
+void WriteByte(DigitalInOut& pin, uint32_t byte) {
+    for (uint32_t bit = 0; bit < 8; ++bit) {
+        WriteBit(pin, byte & 0x01); // lsb to msb
+        byte >>= 1;    // right shift by 1-bit
+    }
+}
+
+uint32_t ReadByte(DigitalInOut& pin) {
+    uint32_t byte = 0;
+    for (uint32_t bit = 0; bit < 8; ++bit) {
+        byte |= (ReadBit(pin) << bit);    // Reads lsb to msb
+    }
+    return byte;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1Wire.h	Fri Aug 23 08:36:59 2013 +0000
@@ -0,0 +1,15 @@
+#ifndef __DS_1_WIRE__
+#define __DS_1_WIRE__
+#include <stdint.h>
+#include "mbed.h"
+
+int Reset(DigitalInOut& pin);
+
+void WriteBit(DigitalInOut& pin, uint32_t bit);
+uint32_t ReadBit(DigitalInOut& pin);
+
+void WriteByte(DigitalInOut& pin, uint32_t byte);
+uint32_t ReadByte(DigitalInOut& pin);
+
+
+#endif
\ No newline at end of file
--- /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
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ds1990.h	Fri Aug 23 08:36:59 2013 +0000
@@ -0,0 +1,20 @@
+#ifndef _DS1990_
+#define _DS1990_
+
+
+#include <stdint.h>
+#include "mbed.h"
+
+// Device Faimly ID and Setial number information
+typedef union {
+    uint8_t rom[8];
+    struct {
+        uint8_t    familyCode;
+        uint8_t    serialNo[8];
+        uint8_t    CRC;
+    } BYTES;
+} ROM_Code_t;
+
+ROM_Code_t ReadROM();
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Aug 23 08:36:59 2013 +0000
@@ -0,0 +1,23 @@
+#include "mbed.h"
+#include "ds1990.h"
+#include "DS1Wire.h"
+
+Serial pc(USBTX, USBRX);
+DigitalInOut sensor(p21);
+AnalogIn input(p18);
+
+
+
+int main(void){
+
+
+ROM_Code_t ROM_Code = ReadROM();
+
+
+pc.printf("Family code: 0x%X\n\r", ROM_Code.BYTES.familyCode);
+    pc.printf("Serial Number: ");
+    for (uint32_t i = 8; i != 0; --i) {
+        pc.printf("%02X%s", ROM_Code.BYTES.serialNo[i-1], (i != 1)?":":"\r\n");
+    }
+Reset();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Aug 23 08:36:59 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9c8f0e3462fb
\ No newline at end of file