Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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