Complete DS1621 library (all functions implemented)
ds1621.cpp@0:096dbb58d60e, 2012-07-14 (annotated)
- Committer:
- bborredon
- Date:
- Sat Jul 14 08:20:05 2012 +0000
- Revision:
- 0:096dbb58d60e
[mbed] converted /I2c/DS1621
Who changed what in which revision?
User | Revision | Line number | New 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 | } |