Test for MCP9800. 9-12 bit temperature sensor and thermostat with I2C (two-wire) SMBus compatible interface.
main.cpp@2:2838bca55216, 2011-08-10 (annotated)
- Committer:
- lnadal
- Date:
- Wed Aug 10 06:52:29 2011 +0000
- Revision:
- 2:2838bca55216
- Parent:
- 1:5dbac5939fd7
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lnadal | 0:226780c17920 | 1 | #include "mbed.h" |
lnadal | 0:226780c17920 | 2 | |
lnadal | 0:226780c17920 | 3 | /* |
lnadal | 0:226780c17920 | 4 | *************************************************************************** |
lnadal | 0:226780c17920 | 5 | MCP9800_Test. 9-12 bit temperature sensor and thermostat. |
lnadal | 0:226780c17920 | 6 | 2.7-5.5 V. 4.7kOhm pull-up resistors at SDA and SCLK. |
lnadal | 0:226780c17920 | 7 | |
lnadal | 0:226780c17920 | 8 | This program sets 12 bit ambient temperature readings resolution. |
lnadal | 0:226780c17920 | 9 | |
lnadal | 0:226780c17920 | 10 | Pointer bits: |
lnadal | 0:226780c17920 | 11 | 00: temperature register. 01: configuration register. |
lnadal | 0:226780c17920 | 12 | 10: temperature hysteresis register. 11: temperature limit-set register. |
lnadal | 0:226780c17920 | 13 | Author: Lluis Nadal. August 2011. |
lnadal | 0:226780c17920 | 14 | *************************************************************************** |
lnadal | 0:226780c17920 | 15 | */ |
lnadal | 0:226780c17920 | 16 | |
lnadal | 0:226780c17920 | 17 | I2C i2c(p9, p10); // SDA, SCL |
lnadal | 0:226780c17920 | 18 | Serial pc(USBTX, USBRX); |
lnadal | 0:226780c17920 | 19 | |
lnadal | 0:226780c17920 | 20 | const int addr_R = 0x91; // Address to read |
lnadal | 0:226780c17920 | 21 | const int addr_W = 0x90; // Address to write |
lnadal | 0:226780c17920 | 22 | //const int addr_R = 0x9B ; // Address to read |
lnadal | 0:226780c17920 | 23 | //const int addr_W = 0x9A; // Address to write |
lnadal | 0:226780c17920 | 24 | |
lnadal | 0:226780c17920 | 25 | char data[3]; |
lnadal | 0:226780c17920 | 26 | char TL[2]; |
lnadal | 0:226780c17920 | 27 | char TLR[2]; |
lnadal | 0:226780c17920 | 28 | char TH[2]; |
lnadal | 0:226780c17920 | 29 | char CR[1]; |
lnadal | 0:226780c17920 | 30 | int t; |
lnadal | 0:226780c17920 | 31 | float temp; |
lnadal | 0:226780c17920 | 32 | |
lnadal | 0:226780c17920 | 33 | |
lnadal | 0:226780c17920 | 34 | void read_temp() { |
lnadal | 0:226780c17920 | 35 | |
lnadal | 0:226780c17920 | 36 | int sign; |
lnadal | 0:226780c17920 | 37 | i2c.start(); |
lnadal | 0:226780c17920 | 38 | i2c.write(addr_W);//Address to write pointer |
lnadal | 0:226780c17920 | 39 | i2c.write(0x00);// Write pointer to ambient temperature register |
lnadal | 0:226780c17920 | 40 | i2c.read(addr_R, data, 2); |
lnadal | 0:226780c17920 | 41 | i2c.stop(); |
lnadal | 0:226780c17920 | 42 | |
lnadal | 0:226780c17920 | 43 | //pc.printf("Temperature register: (%d, %d)\r\n",data[0], data[1]); |
lnadal | 0:226780c17920 | 44 | sign = data[0]>>7; |
lnadal | 0:226780c17920 | 45 | //pc.printf("Sign: %d \r\n",sign); |
lnadal | 0:226780c17920 | 46 | |
lnadal | 0:226780c17920 | 47 | if (sign == 1) { // If number is negative |
lnadal | 0:226780c17920 | 48 | data[0] = ~data[0]; // Inverts (compliments)the bits |
lnadal | 0:226780c17920 | 49 | data[1] = ~data[1]; // Inverts (compliments)the bits |
lnadal | 0:226780c17920 | 50 | t = data[0]; |
lnadal | 0:226780c17920 | 51 | t = -((t<<4) | (data[1]>>4)+1);// Packs and adds one to convert to negative integer |
lnadal | 0:226780c17920 | 52 | temp = t/16.0; |
lnadal | 0:226780c17920 | 53 | } |
lnadal | 0:226780c17920 | 54 | |
lnadal | 0:226780c17920 | 55 | else { |
lnadal | 0:226780c17920 | 56 | t = data[0]; |
lnadal | 0:226780c17920 | 57 | t = ((t<<4) | (data[1]>>4)); |
lnadal | 0:226780c17920 | 58 | temp = t/16.0; |
lnadal | 0:226780c17920 | 59 | } |
lnadal | 0:226780c17920 | 60 | pc.printf("Temperature: %.4f C\r\n",temp); |
lnadal | 0:226780c17920 | 61 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 62 | } |
lnadal | 0:226780c17920 | 63 | |
lnadal | 0:226780c17920 | 64 | |
lnadal | 0:226780c17920 | 65 | void read_TL() { // Read temperature limit register |
lnadal | 0:226780c17920 | 66 | |
lnadal | 0:226780c17920 | 67 | i2c.start(); |
lnadal | 0:226780c17920 | 68 | i2c.write(addr_W);//Address to write pointer |
lnadal | 0:226780c17920 | 69 | i2c.write(0x03);// Write pointer to TL register |
lnadal | 0:226780c17920 | 70 | i2c.read(addr_R, TLR, 2); |
lnadal | 0:226780c17920 | 71 | i2c.stop(); |
lnadal | 0:226780c17920 | 72 | pc.printf("Temperature limit register: (%d, %d)\r\n",TLR[0], TLR[1]); |
lnadal | 0:226780c17920 | 73 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 74 | } |
lnadal | 0:226780c17920 | 75 | |
lnadal | 0:226780c17920 | 76 | void read_TH() { // Read hysteresis register |
lnadal | 0:226780c17920 | 77 | |
lnadal | 0:226780c17920 | 78 | i2c.start(); |
lnadal | 0:226780c17920 | 79 | i2c.write(addr_W);//Address to write pointer |
lnadal | 0:226780c17920 | 80 | i2c.write(0x02);// Write pointer to TH register |
lnadal | 0:226780c17920 | 81 | i2c.read(addr_R, TH, 2); |
lnadal | 0:226780c17920 | 82 | i2c.stop(); |
lnadal | 0:226780c17920 | 83 | |
lnadal | 0:226780c17920 | 84 | pc.printf("Temperature hysteresis register: (%d, %d)\r\n",TH[0], TH[1]); |
lnadal | 0:226780c17920 | 85 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 86 | } |
lnadal | 0:226780c17920 | 87 | |
lnadal | 0:226780c17920 | 88 | |
lnadal | 0:226780c17920 | 89 | void read_CR() { // Read configuration register |
lnadal | 0:226780c17920 | 90 | |
lnadal | 0:226780c17920 | 91 | i2c.start(); |
lnadal | 0:226780c17920 | 92 | i2c.write(addr_W);//Address to write pointer |
lnadal | 0:226780c17920 | 93 | i2c.write(0x01);// Write pointer to configuration register |
lnadal | 0:226780c17920 | 94 | i2c.read(addr_R, CR, 1); |
lnadal | 0:226780c17920 | 95 | i2c.stop(); |
lnadal | 0:226780c17920 | 96 | |
lnadal | 0:226780c17920 | 97 | pc.printf("Configuration register: (%d)\r\n",CR[0]); |
lnadal | 0:226780c17920 | 98 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 99 | } |
lnadal | 0:226780c17920 | 100 | |
lnadal | 0:226780c17920 | 101 | // Set temperature limit (9-bit) |
lnadal | 0:226780c17920 | 102 | void set_TL(float n) { // -25.4375, 25.4375, 125, -55... |
lnadal | 0:226780c17920 | 103 | char msb; |
lnadal | 0:226780c17920 | 104 | char lsb; |
lnadal | 0:226780c17920 | 105 | if (n < 0) { |
lnadal | 0:226780c17920 | 106 | t = (int)(-n*16.0-1); |
lnadal | 0:226780c17920 | 107 | pc.printf("t = %d\r\n", t); |
lnadal | 0:226780c17920 | 108 | t = t<<4; |
lnadal | 0:226780c17920 | 109 | lsb = t & 0xFF; |
lnadal | 0:226780c17920 | 110 | msb = t>>8; |
lnadal | 0:226780c17920 | 111 | lsb = ~lsb; //Inverts (compliments)the bits |
lnadal | 0:226780c17920 | 112 | msb = ~msb; //Inverts (compliments)the bits |
lnadal | 0:226780c17920 | 113 | //pc.printf("(%d, %d)\r\b", msb, lsb); |
lnadal | 0:226780c17920 | 114 | } else { |
lnadal | 0:226780c17920 | 115 | t = (int)(n*16.0); |
lnadal | 0:226780c17920 | 116 | t = t<<4; |
lnadal | 0:226780c17920 | 117 | lsb = t & 0xFF; |
lnadal | 0:226780c17920 | 118 | msb = t>>8; |
lnadal | 0:226780c17920 | 119 | //pc.printf("(%d, %d)\r\b", msb, lsb); |
lnadal | 0:226780c17920 | 120 | } |
lnadal | 0:226780c17920 | 121 | i2c.start(); |
lnadal | 0:226780c17920 | 122 | i2c.write(addr_W);//Address to write pointer |
lnadal | 0:226780c17920 | 123 | i2c.write(0x03);// Write pointer to temperature-limit register |
lnadal | 0:226780c17920 | 124 | i2c.write(msb);// Write data |
lnadal | 0:226780c17920 | 125 | i2c.write(lsb);// Write data |
lnadal | 0:226780c17920 | 126 | i2c.stop(); |
lnadal | 0:226780c17920 | 127 | } |
lnadal | 0:226780c17920 | 128 | |
lnadal | 0:226780c17920 | 129 | // Set hysteresis register (9-bit) |
lnadal | 0:226780c17920 | 130 | void set_TH(float n) { // -25.4375, 25.4375, 125, -55... |
lnadal | 0:226780c17920 | 131 | char msb; |
lnadal | 0:226780c17920 | 132 | char lsb; |
lnadal | 0:226780c17920 | 133 | if (n < 0) { |
lnadal | 0:226780c17920 | 134 | t = (int)(-n*16.0-1); |
lnadal | 0:226780c17920 | 135 | pc.printf("t = %d\r\n", t); |
lnadal | 0:226780c17920 | 136 | t = t<<4; |
lnadal | 0:226780c17920 | 137 | lsb = t & 0xFF; |
lnadal | 0:226780c17920 | 138 | msb = t>>8; |
lnadal | 0:226780c17920 | 139 | lsb = ~lsb; //Inverts (compliments)the bits |
lnadal | 0:226780c17920 | 140 | msb = ~msb; //Inverts (compliments)the bits |
lnadal | 0:226780c17920 | 141 | //pc.printf("(%d, %d)\r\b", msb, lsb); |
lnadal | 0:226780c17920 | 142 | } else { |
lnadal | 0:226780c17920 | 143 | t = (int)(n*16.0); |
lnadal | 0:226780c17920 | 144 | t = t<<4; |
lnadal | 0:226780c17920 | 145 | lsb = t & 0xFF; |
lnadal | 0:226780c17920 | 146 | msb = t>>8; |
lnadal | 0:226780c17920 | 147 | //pc.printf("(%d, %d)\r\b", msb, lsb); |
lnadal | 0:226780c17920 | 148 | } |
lnadal | 0:226780c17920 | 149 | i2c.start(); |
lnadal | 0:226780c17920 | 150 | i2c.write(addr_W);//Address to write pointer |
lnadal | 0:226780c17920 | 151 | i2c.write(0x02);// Write pointer to hysteresis register |
lnadal | 0:226780c17920 | 152 | i2c.write(msb);// Write data |
lnadal | 0:226780c17920 | 153 | i2c.write(lsb);// Write data |
lnadal | 0:226780c17920 | 154 | i2c.stop(); |
lnadal | 0:226780c17920 | 155 | } |
lnadal | 0:226780c17920 | 156 | |
lnadal | 0:226780c17920 | 157 | |
lnadal | 0:226780c17920 | 158 | |
lnadal | 0:226780c17920 | 159 | |
lnadal | 0:226780c17920 | 160 | |
lnadal | 0:226780c17920 | 161 | int main() { |
lnadal | 0:226780c17920 | 162 | |
lnadal | 0:226780c17920 | 163 | i2c.frequency(200000); // Max 400000 Hz |
lnadal | 0:226780c17920 | 164 | |
lnadal | 0:226780c17920 | 165 | pc.printf("Initial readings: \r\n"); |
lnadal | 0:226780c17920 | 166 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 167 | read_TL(); // Read temperature limit register |
lnadal | 0:226780c17920 | 168 | read_TH(); // Read hysteresis register |
lnadal | 0:226780c17920 | 169 | read_CR(); // Read configuration register |
lnadal | 0:226780c17920 | 170 | |
lnadal | 0:226780c17920 | 171 | // Set 12 bit resolution |
lnadal | 0:226780c17920 | 172 | i2c.start(); |
lnadal | 0:226780c17920 | 173 | i2c.write(addr_W);//Address to write pointer |
lnadal | 0:226780c17920 | 174 | i2c.write(0x01);// Write pointer to configuration register |
lnadal | 0:226780c17920 | 175 | i2c.write(0x60);// Write data |
lnadal | 0:226780c17920 | 176 | i2c.stop(); |
lnadal | 0:226780c17920 | 177 | |
lnadal | 0:226780c17920 | 178 | // Set temperature limit (9-bit) |
lnadal | 0:226780c17920 | 179 | set_TL(25.4375); // -25.4375, 25.4375, 125, -55... |
lnadal | 2:2838bca55216 | 180 | // If ambient temperature > temperature limit then alert pin is low (with a pull-up resistor). |
lnadal | 1:5dbac5939fd7 | 181 | |
lnadal | 0:226780c17920 | 182 | |
lnadal | 0:226780c17920 | 183 | // Set hysteresis register (9-bit) |
lnadal | 0:226780c17920 | 184 | set_TH(24.4375); // -25.4375, 25.4375, 125, -55... |
lnadal | 0:226780c17920 | 185 | |
lnadal | 0:226780c17920 | 186 | wait(1); |
lnadal | 0:226780c17920 | 187 | |
lnadal | 0:226780c17920 | 188 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 189 | pc.printf("Readings after changes: \r\n"); |
lnadal | 0:226780c17920 | 190 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 191 | read_TL(); // Read temperature limit register |
lnadal | 0:226780c17920 | 192 | read_TH(); // Read hysteresis register |
lnadal | 0:226780c17920 | 193 | read_CR(); // Read configuration register |
lnadal | 0:226780c17920 | 194 | read_temp(); // Read ambient temperature |
lnadal | 0:226780c17920 | 195 | pc.printf("\r\n"); |
lnadal | 0:226780c17920 | 196 | |
lnadal | 0:226780c17920 | 197 | } |