Backing up an unused program in case of future need

Dependencies:   mbed

Committer:
andrewboyson
Date:
Tue May 31 07:35:28 2016 +0000
Revision:
6:be97d38e0b01
Parent:
5:6226f3c566ef
Child:
7:024ace6d943c
Moved to wait_us for delays below 100us and timer.read_us above. This replaced interrupts which worked but tended to be unreliable.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 6:be97d38e0b01 1 #include "mbed.h"
andrewboyson 6:be97d38e0b01 2 #include "1-wire.h"
andrewboyson 6:be97d38e0b01 3 #include "log.h"
andrewboyson 6:be97d38e0b01 4 #include "io.h"
andrewboyson 6:be97d38e0b01 5 #include "wifi.h"
andrewboyson 6:be97d38e0b01 6 #include "ds18b20.h"
andrewboyson 6:be97d38e0b01 7
andrewboyson 6:be97d38e0b01 8 #define DEVICE_MAX 4
andrewboyson 6:be97d38e0b01 9 #define SCAN_PERIOD_SECS 2.0
andrewboyson 4:e076884ef8bd 10
andrewboyson 4:e076884ef8bd 11 static Ticker ticker;
andrewboyson 6:be97d38e0b01 12 #define SEND_BUFFER_LENGTH 10
andrewboyson 4:e076884ef8bd 13 #define RECV_BUFFER_LENGTH 10
andrewboyson 4:e076884ef8bd 14 static char send[SEND_BUFFER_LENGTH];
andrewboyson 4:e076884ef8bd 15 static char recv[RECV_BUFFER_LENGTH];
andrewboyson 4:e076884ef8bd 16 static int sendlen = 0;
andrewboyson 4:e076884ef8bd 17 static int recvlen = 0;
andrewboyson 4:e076884ef8bd 18
andrewboyson 6:be97d38e0b01 19 int DS18B20DeviceCount = 0;
andrewboyson 6:be97d38e0b01 20 char DS18B20DeviceList[DEVICE_MAX * 8];
andrewboyson 6:be97d38e0b01 21 int16_t DS18B20Value[DEVICE_MAX];
andrewboyson 5:6226f3c566ef 22
andrewboyson 6:be97d38e0b01 23 int16_t DS18B20ValueFromRom(char* rom)
andrewboyson 6:be97d38e0b01 24 {
andrewboyson 6:be97d38e0b01 25 for (int device = 0; device < DS18B20DeviceCount; device++) if (memcmp(DS18B20DeviceList + 8 * device, rom, 8) == 0) return DS18B20Value[device];
andrewboyson 6:be97d38e0b01 26 return DS18B20_ERROR_NOT_FOUND;
andrewboyson 6:be97d38e0b01 27 }
andrewboyson 6:be97d38e0b01 28 char rom[8];
andrewboyson 6:be97d38e0b01 29 int allRomsFound = false;
andrewboyson 6:be97d38e0b01 30 static void searchRom(int first)
andrewboyson 4:e076884ef8bd 31 {
andrewboyson 4:e076884ef8bd 32 sendlen = 1;
andrewboyson 6:be97d38e0b01 33 send[0] = 0xF0; //Search Rom
andrewboyson 6:be97d38e0b01 34 recvlen = 0;
andrewboyson 6:be97d38e0b01 35 for (int i = 0; i < recvlen; i++) recv[i] = 0;
andrewboyson 6:be97d38e0b01 36 if (first) OneWireSearch(send[0], rom, &allRomsFound);
andrewboyson 6:be97d38e0b01 37 else OneWireSearch(send[0], NULL, NULL);
andrewboyson 4:e076884ef8bd 38 }
andrewboyson 6:be97d38e0b01 39 static void readScratchpad(int device)
andrewboyson 5:6226f3c566ef 40 {
andrewboyson 6:be97d38e0b01 41 sendlen = 10;
andrewboyson 6:be97d38e0b01 42 send[0] = 0x55; //Match Rom
andrewboyson 6:be97d38e0b01 43 for (int i = 0; i < 8; i++) send[i+1] = DS18B20DeviceList[device * 8 + i];
andrewboyson 6:be97d38e0b01 44 send[9] = 0xBE; //Read Scratchpad
andrewboyson 4:e076884ef8bd 45 recvlen = 9;
andrewboyson 5:6226f3c566ef 46 for (int i = 0; i < recvlen; i++) recv[i] = 0;
andrewboyson 4:e076884ef8bd 47 OneWireExchange(sendlen, recvlen, send, recv, 0);
andrewboyson 4:e076884ef8bd 48 }
andrewboyson 6:be97d38e0b01 49 static void convertT()
andrewboyson 4:e076884ef8bd 50 {
andrewboyson 4:e076884ef8bd 51 sendlen = 2;
andrewboyson 6:be97d38e0b01 52 send[0] = 0xCC; //Skip Rom
andrewboyson 6:be97d38e0b01 53 send[1] = 0x44; //Convert T
andrewboyson 4:e076884ef8bd 54 recvlen = 0;
andrewboyson 5:6226f3c566ef 55 for (int i = 0; i < recvlen; i++) recv[i] = 0;
andrewboyson 4:e076884ef8bd 56 OneWireExchange(sendlen, recvlen, send, recv, 750);
andrewboyson 4:e076884ef8bd 57 }
andrewboyson 5:6226f3c566ef 58 #define IDLE 0
andrewboyson 6:be97d38e0b01 59 #define LIST_FIRST_DEVICE 1
andrewboyson 6:be97d38e0b01 60 #define LIST_NEXT_DEVICE 2
andrewboyson 6:be97d38e0b01 61 #define CONVERT_T 3
andrewboyson 6:be97d38e0b01 62 #define READ_SCRATCH_PAD 4
andrewboyson 6:be97d38e0b01 63 #define EXTRACT_TEMPERATURE 5
andrewboyson 6:be97d38e0b01 64 static volatile int state = IDLE;
andrewboyson 6:be97d38e0b01 65 int DS18B20Busy() { return state; }
andrewboyson 5:6226f3c566ef 66 static int handlestate()
andrewboyson 4:e076884ef8bd 67 {
andrewboyson 5:6226f3c566ef 68 if (OneWireBusy()) return 0;
andrewboyson 6:be97d38e0b01 69 static int device;
andrewboyson 5:6226f3c566ef 70 switch (state)
andrewboyson 5:6226f3c566ef 71 {
andrewboyson 5:6226f3c566ef 72 case IDLE:
andrewboyson 5:6226f3c566ef 73 break;
andrewboyson 6:be97d38e0b01 74 case LIST_FIRST_DEVICE:
andrewboyson 6:be97d38e0b01 75 device = 0;
andrewboyson 6:be97d38e0b01 76 searchRom(true);
andrewboyson 6:be97d38e0b01 77 state = LIST_NEXT_DEVICE;
andrewboyson 5:6226f3c566ef 78 break;
andrewboyson 6:be97d38e0b01 79 case LIST_NEXT_DEVICE:
andrewboyson 6:be97d38e0b01 80 if (OneWireResult())
andrewboyson 6:be97d38e0b01 81 {
andrewboyson 6:be97d38e0b01 82 state = IDLE;
andrewboyson 6:be97d38e0b01 83 }
andrewboyson 6:be97d38e0b01 84 else
andrewboyson 5:6226f3c566ef 85 {
andrewboyson 6:be97d38e0b01 86 for (int i = 0; i < 8; i++) DS18B20DeviceList[8 * device + i] = rom[i];
andrewboyson 6:be97d38e0b01 87 device++;
andrewboyson 6:be97d38e0b01 88 if (allRomsFound || device >= DEVICE_MAX)
andrewboyson 6:be97d38e0b01 89 {
andrewboyson 6:be97d38e0b01 90 DS18B20DeviceCount = device;
andrewboyson 6:be97d38e0b01 91 state = CONVERT_T;
andrewboyson 6:be97d38e0b01 92 }
andrewboyson 6:be97d38e0b01 93 else
andrewboyson 6:be97d38e0b01 94 {
andrewboyson 6:be97d38e0b01 95 searchRom(false);
andrewboyson 6:be97d38e0b01 96 }
andrewboyson 6:be97d38e0b01 97 }
andrewboyson 6:be97d38e0b01 98 break;
andrewboyson 6:be97d38e0b01 99 case CONVERT_T:
andrewboyson 6:be97d38e0b01 100 if (OneWireResult())
andrewboyson 6:be97d38e0b01 101 {
andrewboyson 6:be97d38e0b01 102 state = IDLE;
andrewboyson 5:6226f3c566ef 103 }
andrewboyson 5:6226f3c566ef 104 else
andrewboyson 5:6226f3c566ef 105 {
andrewboyson 6:be97d38e0b01 106 convertT();
andrewboyson 6:be97d38e0b01 107 device = 0;
andrewboyson 6:be97d38e0b01 108 state = READ_SCRATCH_PAD;
andrewboyson 6:be97d38e0b01 109 }
andrewboyson 6:be97d38e0b01 110 break;
andrewboyson 6:be97d38e0b01 111 case READ_SCRATCH_PAD:
andrewboyson 6:be97d38e0b01 112 if (OneWireResult())
andrewboyson 6:be97d38e0b01 113 {
andrewboyson 6:be97d38e0b01 114 state = IDLE;
andrewboyson 6:be97d38e0b01 115 }
andrewboyson 6:be97d38e0b01 116 else
andrewboyson 6:be97d38e0b01 117 {
andrewboyson 6:be97d38e0b01 118 readScratchpad(device);
andrewboyson 6:be97d38e0b01 119 state = EXTRACT_TEMPERATURE;
andrewboyson 5:6226f3c566ef 120 }
andrewboyson 6:be97d38e0b01 121 break;
andrewboyson 6:be97d38e0b01 122 case EXTRACT_TEMPERATURE:
andrewboyson 6:be97d38e0b01 123 switch (OneWireResult())
andrewboyson 6:be97d38e0b01 124 {
andrewboyson 6:be97d38e0b01 125 case ONE_WIRE_RESULT_OK:
andrewboyson 6:be97d38e0b01 126 DS18B20Value[device] = recv[1];
andrewboyson 6:be97d38e0b01 127 DS18B20Value[device] <<= 8;
andrewboyson 6:be97d38e0b01 128 DS18B20Value[device] |= recv[0];
andrewboyson 6:be97d38e0b01 129 break;
andrewboyson 6:be97d38e0b01 130 case ONE_WIRE_RESULT_CRC_ERROR: DS18B20Value[device] = DS18B20_ERROR_CRC; break;
andrewboyson 6:be97d38e0b01 131 case ONE_WIRE_RESULT_NO_DEVICE_PRESENT: DS18B20Value[device] = DS18B20_ERROR_NO_DEVICE_PRESENT; break;
andrewboyson 6:be97d38e0b01 132 case ONE_WIRE_RESULT_TIMED_OUT: DS18B20Value[device] = DS18B20_ERROR_TIMED_OUT; break;
andrewboyson 6:be97d38e0b01 133 case ONE_WIRE_RESULT_NO_DEVICE_PARTICIPATING: DS18B20Value[device] = DS18B20_ERROR_NO_DEVICE_PARTICIPATING; break;
andrewboyson 6:be97d38e0b01 134 default:
andrewboyson 6:be97d38e0b01 135 LogF("Unknown OneWireResult %d\r\n", OneWireResult());
andrewboyson 6:be97d38e0b01 136 break;
andrewboyson 6:be97d38e0b01 137 }
andrewboyson 6:be97d38e0b01 138 device++;
andrewboyson 6:be97d38e0b01 139 if (device < DS18B20DeviceCount) state = READ_SCRATCH_PAD;
andrewboyson 6:be97d38e0b01 140 else state = IDLE;
andrewboyson 5:6226f3c566ef 141 break;
andrewboyson 5:6226f3c566ef 142 default:
andrewboyson 5:6226f3c566ef 143 LogF("Unknown DS18B20 state %d\r\n", state);
andrewboyson 5:6226f3c566ef 144 return -1;
andrewboyson 5:6226f3c566ef 145 }
andrewboyson 4:e076884ef8bd 146 return 0;
andrewboyson 4:e076884ef8bd 147 }
andrewboyson 5:6226f3c566ef 148 static void logcomms()
andrewboyson 4:e076884ef8bd 149 {
andrewboyson 4:e076884ef8bd 150 static int wasbusy = false;
andrewboyson 4:e076884ef8bd 151 if (!OneWireBusy() && wasbusy)
andrewboyson 4:e076884ef8bd 152 {
andrewboyson 4:e076884ef8bd 153 LogF("1-wire | send:");
andrewboyson 4:e076884ef8bd 154 for (int i = 0; i < sendlen; i++) LogF(" %02x", send[i]);
andrewboyson 4:e076884ef8bd 155 LogF(" | recv:");
andrewboyson 4:e076884ef8bd 156 for (int i = 0; i < recvlen; i++) LogF(" %02x", recv[i]);
andrewboyson 4:e076884ef8bd 157 LogF("\r\n");
andrewboyson 4:e076884ef8bd 158 }
andrewboyson 4:e076884ef8bd 159 wasbusy = OneWireBusy();
andrewboyson 5:6226f3c566ef 160 }
andrewboyson 5:6226f3c566ef 161 static void timed()
andrewboyson 5:6226f3c566ef 162 {
andrewboyson 6:be97d38e0b01 163 state = LIST_FIRST_DEVICE;
andrewboyson 5:6226f3c566ef 164 }
andrewboyson 5:6226f3c566ef 165 int DS18B20Init()
andrewboyson 5:6226f3c566ef 166 {
andrewboyson 6:be97d38e0b01 167 ticker.attach(&timed, SCAN_PERIOD_SECS);
andrewboyson 5:6226f3c566ef 168 return 0;
andrewboyson 5:6226f3c566ef 169 }
andrewboyson 5:6226f3c566ef 170 int DS18B20Main()
andrewboyson 5:6226f3c566ef 171 {
andrewboyson 5:6226f3c566ef 172 logcomms();
andrewboyson 5:6226f3c566ef 173
andrewboyson 5:6226f3c566ef 174 int r = handlestate();
andrewboyson 5:6226f3c566ef 175
andrewboyson 5:6226f3c566ef 176 if (r) return -1;
andrewboyson 5:6226f3c566ef 177
andrewboyson 4:e076884ef8bd 178 return 0;
andrewboyson 4:e076884ef8bd 179 }