Test for MCP9800. 9-12 bit temperature sensor and thermostat with I2C (two-wire) SMBus compatible interface.

Dependencies:   mbed

Committer:
lnadal
Date:
Wed Aug 10 06:52:29 2011 +0000
Revision:
2:2838bca55216
Parent:
1:5dbac5939fd7

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }