ds1621_i2c.c - PIC24 uC in Master mode to Maxim DS1621 Digital Thermometer using I2CΒΆ
I2C Example: Demonstrates I2C functions by reading/writing from a Maxim DS1621 Digital Thermometer.
#include "pic24_all.h"
#include <stdio.h>
#define DS1621ADDR 0x90 //DS1621 address with all pins tied low
#define ACCESS_CONFIG 0xAC
#define START_CONVERT 0xEE
#define READ_TEMP 0xAA
void writeConfigDS1621(uint8_t u8_i) {
write2I2C1(DS1621ADDR, ACCESS_CONFIG, u8_i);
}
void startConversionDS1621() {
write1I2C1(DS1621ADDR, START_CONVERT);
}
int16_t readTempDS161() {
uint8_t u8_lo, u8_hi;
int16_t i16_temp;
write1I2C1(DS1621ADDR, READ_TEMP);
read2I2C1 (DS1621ADDR, &u8_hi, &u8_lo);
i16_temp = u8_hi;
return ((i16_temp<<8)|u8_lo);
}
int main (void) {
int16_t i16_temp;
float f_tempC,f_tempF;
configBasic(HELLO_MSG);
configI2C1(400); //configure I2C for 400 KHz
writeConfigDS1621(0x00); //continuous conversion
startConversionDS1621(); //start conversions
while (1) {
DELAY_MS(1500);
i16_temp = readTempDS161();
f_tempC = i16_temp; //convert to floating point
f_tempC = f_tempC/256; //divide by precision
f_tempF = f_tempC*9/5 + 32;
printf("Temp is: 0x%0X, %4.4f (C), %4.4f (F)\n", i16_temp, (double) f_tempC, (double) f_tempF);
}
}