Revision 0:03ec282c2908, committed 2010-01-29
- Comitter:
- feabhas
- Date:
- Fri Jan 29 19:01:56 2010 +0000
- Commit message:
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DS18B20.cpp Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,86 @@
+#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;
+}
+
+// temperature is store as 7.4 fixed point format (assuming 12 bit conversion)
+void displayTemperature(Serial& s) {
+ DoConversion();
+ uint32_t temp = GetTemperature();
+ float f = (temp & 0x0F) * 0.0625; // calculate .4 part
+ f += (temp >> 4); // add 7.0 part to it
+ 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/DS18B20.h Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,22 @@
+#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) ;
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1Wire.cpp Fri Jan 29 19:01:56 2010 +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 Jan 29 19:01:56 2010 +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/main.cpp Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,29 @@
+#include "mbed.h"
+#include <stdint.h>
+#include "DS18B20.h"
+
+DigitalInOut sensor(p5); // sensor connected to pin 5
+
+Ticker timer; // used for our microsec timing
+Serial pc(USBTX, USBRX); // serial comms over usb back to console
+
+int main() {
+ pc.printf("\n\r=====================================================\n\r");
+ pc.printf("DS18B20 Configuration\n\r");
+ sensor.mode(PullUp);
+
+ 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 = 6; i != 0; --i) {
+ pc.printf("%02X%s", ROM_Code.BYTES.serialNo[i-1], (i != 1)?":":"\r\n");
+ }
+ pc.printf("CRC: 0x%X\r\n", ROM_Code.BYTES.CRC);
+
+ pc.printf("\n\rRunning temperature conversion...\n\r");
+ while (1) {
+ displayTemperature(pc);
+ wait(10);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld Fri Jan 29 19:01:56 2010 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/49a220cc26e0