Complete DS1621 library (all functions implemented)

Committer:
bborredon
Date:
Sat Jul 14 08:20:05 2012 +0000
Revision:
0:096dbb58d60e
[mbed] converted /I2c/DS1621

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bborredon 0:096dbb58d60e 1 /***********************************************************
bborredon 0:096dbb58d60e 2 Author: Bernard Borredon
bborredon 0:096dbb58d60e 3 Date: 27 december 2011
bborredon 0:096dbb58d60e 4 Version: 1.0
bborredon 0:096dbb58d60e 5 ************************************************************/
bborredon 0:096dbb58d60e 6 #include "ds1621.h"
bborredon 0:096dbb58d60e 7
bborredon 0:096dbb58d60e 8 #define BIT_SET(x,n) (x=x | (0x01<<n))
bborredon 0:096dbb58d60e 9 #define BIT_TEST(x,n) (x & (0x01<<n))
bborredon 0:096dbb58d60e 10 #define BIT_CLEAR(x,n) (x=x & ~(0x01<<n))
bborredon 0:096dbb58d60e 11
bborredon 0:096dbb58d60e 12 // Constructor
bborredon 0:096dbb58d60e 13 DS1621::DS1621(PinName sda, PinName scl, uint8_t address) : _i2c(sda, scl)
bborredon 0:096dbb58d60e 14 {
bborredon 0:096dbb58d60e 15 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 16 _config = DS1621_PolHigh;
bborredon 0:096dbb58d60e 17
bborredon 0:096dbb58d60e 18 // Check address range (0 to 7)
bborredon 0:096dbb58d60e 19 _address = address;
bborredon 0:096dbb58d60e 20 if(address > 7) {
bborredon 0:096dbb58d60e 21 _errnum = DS1621_BadAddress;
bborredon 0:096dbb58d60e 22 }
bborredon 0:096dbb58d60e 23 _address = _address << 1;
bborredon 0:096dbb58d60e 24
bborredon 0:096dbb58d60e 25 // Set I2C frequency
bborredon 0:096dbb58d60e 26 _i2c.frequency(100000);
bborredon 0:096dbb58d60e 27 }
bborredon 0:096dbb58d60e 28
bborredon 0:096dbb58d60e 29 // Get temperature with 0.5 degrees resolution
bborredon 0:096dbb58d60e 30 float DS1621::getTemp(void)
bborredon 0:096dbb58d60e 31 {
bborredon 0:096dbb58d60e 32 char cmd;
bborredon 0:096dbb58d60e 33 int8_t temp8[2];
bborredon 0:096dbb58d60e 34 float temp;
bborredon 0:096dbb58d60e 35 int ack;
bborredon 0:096dbb58d60e 36
bborredon 0:096dbb58d60e 37 // Check error
bborredon 0:096dbb58d60e 38 if(_errnum)
bborredon 0:096dbb58d60e 39 return(0.0);
bborredon 0:096dbb58d60e 40
bborredon 0:096dbb58d60e 41 // No error
bborredon 0:096dbb58d60e 42 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 43
bborredon 0:096dbb58d60e 44 // Start convert
bborredon 0:096dbb58d60e 45 startConvert(true);
bborredon 0:096dbb58d60e 46 if(getError() != 0)
bborredon 0:096dbb58d60e 47 return(0.0);
bborredon 0:096dbb58d60e 48
bborredon 0:096dbb58d60e 49 cmd = 0xAA; // Read Temperature [AAh]
bborredon 0:096dbb58d60e 50 ack = _i2c.write(DS1621_address | _address,&cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 51 if(ack != 0) {
bborredon 0:096dbb58d60e 52 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 53 return(0.0);
bborredon 0:096dbb58d60e 54 }
bborredon 0:096dbb58d60e 55
bborredon 0:096dbb58d60e 56 // Read value
bborredon 0:096dbb58d60e 57 ack = _i2c.read(DS1621_address | _address,(char *)temp8,sizeof(temp8));
bborredon 0:096dbb58d60e 58 if(ack != 0) {
bborredon 0:096dbb58d60e 59 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 60 return(0.0);
bborredon 0:096dbb58d60e 61 }
bborredon 0:096dbb58d60e 62
bborredon 0:096dbb58d60e 63 // Format temperature
bborredon 0:096dbb58d60e 64 temp8[1] = temp8[1] >> 7;
bborredon 0:096dbb58d60e 65 if(temp8[0] < 0) { // -
bborredon 0:096dbb58d60e 66 temp = -~temp8[0] + 0.5 * temp8[1];
bborredon 0:096dbb58d60e 67 }
bborredon 0:096dbb58d60e 68 else { // +
bborredon 0:096dbb58d60e 69 temp = temp8[0] - 0.5 * temp8[1];
bborredon 0:096dbb58d60e 70 }
bborredon 0:096dbb58d60e 71
bborredon 0:096dbb58d60e 72 return(temp);
bborredon 0:096dbb58d60e 73 }
bborredon 0:096dbb58d60e 74
bborredon 0:096dbb58d60e 75 // Get temperature with 0.01 degrees resolution
bborredon 0:096dbb58d60e 76 float DS1621::getHrTemp(void)
bborredon 0:096dbb58d60e 77 {
bborredon 0:096dbb58d60e 78 char cmd;
bborredon 0:096dbb58d60e 79 int8_t temp8[2];
bborredon 0:096dbb58d60e 80 int ack;
bborredon 0:096dbb58d60e 81 uint8_t count_remain, count_per_c;
bborredon 0:096dbb58d60e 82 uint8_t config,config_mem;
bborredon 0:096dbb58d60e 83 int16_t ifract;
bborredon 0:096dbb58d60e 84 int16_t itemp;
bborredon 0:096dbb58d60e 85 float temp;
bborredon 0:096dbb58d60e 86
bborredon 0:096dbb58d60e 87 // Check error
bborredon 0:096dbb58d60e 88 if(_errnum)
bborredon 0:096dbb58d60e 89 return(0.0);
bborredon 0:096dbb58d60e 90
bborredon 0:096dbb58d60e 91 // No error
bborredon 0:096dbb58d60e 92 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 93
bborredon 0:096dbb58d60e 94 // Get config register
bborredon 0:096dbb58d60e 95 config = getConfig();
bborredon 0:096dbb58d60e 96 if(getError() != 0)
bborredon 0:096dbb58d60e 97 return(0.0);
bborredon 0:096dbb58d60e 98
bborredon 0:096dbb58d60e 99 // Force 1Shot if needed
bborredon 0:096dbb58d60e 100 config_mem = 0;
bborredon 0:096dbb58d60e 101 if(!BIT_TEST(config,DS1621_CFG_1SHOT)) {
bborredon 0:096dbb58d60e 102 config_mem = config;
bborredon 0:096dbb58d60e 103 BIT_SET(config,DS1621_CFG_1SHOT);
bborredon 0:096dbb58d60e 104 setConfig(config);
bborredon 0:096dbb58d60e 105 if(getError() != 0)
bborredon 0:096dbb58d60e 106 return(0.0);
bborredon 0:096dbb58d60e 107 startConvert(false);
bborredon 0:096dbb58d60e 108 if(getError() != 0)
bborredon 0:096dbb58d60e 109 return(0.0);
bborredon 0:096dbb58d60e 110 }
bborredon 0:096dbb58d60e 111
bborredon 0:096dbb58d60e 112 // Start conversion
bborredon 0:096dbb58d60e 113 startConvert(true);
bborredon 0:096dbb58d60e 114 if(getError() != 0)
bborredon 0:096dbb58d60e 115 return(0.0);
bborredon 0:096dbb58d60e 116
bborredon 0:096dbb58d60e 117 // Wait end of conversion
bborredon 0:096dbb58d60e 118 waitEndConvert();
bborredon 0:096dbb58d60e 119 if(getError() != 0)
bborredon 0:096dbb58d60e 120 return(0.0);
bborredon 0:096dbb58d60e 121
bborredon 0:096dbb58d60e 122 cmd = 0xAA; // Read Temperature [AAh]
bborredon 0:096dbb58d60e 123 ack = _i2c.write(DS1621_address | _address,&cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 124 if(ack != 0) {
bborredon 0:096dbb58d60e 125 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 126 return(0.0);
bborredon 0:096dbb58d60e 127 }
bborredon 0:096dbb58d60e 128
bborredon 0:096dbb58d60e 129 // Read value
bborredon 0:096dbb58d60e 130 ack = _i2c.read(DS1621_address | _address,(char *)temp8,sizeof(temp8));
bborredon 0:096dbb58d60e 131 if(ack != 0) {
bborredon 0:096dbb58d60e 132 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 133 return(0.0);
bborredon 0:096dbb58d60e 134 }
bborredon 0:096dbb58d60e 135
bborredon 0:096dbb58d60e 136 cmd = 0xA8; // Read Counter [A8H]
bborredon 0:096dbb58d60e 137 ack = _i2c.write(DS1621_address | _address,&cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 138 if(ack != 0) {
bborredon 0:096dbb58d60e 139 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 140 return(0.0);
bborredon 0:096dbb58d60e 141 }
bborredon 0:096dbb58d60e 142
bborredon 0:096dbb58d60e 143 // Read value
bborredon 0:096dbb58d60e 144 ack = _i2c.read(DS1621_address | _address,(char *)&count_remain,sizeof(count_remain));
bborredon 0:096dbb58d60e 145 if(ack != 0) {
bborredon 0:096dbb58d60e 146 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 147 return(0.0);
bborredon 0:096dbb58d60e 148 }
bborredon 0:096dbb58d60e 149
bborredon 0:096dbb58d60e 150 cmd = 0xA9; // Read Slope [A9H]
bborredon 0:096dbb58d60e 151 ack = _i2c.write(DS1621_address | _address,&cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 152 if(ack != 0) {
bborredon 0:096dbb58d60e 153 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 154 return(0.0);
bborredon 0:096dbb58d60e 155 }
bborredon 0:096dbb58d60e 156
bborredon 0:096dbb58d60e 157 // Read value
bborredon 0:096dbb58d60e 158 ack = _i2c.read(DS1621_address | _address,(char *)&count_per_c,sizeof(count_per_c));
bborredon 0:096dbb58d60e 159 if(ack != 0) {
bborredon 0:096dbb58d60e 160 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 161 return(0.0);
bborredon 0:096dbb58d60e 162 }
bborredon 0:096dbb58d60e 163
bborredon 0:096dbb58d60e 164 // Format temperature
bborredon 0:096dbb58d60e 165 ifract = ((int16_t)(count_per_c - count_remain) * 100) / 25;
bborredon 0:096dbb58d60e 166 if(temp8[0] < 0) { // -
bborredon 0:096dbb58d60e 167 itemp = -~temp8[0] * 100 + ifract;
bborredon 0:096dbb58d60e 168 }
bborredon 0:096dbb58d60e 169 else { // +
bborredon 0:096dbb58d60e 170 itemp = temp8[0] * 100 + ifract;
bborredon 0:096dbb58d60e 171 }
bborredon 0:096dbb58d60e 172 temp = (float)itemp / 100.0;
bborredon 0:096dbb58d60e 173
bborredon 0:096dbb58d60e 174 // Restore config if needed
bborredon 0:096dbb58d60e 175 if(config_mem) {
bborredon 0:096dbb58d60e 176 setConfig(config_mem);
bborredon 0:096dbb58d60e 177 if(getError() != 0)
bborredon 0:096dbb58d60e 178 return(0.0);
bborredon 0:096dbb58d60e 179 startConvert(true);
bborredon 0:096dbb58d60e 180 if(getError() != 0)
bborredon 0:096dbb58d60e 181 return(0.0);
bborredon 0:096dbb58d60e 182 }
bborredon 0:096dbb58d60e 183
bborredon 0:096dbb58d60e 184 return(temp);
bborredon 0:096dbb58d60e 185 }
bborredon 0:096dbb58d60e 186
bborredon 0:096dbb58d60e 187 // Read config register
bborredon 0:096dbb58d60e 188 uint8_t DS1621::getConfig(void)
bborredon 0:096dbb58d60e 189 {
bborredon 0:096dbb58d60e 190 char cmd;
bborredon 0:096dbb58d60e 191 uint8_t config;
bborredon 0:096dbb58d60e 192 int ack;
bborredon 0:096dbb58d60e 193
bborredon 0:096dbb58d60e 194 // Check error
bborredon 0:096dbb58d60e 195 if(_errnum)
bborredon 0:096dbb58d60e 196 return(0);
bborredon 0:096dbb58d60e 197
bborredon 0:096dbb58d60e 198 // No error
bborredon 0:096dbb58d60e 199 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 200
bborredon 0:096dbb58d60e 201 cmd = 0xAC; // Access Config [ACh]
bborredon 0:096dbb58d60e 202 ack = _i2c.write(DS1621_address | _address,&cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 203 if(ack != 0) {
bborredon 0:096dbb58d60e 204 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 205 return(0);
bborredon 0:096dbb58d60e 206 }
bborredon 0:096dbb58d60e 207
bborredon 0:096dbb58d60e 208 // Read value
bborredon 0:096dbb58d60e 209 ack = _i2c.read(DS1621_address | _address,(char *)&config,sizeof(config));
bborredon 0:096dbb58d60e 210 if(ack != 0) {
bborredon 0:096dbb58d60e 211 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 212 return(0);
bborredon 0:096dbb58d60e 213 }
bborredon 0:096dbb58d60e 214
bborredon 0:096dbb58d60e 215 return(config);
bborredon 0:096dbb58d60e 216 }
bborredon 0:096dbb58d60e 217
bborredon 0:096dbb58d60e 218 // Write config register
bborredon 0:096dbb58d60e 219 void DS1621::setConfig(uint8_t config)
bborredon 0:096dbb58d60e 220 {
bborredon 0:096dbb58d60e 221 char cmd[2];
bborredon 0:096dbb58d60e 222 int ack;
bborredon 0:096dbb58d60e 223
bborredon 0:096dbb58d60e 224 // Check error
bborredon 0:096dbb58d60e 225 if(_errnum)
bborredon 0:096dbb58d60e 226 return;
bborredon 0:096dbb58d60e 227
bborredon 0:096dbb58d60e 228 // No error
bborredon 0:096dbb58d60e 229 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 230
bborredon 0:096dbb58d60e 231 _config = config;
bborredon 0:096dbb58d60e 232
bborredon 0:096dbb58d60e 233 cmd[0] = 0xAC; // Access Config [ACh]
bborredon 0:096dbb58d60e 234 cmd[1] = config;
bborredon 0:096dbb58d60e 235 ack = _i2c.write(DS1621_address | _address,cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 236 if(ack != 0) {
bborredon 0:096dbb58d60e 237 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 238 }
bborredon 0:096dbb58d60e 239 }
bborredon 0:096dbb58d60e 240
bborredon 0:096dbb58d60e 241 // Start or stop convert
bborredon 0:096dbb58d60e 242 void DS1621::startConvert(bool flag)
bborredon 0:096dbb58d60e 243 {
bborredon 0:096dbb58d60e 244 char cmd;
bborredon 0:096dbb58d60e 245 int ack;
bborredon 0:096dbb58d60e 246
bborredon 0:096dbb58d60e 247 // Check error
bborredon 0:096dbb58d60e 248 if(_errnum)
bborredon 0:096dbb58d60e 249 return;
bborredon 0:096dbb58d60e 250
bborredon 0:096dbb58d60e 251 // No error
bborredon 0:096dbb58d60e 252 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 253
bborredon 0:096dbb58d60e 254 if(flag)
bborredon 0:096dbb58d60e 255 cmd = 0xEE; // Start Convert [EEh]
bborredon 0:096dbb58d60e 256 else
bborredon 0:096dbb58d60e 257 cmd = 0x22; // Stop Convert [22h]
bborredon 0:096dbb58d60e 258
bborredon 0:096dbb58d60e 259 ack = _i2c.write(DS1621_address | _address,&cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 260 if(ack != 0) {
bborredon 0:096dbb58d60e 261 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 262 }
bborredon 0:096dbb58d60e 263 }
bborredon 0:096dbb58d60e 264
bborredon 0:096dbb58d60e 265 // Wait end of conversion
bborredon 0:096dbb58d60e 266 void DS1621::waitEndConvert(void)
bborredon 0:096dbb58d60e 267 {
bborredon 0:096dbb58d60e 268 uint8_t cfg;
bborredon 0:096dbb58d60e 269
bborredon 0:096dbb58d60e 270 // Check error
bborredon 0:096dbb58d60e 271 if(_errnum)
bborredon 0:096dbb58d60e 272 return;
bborredon 0:096dbb58d60e 273
bborredon 0:096dbb58d60e 274 // No error
bborredon 0:096dbb58d60e 275 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 276
bborredon 0:096dbb58d60e 277 // Wait end of conversion
bborredon 0:096dbb58d60e 278 do {
bborredon 0:096dbb58d60e 279 // Get Config register and test bit DONE
bborredon 0:096dbb58d60e 280 cfg = getConfig();
bborredon 0:096dbb58d60e 281 if(getError() != 0)
bborredon 0:096dbb58d60e 282 return;
bborredon 0:096dbb58d60e 283 }
bborredon 0:096dbb58d60e 284 while(cfg < DS1621_DONE);
bborredon 0:096dbb58d60e 285 }
bborredon 0:096dbb58d60e 286
bborredon 0:096dbb58d60e 287 // Read Temperature High Flag
bborredon 0:096dbb58d60e 288 bool DS1621::getTHF(void)
bborredon 0:096dbb58d60e 289 {
bborredon 0:096dbb58d60e 290 uint8_t cfg;
bborredon 0:096dbb58d60e 291 bool thf;
bborredon 0:096dbb58d60e 292
bborredon 0:096dbb58d60e 293 // Check error
bborredon 0:096dbb58d60e 294 if(_errnum)
bborredon 0:096dbb58d60e 295 return(0);
bborredon 0:096dbb58d60e 296
bborredon 0:096dbb58d60e 297 // No error
bborredon 0:096dbb58d60e 298 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 299
bborredon 0:096dbb58d60e 300 // get Config register
bborredon 0:096dbb58d60e 301 cfg = getConfig();
bborredon 0:096dbb58d60e 302 if(getError() != 0)
bborredon 0:096dbb58d60e 303 return(0);
bborredon 0:096dbb58d60e 304
bborredon 0:096dbb58d60e 305 // Test THF bit
bborredon 0:096dbb58d60e 306 if(BIT_TEST(cfg,DS1621_CFG_THF))
bborredon 0:096dbb58d60e 307 thf = true;
bborredon 0:096dbb58d60e 308 else
bborredon 0:096dbb58d60e 309 thf = false;
bborredon 0:096dbb58d60e 310
bborredon 0:096dbb58d60e 311 return(thf);
bborredon 0:096dbb58d60e 312 }
bborredon 0:096dbb58d60e 313
bborredon 0:096dbb58d60e 314 // Read Temperature Low Flag
bborredon 0:096dbb58d60e 315 bool DS1621::getTLF()
bborredon 0:096dbb58d60e 316 {
bborredon 0:096dbb58d60e 317 uint8_t cfg;
bborredon 0:096dbb58d60e 318 bool tlf;
bborredon 0:096dbb58d60e 319
bborredon 0:096dbb58d60e 320 // Check error
bborredon 0:096dbb58d60e 321 if(_errnum)
bborredon 0:096dbb58d60e 322 return(0);
bborredon 0:096dbb58d60e 323
bborredon 0:096dbb58d60e 324 // No error
bborredon 0:096dbb58d60e 325 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 326
bborredon 0:096dbb58d60e 327 // get Config register
bborredon 0:096dbb58d60e 328 cfg = getConfig();
bborredon 0:096dbb58d60e 329 if(getError() != 0)
bborredon 0:096dbb58d60e 330 return(0);
bborredon 0:096dbb58d60e 331
bborredon 0:096dbb58d60e 332 // Test TLF bit
bborredon 0:096dbb58d60e 333 if(BIT_TEST(cfg,DS1621_CFG_TLF))
bborredon 0:096dbb58d60e 334 tlf = true;
bborredon 0:096dbb58d60e 335 else
bborredon 0:096dbb58d60e 336 tlf = false;
bborredon 0:096dbb58d60e 337
bborredon 0:096dbb58d60e 338 return(tlf);
bborredon 0:096dbb58d60e 339 }
bborredon 0:096dbb58d60e 340
bborredon 0:096dbb58d60e 341 // Read Temperature Low and High Flag
bborredon 0:096dbb58d60e 342 void DS1621::getTF(bool& tlf,bool& thf)
bborredon 0:096dbb58d60e 343 {
bborredon 0:096dbb58d60e 344 uint8_t cfg;
bborredon 0:096dbb58d60e 345
bborredon 0:096dbb58d60e 346 // Check error
bborredon 0:096dbb58d60e 347 if(_errnum)
bborredon 0:096dbb58d60e 348 return;
bborredon 0:096dbb58d60e 349
bborredon 0:096dbb58d60e 350 // No error
bborredon 0:096dbb58d60e 351 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 352
bborredon 0:096dbb58d60e 353 // get Config register
bborredon 0:096dbb58d60e 354 cfg = getConfig();
bborredon 0:096dbb58d60e 355 if(getError() != 0)
bborredon 0:096dbb58d60e 356 return;
bborredon 0:096dbb58d60e 357
bborredon 0:096dbb58d60e 358 // Test TLF bit
bborredon 0:096dbb58d60e 359 tlf = false;
bborredon 0:096dbb58d60e 360 if(BIT_TEST(cfg,DS1621_CFG_TLF))
bborredon 0:096dbb58d60e 361 tlf = true;
bborredon 0:096dbb58d60e 362
bborredon 0:096dbb58d60e 363 // Test THF bit
bborredon 0:096dbb58d60e 364 thf = false;
bborredon 0:096dbb58d60e 365 if(BIT_TEST(cfg,DS1621_CFG_THF))
bborredon 0:096dbb58d60e 366 thf = true;
bborredon 0:096dbb58d60e 367 }
bborredon 0:096dbb58d60e 368
bborredon 0:096dbb58d60e 369 // Read 1Shot bit
bborredon 0:096dbb58d60e 370 bool DS1621::get1Shot(void)
bborredon 0:096dbb58d60e 371 {
bborredon 0:096dbb58d60e 372
bborredon 0:096dbb58d60e 373 // Test 1Shot bit
bborredon 0:096dbb58d60e 374 if(BIT_TEST(_config,DS1621_CFG_1SHOT))
bborredon 0:096dbb58d60e 375 return(true);
bborredon 0:096dbb58d60e 376 else
bborredon 0:096dbb58d60e 377 return(false);
bborredon 0:096dbb58d60e 378 }
bborredon 0:096dbb58d60e 379
bborredon 0:096dbb58d60e 380 // Write Temperature (High or Low)
bborredon 0:096dbb58d60e 381 void DS1621::setTemperature(float temp,uint8_t trig)
bborredon 0:096dbb58d60e 382 {
bborredon 0:096dbb58d60e 383 uint8_t temp8[3];
bborredon 0:096dbb58d60e 384 int ack;
bborredon 0:096dbb58d60e 385 float r;
bborredon 0:096dbb58d60e 386
bborredon 0:096dbb58d60e 387 // Chack param
bborredon 0:096dbb58d60e 388 if(trig > 1) {
bborredon 0:096dbb58d60e 389 _errnum = DS1621_ParamError;
bborredon 0:096dbb58d60e 390 return;
bborredon 0:096dbb58d60e 391 }
bborredon 0:096dbb58d60e 392
bborredon 0:096dbb58d60e 393 // Check error
bborredon 0:096dbb58d60e 394 if(_errnum)
bborredon 0:096dbb58d60e 395 return;
bborredon 0:096dbb58d60e 396
bborredon 0:096dbb58d60e 397 // No error
bborredon 0:096dbb58d60e 398 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 399
bborredon 0:096dbb58d60e 400 // Format temperature
bborredon 0:096dbb58d60e 401 if(temp >= 0.0) {
bborredon 0:096dbb58d60e 402 temp8[1] = (uint8_t)temp;
bborredon 0:096dbb58d60e 403 r = temp - (int)temp;
bborredon 0:096dbb58d60e 404 if(r >= 0.5)
bborredon 0:096dbb58d60e 405 temp8[2] = 0x80;
bborredon 0:096dbb58d60e 406 else
bborredon 0:096dbb58d60e 407 temp8[2] = 0;
bborredon 0:096dbb58d60e 408 }
bborredon 0:096dbb58d60e 409 else {
bborredon 0:096dbb58d60e 410 temp8[1] = ~(-(int8_t)temp);
bborredon 0:096dbb58d60e 411 r = -temp + (int)temp;
bborredon 0:096dbb58d60e 412 if(r >= 0.5)
bborredon 0:096dbb58d60e 413 temp8[2] = 0x80;
bborredon 0:096dbb58d60e 414 else
bborredon 0:096dbb58d60e 415 temp8[2] = 0;
bborredon 0:096dbb58d60e 416 }
bborredon 0:096dbb58d60e 417
bborredon 0:096dbb58d60e 418 wait_ms(100);
bborredon 0:096dbb58d60e 419
bborredon 0:096dbb58d60e 420 temp8[0] = 0xA1 + trig; // Access TH or TL [A1h or A2h]
bborredon 0:096dbb58d60e 421 ack = _i2c.write(DS1621_address | _address,(char *)temp8,sizeof(temp8));
bborredon 0:096dbb58d60e 422 if(ack != 0) {
bborredon 0:096dbb58d60e 423 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 424 }
bborredon 0:096dbb58d60e 425 }
bborredon 0:096dbb58d60e 426
bborredon 0:096dbb58d60e 427 // Read Temperature (High or Low)
bborredon 0:096dbb58d60e 428 float DS1621::getTemperature(uint8_t trig)
bborredon 0:096dbb58d60e 429 {
bborredon 0:096dbb58d60e 430 char cmd;
bborredon 0:096dbb58d60e 431 float temp;
bborredon 0:096dbb58d60e 432 int8_t temp8[2];
bborredon 0:096dbb58d60e 433 int ack;
bborredon 0:096dbb58d60e 434
bborredon 0:096dbb58d60e 435 // Check param
bborredon 0:096dbb58d60e 436 if(trig > 1) {
bborredon 0:096dbb58d60e 437 _errnum = DS1621_ParamError;
bborredon 0:096dbb58d60e 438 return(0.0);
bborredon 0:096dbb58d60e 439 }
bborredon 0:096dbb58d60e 440
bborredon 0:096dbb58d60e 441 // Check error
bborredon 0:096dbb58d60e 442 if(_errnum)
bborredon 0:096dbb58d60e 443 return(0.0);
bborredon 0:096dbb58d60e 444
bborredon 0:096dbb58d60e 445 // No error
bborredon 0:096dbb58d60e 446 _errnum = DS1621_NoError;
bborredon 0:096dbb58d60e 447
bborredon 0:096dbb58d60e 448 wait_ms(100);
bborredon 0:096dbb58d60e 449
bborredon 0:096dbb58d60e 450 cmd = 0xA1 + trig; // Access TH or TL [A1h or A2h]
bborredon 0:096dbb58d60e 451 ack = _i2c.write(DS1621_address| _address,&cmd,sizeof(cmd));
bborredon 0:096dbb58d60e 452 if(ack != 0) {
bborredon 0:096dbb58d60e 453 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 454 return(0.0);
bborredon 0:096dbb58d60e 455 }
bborredon 0:096dbb58d60e 456
bborredon 0:096dbb58d60e 457 ack = _i2c.read(DS1621_address | _address,(char *)temp8,sizeof(temp8));
bborredon 0:096dbb58d60e 458 if(ack != 0) {
bborredon 0:096dbb58d60e 459 _errnum = DS1621_I2cError;
bborredon 0:096dbb58d60e 460 return(0.0);
bborredon 0:096dbb58d60e 461 }
bborredon 0:096dbb58d60e 462
bborredon 0:096dbb58d60e 463 // Format temperature
bborredon 0:096dbb58d60e 464 temp8[1] = temp8[1] >> 7;
bborredon 0:096dbb58d60e 465 if(temp8[0] < 0) { // -
bborredon 0:096dbb58d60e 466 temp = -~temp8[0] + 0.5 * temp8[1];
bborredon 0:096dbb58d60e 467 }
bborredon 0:096dbb58d60e 468 else { // +
bborredon 0:096dbb58d60e 469 temp = temp8[0] - 0.5 * temp8[1];
bborredon 0:096dbb58d60e 470 }
bborredon 0:096dbb58d60e 471
bborredon 0:096dbb58d60e 472 return(temp);
bborredon 0:096dbb58d60e 473 }
bborredon 0:096dbb58d60e 474
bborredon 0:096dbb58d60e 475 // Get current error number
bborredon 0:096dbb58d60e 476 uint8_t DS1621::getError(void)
bborredon 0:096dbb58d60e 477 {
bborredon 0:096dbb58d60e 478 return(_errnum);
bborredon 0:096dbb58d60e 479 }