Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed C12832 LM75B
main.cpp
- Committer:
- okano
- Date:
- 2010-01-16
- Revision:
- 0:ce7a8546502b
- Child:
- 1:6484448034e3
File content as of revision 0:ce7a8546502b:
/*
* NXP LM75B temperature sensor test
* www.nxp.com/pip/LM75B_2.html
*
* Expecting to use the pins 9 and 10 for I2C bus
* these pins should be pulled-up properly.
*
* The temperature read out will be shown on terminal on the PC screen.
*
* In this demo code, two LM75B devices can be driven.
* These two devices should have different I2C address setting
* using its address pins (LM75B's A0 to A2 (pins 5 to 7)).
* One LM75B should have all those pins tied to GND.
* And another should have the pin A0(pin7) pulled-up.
*
* From the software, those devices can be accessed by I2C addresses
* "0x90" and "0x92".
* It will not be as "0x90" and "0x91" because the address has
* 7 bit only and stuffed to left. So the "A0" setting become 0xX2.
* The LSB does not care because it will be set by I2C libraly when
* it transfer the data for read and write.
*/
#include "mbed.h"
//#include "SDFileSystem.h"
// LM75B IIC address
#define LM75B_ADDR 0x90
// LM75B registers
#define Conf 0x01
#define Temp 0x00
#define Tos 0x03
#define Thyst 0x02
DigitalOut led[] = { LED4, LED3, LED2, LED1 };
Serial pc(USBTX, USBRX); // tx, rx
I2C i2c( p9, p10 ); // sda, scl
void iic_write( char addr, char reg, char data );
char iic_read( char addr, char reg );
short iic_read_short( char addr, char reg );
void iic_error( void );
void init_temp_sensor( char dev_num );
float get_temp( char dev_num );
int main() {
int i;
init_temp_sensor( 0 );
init_temp_sensor( 1 );
while(1) {
pc.printf( " (%d) temp[0]=%6.3f, temp[1]=%6.3f(degree-C)\n", i++, get_temp( 0 ), get_temp( 1 ) );
wait( 1 );
}
}
void init_temp_sensor( char dev_num )
{
dev_num <<= 1;
iic_write( LM75B_ADDR | dev_num, Conf, 0x00 ); // configuration
pc.printf( "sensor[%d] : Conf register read out = 0x%02X\n", dev_num, iic_read( LM75B_ADDR | dev_num, Conf ) );
pc.printf( "sensor[%d] : Tos register read out = 0x%04X\n", dev_num, iic_read_short( LM75B_ADDR | dev_num, Tos ) );
pc.printf( "sensor[%d] : Thyst register read out = 0x%04X\n", dev_num, iic_read_short( LM75B_ADDR | dev_num, Thyst ) );
}
float get_temp( char dev_num )
{
dev_num <<= 1;
return ( (float)(iic_read_short( LM75B_ADDR | dev_num, Temp )) / 256.0 );
}
void iic_write( char addr, char reg, char data )
{
char cmd[2];
cmd[ 0 ] = reg;
cmd[ 1 ] = data;
if ( i2c.write( addr, cmd, 2) )
iic_error();
}
char iic_read( char addr, char reg )
{
char cmd;
int nack;
cmd = reg;
nack = i2c.write( addr, &cmd, 1); // Send command string
nack |= i2c.read( addr, &cmd, 1); // Send command string
if ( nack )
iic_error();
return ( cmd );
}
short iic_read_short( char addr, char reg )
{
char cmd[ 2 ];
int nack;
cmd[ 0 ] = reg;
nack = i2c.write( addr, cmd, 1); // Send command string
nack |= i2c.read( addr, cmd, 2); // Send command string
if ( nack )
iic_error();
return ( ((short)cmd[ 0 ]) << 8 | cmd[ 1 ] );
}
void iic_error( void )
{
pc.printf( "I2C error\n" );
for ( int i = 0; i < 4; i++ )
led[ i ] = i & 0x01;
wait ( 0.2 );
for ( int i = 0; i < 4; i++ )
led[ i ] = !(i & 0x01);
wait ( 0.2 );
}