![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
ibutton read with modified ds18b20 libraries
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, committed 2013-08-23
- Comitter:
- Renato
- Date:
- Fri Aug 23 08:36:59 2013 +0000
- Commit message:
- Function to read ibutton serial & family
Changed in this revision
--- /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