#include <stdlib.h>
#include "board.h"
#include "ioutil.h"
#include "i2c.h"
#include "sensors/lm73.h"
#include "hif.h"
#include "xmpl.h"
bool do_measure;
bool process_command(int chr, lm73_ctx_t *plm73);
void reg_dump(lm73_ctx_t *plm73);
void xmpl_init(void)
{
#if HIF_TYPE == HIF_AT90USB
do
{
}
while (EOF == inchar);
#endif
}
int main(void)
{
lm73_ctx_t lm73;
uint16_t temp_raw;
float temp_fl;
uint8_t status, config;
int chr;
xmpl_init();
PRINTF(
"\n\rLM73 Temerature Sensor Example : %s : %ld bit/s\n\r",
BOARD_NAME, HIF_DEFAULT_BAUDRATE);
if (lm73.g.last_error != SENSOR_ERR_OK)
{
PRINTF(
"ERROR[%d]: init, addr=0x%x\n", lm73.g.last_error, LM73_ADDR);
}
else
{
PRINTF(
"OK: init, addr=0x%x\n", LM73_ADDR);
}
do_measure = 1;
while (1)
{
if (chr != -1)
{
do_measure = process_command(chr, &lm73);
}
if (do_measure)
{
temp_raw = lm73_get(&lm73);
temp_fl = lm73_scale(temp_raw);
config = lm73_byte_read(&lm73, LM73_PTR_CFG);
status = lm73_byte_read(&lm73, LM73_PTR_STATUS);
PRINTF(
"temp_raw=%d %f", temp_raw, temp_fl);
if ( (config & LM73_CFG_PWR_DOWN) )
{
}
if ((status & LM73_STATUS_DAV) == 0)
{
}
if (status & LM73_STATUS_TLOW)
{
}
if (status & LM73_STATUS_THIGH)
{
}
WAIT_MS(1000);
}
}
}
bool process_command(int chr, lm73_ctx_t *plm73)
{
uint8_t tmp, res;
uint16_t t_limit;
bool rv = 0;
if (chr == 'P')
{
tmp = lm73_byte_read(plm73, LM73_PTR_CFG);
tmp &= ~LM73_CFG_PWR_DOWN;
lm73_byte_write(plm73, LM73_PTR_CFG, tmp);
}
else if (chr == 'p')
{
tmp = lm73_byte_read(plm73, LM73_PTR_CFG);
tmp |= LM73_CFG_PWR_DOWN;
lm73_byte_write(plm73, LM73_PTR_CFG, tmp);
}
else if (chr == 'o')
{
PRINT(
"one shot conversion\n");
tmp = lm73_byte_read(plm73, LM73_PTR_CFG);
tmp |= (LM73_CFG_PWR_DOWN | LM73_CFG_ONE_SHOT);
lm73_byte_write(plm73, LM73_PTR_CFG, tmp);
rv = 1;
}
else if (chr == 'r')
{
PRINT(
"register dump\n");
reg_dump(plm73);
}
else if (chr == 'L')
{
PRINT(
"enter low limit in °C:");
PRINTF(
" %d°C, reg=0x%04x\n", t_limit, t_limit * LM73_TEMP_TO_REG_SCALE);
lm73_set_lower_limit(plm73, t_limit * LM73_TEMP_TO_REG_SCALE );
}
else if (chr == 'H')
{
PRINT(
"enter high limit in °C:");
PRINTF(
" %d°C, reg=0x%04x\n", t_limit, t_limit * LM73_TEMP_TO_REG_SCALE);
lm73_set_upper_limit(plm73, t_limit * LM73_TEMP_TO_REG_SCALE );
}
else if (chr == 'R')
{
PRINT(
"enter resolution [0,1,2,3]:");
tmp = lm73_byte_read(plm73, LM73_PTR_STATUS);
tmp &= ~LM73_STATUS_RES;
tmp |= ((res << 5) & LM73_STATUS_RES);
lm73_byte_write(plm73, LM73_PTR_STATUS, tmp);
}
else if (chr == 'a')
{
PRINT(
"clear alert bit\n");
tmp = lm73_byte_read(plm73, LM73_PTR_CFG);
tmp |= LM73_CFG_ALERT_RST;
lm73_byte_write(plm73, LM73_PTR_CFG, tmp);
rv = 1;
}
else if (chr == 'm' || chr == ' ')
{
PRINT(
"run measurement\n");
rv = 1;
}
else if (chr == 'h')
{
"P/p - power up/down\n"\
"o - one shot conversion\n"\
"r - print register dump\n"\
"H/L - set high/low limit\n"\
"R - set resolution\n"\
"a - reset alert bit\n"\
"m - run measurement\n"
);
}
return rv;
}
void reg_dump(lm73_ctx_t *plm73)
{
uint8_t tmp;
uint16_t temperature;
temperature = lm73_word_read(plm73, LM73_PTR_TEMP);
" TEMP[%d] = 0x%04x\n",
LM73_PTR_TEMP, temperature, temperature * LM73_REG_TO_TEMP_SCALE );
tmp = lm73_byte_read(plm73, LM73_PTR_CFG);
PRINTF(
" CONFIG[%d] = 0x%02x", LM73_PTR_CFG, tmp);
if (tmp & LM73_CFG_ONE_SHOT)
{
}
if (tmp & LM73_CFG_ALERT_EN)
{
}
if (tmp & LM73_CFG_ALERT_POL)
{
}
if (tmp & LM73_CFG_ALERT_RST)
{
}
if (tmp & LM73_CFG_PWR_DOWN)
{
}
temperature = lm73_word_read(plm73, LM73_PTR_THIGH);
PRINTF(
" THIGH[%d] = 0x%04x t_high = %f°C\n",
LM73_PTR_THIGH, temperature, temperature * LM73_REG_TO_TEMP_SCALE);
temperature = lm73_word_read(plm73, LM73_PTR_TLOW);
PRINTF(
" TLOW[%d] = 0x%04x t_high = %f°C\n",
LM73_PTR_TLOW, temperature, temperature * LM73_REG_TO_TEMP_SCALE);
tmp = lm73_byte_read(plm73, LM73_PTR_STATUS);
PRINTF(
" STATUS[%d] = 0x%02x", LM73_PTR_STATUS, tmp);
if (tmp & LM73_STATUS_DAV)
{
}
if (tmp & LM73_STATUS_TLOW)
{
}
if (tmp & LM73_STATUS_THIGH)
{
}
if (tmp & LM73_STATUS_ALERT)
{
}
PRINTF(
" 1%cbit", ((tmp & LM73_STATUS_RES) >> 5) +
'1');
PRINTF(
" ID[%d] = 0x%04x\n\n",
LM73_PTR_ID, lm73_word_read(plm73, LM73_PTR_ID));
}