Andrew Boyson
/
iot
Backing up an unused program in case of future need
ds18b20.cpp@6:be97d38e0b01, 2016-05-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |