Dallas / Maxim DS1820 1-Wire library. For communication with multiple DS1820 on a single 1-Wire bus. Also supports DS18S20 and DS18B20.

Fork of DS1820 by Michael Hagberg

Committer:
qonico
Date:
Thu Nov 17 21:03:47 2016 +0000
Revision:
4:f8128bb8bef1
Parent:
3:c8d0a2bb2987
Fix CRC case error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
qonico 3:c8d0a2bb2987 1 #include "DS1820.h"
qonico 3:c8d0a2bb2987 2 #include "mbed.h"
qonico 3:c8d0a2bb2987 3
qonico 3:c8d0a2bb2987 4 // Global variables shared between all DS1820 objects
qonico 3:c8d0a2bb2987 5 bool DS1820_done_flag;
qonico 3:c8d0a2bb2987 6 int DS1820_last_descrepancy;
qonico 3:c8d0a2bb2987 7 char DS1820_search_ROM[8];
qonico 3:c8d0a2bb2987 8
qonico 3:c8d0a2bb2987 9
qonico 3:c8d0a2bb2987 10 DS1820::DS1820 (PinName data_pin, PinName power_pin) : _datapin(data_pin), _parasitepin(power_pin) {
qonico 3:c8d0a2bb2987 11 int byte_counter;
qonico 3:c8d0a2bb2987 12 _parasite_power = true;
qonico 3:c8d0a2bb2987 13 for(byte_counter=0;byte_counter<8;byte_counter++)
qonico 3:c8d0a2bb2987 14 ROM[byte_counter] = 0xFF;
qonico 3:c8d0a2bb2987 15 for(byte_counter=0;byte_counter<9;byte_counter++)
qonico 3:c8d0a2bb2987 16 RAM[byte_counter] = 0x00;
qonico 3:c8d0a2bb2987 17 }
qonico 3:c8d0a2bb2987 18 DS1820::DS1820 (PinName data_pin) : _datapin(data_pin), _parasitepin(NC) {
qonico 3:c8d0a2bb2987 19 int byte_counter;
qonico 3:c8d0a2bb2987 20 _parasite_power = false;
qonico 3:c8d0a2bb2987 21 for(byte_counter=0;byte_counter<8;byte_counter++)
qonico 3:c8d0a2bb2987 22 ROM[byte_counter] = 0xFF;
qonico 3:c8d0a2bb2987 23 for(byte_counter=0;byte_counter<9;byte_counter++)
qonico 3:c8d0a2bb2987 24 RAM[byte_counter] = 0x00;
qonico 3:c8d0a2bb2987 25 }
qonico 3:c8d0a2bb2987 26
qonico 3:c8d0a2bb2987 27 bool DS1820::onewire_reset() {
qonico 3:c8d0a2bb2987 28 // This will return false if no devices are present on the data bus
qonico 3:c8d0a2bb2987 29 bool presence=false;
qonico 3:c8d0a2bb2987 30 _datapin.output();
qonico 3:c8d0a2bb2987 31 _datapin = 0; // bring low for 500 us
qonico 3:c8d0a2bb2987 32 wait_us(500);
qonico 3:c8d0a2bb2987 33 _datapin.input(); // let the data line float high
qonico 3:c8d0a2bb2987 34 wait_us(90); // wait 90us
qonico 3:c8d0a2bb2987 35 if (_datapin.read()==0) // see if any devices are pulling the data line low
qonico 3:c8d0a2bb2987 36 presence=true;
qonico 3:c8d0a2bb2987 37 wait_us(410);
qonico 3:c8d0a2bb2987 38 return presence;
qonico 3:c8d0a2bb2987 39 }
qonico 3:c8d0a2bb2987 40
qonico 3:c8d0a2bb2987 41 void DS1820::onewire_bit_out (bool bit_data) {
qonico 3:c8d0a2bb2987 42 _datapin.output();
qonico 3:c8d0a2bb2987 43 _datapin = 0;
qonico 3:c8d0a2bb2987 44 wait_us(5);
qonico 3:c8d0a2bb2987 45 if (bit_data) {
qonico 3:c8d0a2bb2987 46 _datapin.input(); // bring data line high
qonico 3:c8d0a2bb2987 47 wait_us(55);
qonico 3:c8d0a2bb2987 48 } else {
qonico 3:c8d0a2bb2987 49 wait_us(55); // keep data line low
qonico 3:c8d0a2bb2987 50 _datapin.input();
qonico 3:c8d0a2bb2987 51 }
qonico 3:c8d0a2bb2987 52 }
qonico 3:c8d0a2bb2987 53
qonico 3:c8d0a2bb2987 54 void DS1820::onewire_byte_out(char data) { // output data character (least sig bit first).
qonico 3:c8d0a2bb2987 55 int n;
qonico 3:c8d0a2bb2987 56 for (n=0; n<8; n++) {
qonico 3:c8d0a2bb2987 57 onewire_bit_out(data & 0x01);
qonico 3:c8d0a2bb2987 58 data = data >> 1; // now the next bit is in the least sig bit position.
qonico 3:c8d0a2bb2987 59 }
qonico 3:c8d0a2bb2987 60 }
qonico 3:c8d0a2bb2987 61
qonico 3:c8d0a2bb2987 62 bool DS1820::onewire_bit_in() {
qonico 3:c8d0a2bb2987 63 bool answer;
qonico 3:c8d0a2bb2987 64 _datapin.output();
qonico 3:c8d0a2bb2987 65 _datapin = 0;
qonico 3:c8d0a2bb2987 66 wait_us(5);
qonico 3:c8d0a2bb2987 67 _datapin.input();
qonico 3:c8d0a2bb2987 68 wait_us(5);
qonico 3:c8d0a2bb2987 69 answer = _datapin.read();
qonico 3:c8d0a2bb2987 70 wait_us(50);
qonico 3:c8d0a2bb2987 71 return answer;
qonico 3:c8d0a2bb2987 72 }
qonico 3:c8d0a2bb2987 73
qonico 3:c8d0a2bb2987 74 char DS1820::onewire_byte_in() { // read byte, least sig byte first
qonico 3:c8d0a2bb2987 75 char answer = 0x00;
qonico 3:c8d0a2bb2987 76 int i;
qonico 3:c8d0a2bb2987 77 for (i=0; i<8; i++) {
qonico 3:c8d0a2bb2987 78 answer = answer >> 1; // shift over to make room for the next bit
qonico 3:c8d0a2bb2987 79 if (onewire_bit_in())
qonico 3:c8d0a2bb2987 80 answer = answer | 0x80; // if the data port is high, make this bit a 1
qonico 3:c8d0a2bb2987 81 }
qonico 3:c8d0a2bb2987 82 return answer;
qonico 3:c8d0a2bb2987 83 }
qonico 3:c8d0a2bb2987 84
qonico 3:c8d0a2bb2987 85 bool DS1820::search_ROM() {
qonico 3:c8d0a2bb2987 86 return search_ROM_routine(0xF0); // Search ROM command
qonico 3:c8d0a2bb2987 87 }
qonico 3:c8d0a2bb2987 88
qonico 3:c8d0a2bb2987 89 bool DS1820::search_alarm() {
qonico 3:c8d0a2bb2987 90 return search_ROM_routine(0xEC); // Search Alarm command
qonico 3:c8d0a2bb2987 91 }
qonico 3:c8d0a2bb2987 92
qonico 3:c8d0a2bb2987 93 bool DS1820::search_ROM_routine(char command) {
qonico 3:c8d0a2bb2987 94 extern bool DS1820_done_flag;
qonico 3:c8d0a2bb2987 95 extern int DS1820_last_descrepancy;
qonico 3:c8d0a2bb2987 96 extern char DS1820_search_ROM[8];
qonico 3:c8d0a2bb2987 97 int descrepancy_marker, ROM_bit_index;
qonico 3:c8d0a2bb2987 98 bool return_value, Bit_A, Bit_B;
qonico 3:c8d0a2bb2987 99 char byte_counter, bit_mask;
qonico 3:c8d0a2bb2987 100
qonico 3:c8d0a2bb2987 101 return_value=false;
qonico 3:c8d0a2bb2987 102 if (!DS1820_done_flag) {
qonico 3:c8d0a2bb2987 103 if (!onewire_reset()) {
qonico 3:c8d0a2bb2987 104 DS1820_last_descrepancy = 0; // no devices present
qonico 3:c8d0a2bb2987 105 } else {
qonico 3:c8d0a2bb2987 106 ROM_bit_index=1;
qonico 3:c8d0a2bb2987 107 descrepancy_marker=0;
qonico 3:c8d0a2bb2987 108 onewire_byte_out(command); // Search ROM command or Search Alarm command
qonico 3:c8d0a2bb2987 109 byte_counter = 0;
qonico 3:c8d0a2bb2987 110 bit_mask = 0x01;
qonico 3:c8d0a2bb2987 111 while (ROM_bit_index<=64) {
qonico 3:c8d0a2bb2987 112 Bit_A = onewire_bit_in();
qonico 3:c8d0a2bb2987 113 Bit_B = onewire_bit_in();
qonico 3:c8d0a2bb2987 114 if (Bit_A & Bit_B) {
qonico 3:c8d0a2bb2987 115 descrepancy_marker = 0; // data read error, this should never happen
qonico 3:c8d0a2bb2987 116 ROM_bit_index = 0xFF;
qonico 3:c8d0a2bb2987 117 } else {
qonico 3:c8d0a2bb2987 118 if (Bit_A | Bit_B) {
qonico 3:c8d0a2bb2987 119 // Set ROM bit to Bit_A
qonico 3:c8d0a2bb2987 120 if (Bit_A) {
qonico 3:c8d0a2bb2987 121 DS1820_search_ROM[byte_counter] = DS1820_search_ROM[byte_counter] | bit_mask; // Set ROM bit to one
qonico 3:c8d0a2bb2987 122 } else {
qonico 3:c8d0a2bb2987 123 DS1820_search_ROM[byte_counter] = DS1820_search_ROM[byte_counter] & ~bit_mask; // Set ROM bit to zero
qonico 3:c8d0a2bb2987 124 }
qonico 3:c8d0a2bb2987 125 } else {
qonico 3:c8d0a2bb2987 126 // both bits A and B are low, so there are two or more devices present
qonico 3:c8d0a2bb2987 127 if ( ROM_bit_index == DS1820_last_descrepancy ) {
qonico 3:c8d0a2bb2987 128 DS1820_search_ROM[byte_counter] = DS1820_search_ROM[byte_counter] | bit_mask; // Set ROM bit to one
qonico 3:c8d0a2bb2987 129 } else {
qonico 3:c8d0a2bb2987 130 if ( ROM_bit_index > DS1820_last_descrepancy ) {
qonico 3:c8d0a2bb2987 131 DS1820_search_ROM[byte_counter] = DS1820_search_ROM[byte_counter] & ~bit_mask; // Set ROM bit to zero
qonico 3:c8d0a2bb2987 132 descrepancy_marker = ROM_bit_index;
qonico 3:c8d0a2bb2987 133 } else {
qonico 3:c8d0a2bb2987 134 if (( DS1820_search_ROM[byte_counter] & bit_mask) == 0x00 )
qonico 3:c8d0a2bb2987 135 descrepancy_marker = ROM_bit_index;
qonico 3:c8d0a2bb2987 136 }
qonico 3:c8d0a2bb2987 137 }
qonico 3:c8d0a2bb2987 138 }
qonico 3:c8d0a2bb2987 139 onewire_bit_out (DS1820_search_ROM[byte_counter] & bit_mask);
qonico 3:c8d0a2bb2987 140 ROM_bit_index++;
qonico 3:c8d0a2bb2987 141 if (bit_mask & 0x80) {
qonico 3:c8d0a2bb2987 142 byte_counter++;
qonico 3:c8d0a2bb2987 143 bit_mask = 0x01;
qonico 3:c8d0a2bb2987 144 } else {
qonico 3:c8d0a2bb2987 145 bit_mask = bit_mask << 1;
qonico 3:c8d0a2bb2987 146 }
qonico 3:c8d0a2bb2987 147 }
qonico 3:c8d0a2bb2987 148 }
qonico 3:c8d0a2bb2987 149 DS1820_last_descrepancy = descrepancy_marker;
qonico 3:c8d0a2bb2987 150 if (ROM_bit_index != 0xFF) {
qonico 3:c8d0a2bb2987 151 for(byte_counter=0;byte_counter<8;byte_counter++)
qonico 3:c8d0a2bb2987 152 ROM[byte_counter] = DS1820_search_ROM[byte_counter];
qonico 3:c8d0a2bb2987 153 return_value = true;
qonico 3:c8d0a2bb2987 154 }
qonico 3:c8d0a2bb2987 155 }
qonico 3:c8d0a2bb2987 156 if (DS1820_last_descrepancy == 0)
qonico 3:c8d0a2bb2987 157 DS1820_done_flag = true;
qonico 3:c8d0a2bb2987 158 }
qonico 3:c8d0a2bb2987 159 return return_value;
qonico 3:c8d0a2bb2987 160 }
qonico 3:c8d0a2bb2987 161
qonico 3:c8d0a2bb2987 162 void DS1820::search_ROM_setup() {
qonico 3:c8d0a2bb2987 163 extern bool DS1820_done_flag;
qonico 3:c8d0a2bb2987 164 extern int DS1820_last_descrepancy;
qonico 3:c8d0a2bb2987 165 extern char DS1820_search_ROM[8];
qonico 3:c8d0a2bb2987 166 DS1820_done_flag = false;
qonico 3:c8d0a2bb2987 167 DS1820_last_descrepancy = 0;
qonico 3:c8d0a2bb2987 168 int i;
qonico 3:c8d0a2bb2987 169 for (i=0; i<8; i++)
qonico 3:c8d0a2bb2987 170 DS1820_search_ROM[i]=0x00;
qonico 3:c8d0a2bb2987 171 }
qonico 3:c8d0a2bb2987 172
qonico 3:c8d0a2bb2987 173 void DS1820::read_ROM() {
qonico 3:c8d0a2bb2987 174 // NOTE: This command can only be used when there is one DS1820 on the bus. If this command
qonico 3:c8d0a2bb2987 175 // is used when there is more than one slave present on the bus, a data collision will occur
qonico 3:c8d0a2bb2987 176 // when all the DS1820s attempt to respond at the same time.
qonico 3:c8d0a2bb2987 177 int i;
qonico 3:c8d0a2bb2987 178 onewire_reset();
qonico 3:c8d0a2bb2987 179 onewire_byte_out(0x33); // Read ROM id
qonico 3:c8d0a2bb2987 180 for (i=0; i<8; i++)
qonico 3:c8d0a2bb2987 181 ROM[i]=onewire_byte_in();
qonico 3:c8d0a2bb2987 182 }
qonico 3:c8d0a2bb2987 183
qonico 3:c8d0a2bb2987 184 void DS1820::match_ROM() {
qonico 3:c8d0a2bb2987 185 // Used to select a specific device
qonico 3:c8d0a2bb2987 186 int i;
qonico 3:c8d0a2bb2987 187 onewire_reset();
qonico 3:c8d0a2bb2987 188 onewire_byte_out( 0x55); //Match ROM command
qonico 3:c8d0a2bb2987 189 for (i=0;i<8;i++)
qonico 3:c8d0a2bb2987 190 onewire_byte_out(ROM[i]);
qonico 3:c8d0a2bb2987 191 }
qonico 3:c8d0a2bb2987 192
qonico 3:c8d0a2bb2987 193 void DS1820::skip_ROM() {
qonico 3:c8d0a2bb2987 194 onewire_reset();
qonico 3:c8d0a2bb2987 195 onewire_byte_out(0xCC); // Skip ROM command
qonico 3:c8d0a2bb2987 196 }
qonico 3:c8d0a2bb2987 197
qonico 3:c8d0a2bb2987 198 bool DS1820::ROM_checksum_error() {
qonico 4:f8128bb8bef1 199 char crc=0x00;
qonico 3:c8d0a2bb2987 200 int i;
qonico 3:c8d0a2bb2987 201 for(i=0;i<7;i++) // Only going to shift the lower 7 bytes
qonico 4:f8128bb8bef1 202 crc = crc_byte(crc, ROM[i]);
qonico 4:f8128bb8bef1 203 // After 7 bytes crc should equal the 8th byte (ROM crc)
qonico 4:f8128bb8bef1 204 return (crc!=ROM[7]); // will return true if there is a crc checksum error
qonico 3:c8d0a2bb2987 205 }
qonico 3:c8d0a2bb2987 206
qonico 3:c8d0a2bb2987 207 bool DS1820::RAM_checksum_error() {
qonico 4:f8128bb8bef1 208 char crc=0x00;
qonico 3:c8d0a2bb2987 209 int i;
qonico 3:c8d0a2bb2987 210 read_RAM();
qonico 3:c8d0a2bb2987 211 for(i=0;i<8;i++) // Only going to shift the lower 8 bytes
qonico 4:f8128bb8bef1 212 crc = crc_byte(crc, RAM[i]);
qonico 4:f8128bb8bef1 213 // After 8 bytes crc should equal the 9th byte (RAM crc)
qonico 4:f8128bb8bef1 214 return (crc!=RAM[8]); // will return true if there is a crc checksum error
qonico 3:c8d0a2bb2987 215 }
qonico 3:c8d0a2bb2987 216
qonico 4:f8128bb8bef1 217 char DS1820::crc_byte (char crc, char byte ) {
qonico 3:c8d0a2bb2987 218 int j;
qonico 3:c8d0a2bb2987 219 for(j=0;j<8;j++) {
qonico 4:f8128bb8bef1 220 if ((byte & 0x01 ) ^ (crc & 0x01)) {
qonico 4:f8128bb8bef1 221 // DATA ^ LSB crc = 1
qonico 4:f8128bb8bef1 222 crc = crc>>1;
qonico 3:c8d0a2bb2987 223 // Set the MSB to 1
qonico 4:f8128bb8bef1 224 crc = crc | 0x80;
qonico 3:c8d0a2bb2987 225 // Check bit 3
qonico 4:f8128bb8bef1 226 if (crc & 0x04) {
qonico 4:f8128bb8bef1 227 crc = crc & 0xFB; // Bit 3 is set, so clear it
qonico 3:c8d0a2bb2987 228 } else {
qonico 4:f8128bb8bef1 229 crc = crc | 0x04; // Bit 3 is clear, so set it
qonico 3:c8d0a2bb2987 230 }
qonico 3:c8d0a2bb2987 231 // Check bit 4
qonico 4:f8128bb8bef1 232 if (crc & 0x08) {
qonico 4:f8128bb8bef1 233 crc = crc & 0xF7; // Bit 4 is set, so clear it
qonico 3:c8d0a2bb2987 234 } else {
qonico 4:f8128bb8bef1 235 crc = crc | 0x08; // Bit 4 is clear, so set it
qonico 3:c8d0a2bb2987 236 }
qonico 3:c8d0a2bb2987 237 } else {
qonico 4:f8128bb8bef1 238 // DATA ^ LSB crc = 0
qonico 4:f8128bb8bef1 239 crc = crc>>1;
qonico 3:c8d0a2bb2987 240 // clear MSB
qonico 4:f8128bb8bef1 241 crc = crc & 0x7F;
qonico 4:f8128bb8bef1 242 // No need to check bits, with DATA ^ LSB crc = 0, they will remain unchanged
qonico 3:c8d0a2bb2987 243 }
qonico 3:c8d0a2bb2987 244 byte = byte>>1;
qonico 3:c8d0a2bb2987 245 }
qonico 4:f8128bb8bef1 246 return crc;
qonico 3:c8d0a2bb2987 247 }
qonico 3:c8d0a2bb2987 248
qonico 3:c8d0a2bb2987 249 void DS1820::convert_temperature(devices device) {
qonico 3:c8d0a2bb2987 250 // Convert temperature into scratchpad RAM for all devices at once
qonico 3:c8d0a2bb2987 251 int delay_time = 750; // Default delay time
qonico 3:c8d0a2bb2987 252 char resolution;
qonico 3:c8d0a2bb2987 253 if (device==all_devices)
qonico 3:c8d0a2bb2987 254 skip_ROM(); // Skip ROM command, will convert for ALL devices
qonico 3:c8d0a2bb2987 255 else {
qonico 3:c8d0a2bb2987 256 match_ROM();
qonico 3:c8d0a2bb2987 257 if (FAMILY_CODE == FAMILY_CODE_DS18B20 ) {
qonico 3:c8d0a2bb2987 258 resolution = RAM[4] & 0x60;
qonico 3:c8d0a2bb2987 259 if (resolution == 0x00) // 9 bits
qonico 3:c8d0a2bb2987 260 delay_time = 94;
qonico 3:c8d0a2bb2987 261 if (resolution == 0x20) // 10 bits
qonico 3:c8d0a2bb2987 262 delay_time = 188;
qonico 3:c8d0a2bb2987 263 if (resolution == 0x40) // 11 bits. Note 12bits uses the 750ms default
qonico 3:c8d0a2bb2987 264 delay_time = 375;
qonico 3:c8d0a2bb2987 265 }
qonico 3:c8d0a2bb2987 266 }
qonico 3:c8d0a2bb2987 267 onewire_byte_out( 0x44); // perform temperature conversion
qonico 3:c8d0a2bb2987 268 if (_parasite_power)
qonico 3:c8d0a2bb2987 269 _parasitepin = 1; // Parasite power strong pullup
qonico 3:c8d0a2bb2987 270 wait_ms(delay_time);
qonico 3:c8d0a2bb2987 271 if (_parasite_power)
qonico 3:c8d0a2bb2987 272 _parasitepin = 0;
qonico 3:c8d0a2bb2987 273 }
qonico 3:c8d0a2bb2987 274
qonico 3:c8d0a2bb2987 275 void DS1820::read_RAM() {
qonico 3:c8d0a2bb2987 276 // This will copy the DS1820's 9 bytes of RAM data
qonico 3:c8d0a2bb2987 277 // into the objects RAM array. Functions that use
qonico 3:c8d0a2bb2987 278 // RAM values will automaticly call this procedure.
qonico 3:c8d0a2bb2987 279 int i;
qonico 3:c8d0a2bb2987 280 match_ROM(); // Select this device
qonico 3:c8d0a2bb2987 281 onewire_byte_out( 0xBE); //Read Scratchpad command
qonico 3:c8d0a2bb2987 282 for(i=0;i<9;i++) {
qonico 3:c8d0a2bb2987 283 RAM[i] = onewire_byte_in();
qonico 3:c8d0a2bb2987 284 }
qonico 3:c8d0a2bb2987 285 }
qonico 3:c8d0a2bb2987 286
qonico 3:c8d0a2bb2987 287 bool DS1820::set_configuration_bits(unsigned int resolution) {
qonico 3:c8d0a2bb2987 288 bool answer = false;
qonico 3:c8d0a2bb2987 289 resolution = resolution - 9;
qonico 3:c8d0a2bb2987 290 if (resolution < 4) {
qonico 3:c8d0a2bb2987 291 resolution = resolution<<5; // align the bits
qonico 3:c8d0a2bb2987 292 RAM[4] = (RAM[4] & 0x60) | resolution; // mask out old data, insert new
qonico 3:c8d0a2bb2987 293 write_scratchpad ((RAM[2]<<8) + RAM[3]);
qonico 3:c8d0a2bb2987 294 // store_scratchpad (DS1820::this_device); // Need to test if this is required
qonico 3:c8d0a2bb2987 295 answer = true;
qonico 3:c8d0a2bb2987 296 }
qonico 3:c8d0a2bb2987 297 return answer;
qonico 3:c8d0a2bb2987 298 }
qonico 3:c8d0a2bb2987 299
qonico 3:c8d0a2bb2987 300 int DS1820::read_scratchpad() {
qonico 3:c8d0a2bb2987 301 int answer;
qonico 3:c8d0a2bb2987 302 read_RAM();
qonico 3:c8d0a2bb2987 303 answer = (RAM[2]<<8) + RAM[3];
qonico 3:c8d0a2bb2987 304 return answer;
qonico 3:c8d0a2bb2987 305 }
qonico 3:c8d0a2bb2987 306
qonico 3:c8d0a2bb2987 307 void DS1820::write_scratchpad(int data) {
qonico 3:c8d0a2bb2987 308 RAM[3] = data;
qonico 3:c8d0a2bb2987 309 RAM[2] = data>>8;
qonico 3:c8d0a2bb2987 310 match_ROM();
qonico 3:c8d0a2bb2987 311 onewire_byte_out(0x4E); // Copy scratchpad into DS1820 ram memory
qonico 3:c8d0a2bb2987 312 onewire_byte_out(RAM[2]); // T(H)
qonico 3:c8d0a2bb2987 313 onewire_byte_out(RAM[3]); // T(L)
qonico 3:c8d0a2bb2987 314 if ( FAMILY_CODE == FAMILY_CODE_DS18B20 ) {
qonico 3:c8d0a2bb2987 315 onewire_byte_out(RAM[4]); // Configuration register
qonico 3:c8d0a2bb2987 316 }
qonico 3:c8d0a2bb2987 317 }
qonico 3:c8d0a2bb2987 318
qonico 3:c8d0a2bb2987 319 void DS1820::store_scratchpad(devices device) {
qonico 3:c8d0a2bb2987 320 if (device==all_devices)
qonico 3:c8d0a2bb2987 321 skip_ROM(); // Skip ROM command, will store for ALL devices
qonico 3:c8d0a2bb2987 322 else
qonico 3:c8d0a2bb2987 323 match_ROM();
qonico 3:c8d0a2bb2987 324 onewire_byte_out(0x48); // Write scratchpad into E2 command
qonico 3:c8d0a2bb2987 325 if (_parasite_power)
qonico 3:c8d0a2bb2987 326 _parasitepin=1;
qonico 3:c8d0a2bb2987 327 wait_ms(10); // Parasite power strong pullup for 10ms
qonico 3:c8d0a2bb2987 328 if (_parasite_power)
qonico 3:c8d0a2bb2987 329 _parasitepin=0;
qonico 3:c8d0a2bb2987 330 }
qonico 3:c8d0a2bb2987 331
qonico 3:c8d0a2bb2987 332 int DS1820::recall_scratchpad(devices device) {
qonico 3:c8d0a2bb2987 333 // This copies the E2 values into the DS1820's memory.
qonico 3:c8d0a2bb2987 334 // If you specify all_devices this will return zero, otherwise
qonico 3:c8d0a2bb2987 335 // it will return the value of the scratchpad memory.
qonico 3:c8d0a2bb2987 336 int answer=0;
qonico 3:c8d0a2bb2987 337 if (device==all_devices)
qonico 3:c8d0a2bb2987 338 skip_ROM(); // Skip ROM command, will recall for ALL devices
qonico 3:c8d0a2bb2987 339 else
qonico 3:c8d0a2bb2987 340 match_ROM();
qonico 3:c8d0a2bb2987 341 onewire_byte_out(0xB8); // Recall E2 data to scratchpad command
qonico 3:c8d0a2bb2987 342 wait_ms(10); // not sure I like polling for completion
qonico 3:c8d0a2bb2987 343 // it could cause an infinite loop
qonico 3:c8d0a2bb2987 344 if (device==DS1820::this_device) {
qonico 3:c8d0a2bb2987 345 read_RAM();
qonico 3:c8d0a2bb2987 346 answer = read_scratchpad();
qonico 3:c8d0a2bb2987 347 }
qonico 3:c8d0a2bb2987 348 return answer;
qonico 3:c8d0a2bb2987 349 }
qonico 3:c8d0a2bb2987 350
qonico 3:c8d0a2bb2987 351 float DS1820::temperature(char scale) {
qonico 3:c8d0a2bb2987 352 // The data specs state that count_per_degree should be 0x10 (16), I found my devices
qonico 3:c8d0a2bb2987 353 // to have a count_per_degree of 0x4B (75). With the standard resolution of 1/2 deg C
qonico 3:c8d0a2bb2987 354 // this allowed an expanded resolution of 1/150th of a deg C. I wouldn't rely on this
qonico 3:c8d0a2bb2987 355 // being super acurate, but it does allow for a smooth display in the 1/10ths of a
qonico 3:c8d0a2bb2987 356 // deg C or F scales.
qonico 3:c8d0a2bb2987 357 float answer, remaining_count, count_per_degree;
qonico 3:c8d0a2bb2987 358 int reading;
qonico 3:c8d0a2bb2987 359 read_RAM();
qonico 3:c8d0a2bb2987 360 reading = (RAM[1] << 8) + RAM[0];
qonico 3:c8d0a2bb2987 361 if (reading & 0x8000) { // negative degrees C
qonico 3:c8d0a2bb2987 362 reading = 0-((reading ^ 0xffff) + 1); // 2's comp then convert to signed int
qonico 3:c8d0a2bb2987 363 }
qonico 3:c8d0a2bb2987 364 answer = reading +0.0; // convert to floating point
qonico 3:c8d0a2bb2987 365 if ( FAMILY_CODE == FAMILY_CODE_DS18B20 ) {
qonico 3:c8d0a2bb2987 366 answer = answer / 8.0;
qonico 3:c8d0a2bb2987 367 }
qonico 3:c8d0a2bb2987 368 else {
qonico 3:c8d0a2bb2987 369 remaining_count = RAM[6];
qonico 3:c8d0a2bb2987 370 count_per_degree = RAM[7];
qonico 3:c8d0a2bb2987 371 answer = answer - 0.25 + (count_per_degree - remaining_count) / count_per_degree;
qonico 3:c8d0a2bb2987 372 }
qonico 3:c8d0a2bb2987 373 if (scale=='C' or scale=='c')
qonico 3:c8d0a2bb2987 374 answer = answer / 2.0;
qonico 3:c8d0a2bb2987 375 else
qonico 3:c8d0a2bb2987 376 // Convert to deg F
qonico 3:c8d0a2bb2987 377 answer = answer * 9.0 / 10.0 + 32.0;
qonico 3:c8d0a2bb2987 378 return answer;
qonico 3:c8d0a2bb2987 379 }
qonico 3:c8d0a2bb2987 380
qonico 3:c8d0a2bb2987 381 bool DS1820::read_power_supply(devices device) {
qonico 3:c8d0a2bb2987 382 // This will return true if the device (or all devices) are Vcc powered
qonico 3:c8d0a2bb2987 383 // This will return false if the device (or ANY device) is parasite powered
qonico 3:c8d0a2bb2987 384 if (device==all_devices)
qonico 3:c8d0a2bb2987 385 skip_ROM(); // Skip ROM command, will poll for any device using parasite power
qonico 3:c8d0a2bb2987 386 else
qonico 3:c8d0a2bb2987 387 match_ROM();
qonico 3:c8d0a2bb2987 388 onewire_byte_out(0xB4); // Read power supply command
qonico 3:c8d0a2bb2987 389 return onewire_bit_in();
qonico 3:c8d0a2bb2987 390 }