Last commit 30 Dec 2011
Description: DS1Wire simple Library
Revision 0:bfa1afd9ae98, committed 30 Dec 2011
- Comitter:
- Date:
- Fri Dec 30 19:34:53 2011 +0000
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DS18B20.cpp Fri Dec 30 19:34:53 2011 +0000
@@ -0,0 +1,90 @@
+#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() {
+ 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;
+}
+
+float getTemperature()
+{
+ DoConversion();
+ uint32_t temp = GetTemperature();
+ float f = (temp & 0x0F) * 0.0625; // calculate .4 part
+ f += (temp >> 4); // add 7.0 part to it
+ return f;
+}
+// temperature is store as 7.4 fixed point format (assuming 12 bit conversion)
+void displayTemperature(Serial& s) {
+ s.printf("Temp is %2.1fC\n\r", getTemperature()); // display in 2.1 format
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DS18B20.h Fri Dec 30 19:34:53 2011 +0000
@@ -0,0 +1,23 @@
+#ifndef _DS18B20_
+#define _DS18B20_
+
+#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[6];
+ uint8_t CRC;
+ } BYTES;
+} ROM_Code_t;
+
+ROM_Code_t ReadROM() ;
+
+// temperature is store as 7.4 fixed point format (assuming 12 bit conversion)
+void displayTemperature(Serial& s) ;
+float getTemperature();
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1Wire.cpp Fri Dec 30 19:34:53 2011 +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 Dec 30 19:34:53 2011 +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

