The LM75A is a very easy to use and robust small I2C temperature device. It is able to measure temperature in the range of -55° to +125°. Even if working with an I2C bus, I was able to use it in a very noisy environment (Central Heating system) at distance of between 5 to 10 meters using a shielded cable (standard 4 wires alarm shielded cable) and adding a small 100nF cap. directly on the LM75A.
Here, you can find the DATASHEET
http://www.semiconductors.philips.co...ts/LM75A_1.pdf
Example
You will find 2 examples:
Only integer values. No floating point calculation.
First we read the data from the sensor (Sensor address H00 and sensor register address 0 for Temperature Data)
As the LM75A is giving temp data on 11 bits, we have to suppress the last 5 bits (zeroes). To do this, we will shift right (>>)
The sign is retrieved from the first (MSB) bit. If zero, the sign is positive. As we shifted the DATA, the sign bit is now Bit 10. To get a usable temperature data, the calculation is then: DATA*0.125, which is the same as DATA/8. Divide by 8 is in fact just shifting again 3 bits right. Here we are... No floating point math!
Code:
THERM= BUSIN %10010001,0
THERM=THERM>>5 ' Suppress the last zeroes (>>5)
SIGN=THERM.10 ' Get the first MSB bit. Needed to interpret the sign
IF SIGN=0 THEN
THERM=THERM>>3 ' Divide by 8 for positive value (same as multiply by 0.125)
PRINT AT 1,1,"Temp= "
ELSE
THERM=(%11111111111-THERM)>>3 'Adapt calculation for negative value (2's complement)
PRINT AT 1,1,"Temp=-"
ENDIF
PRINT AT 1,7,DEC2 THERM,%11011111 ' And print 2 digits
Here again, we read data. But we do not use shifting to divide the DATA. We use the multiplying factor suggested by the DATASHEET. We also use new Floating Point variable . Note that the readings will not be increasing or decreasing linearly as each 'step' is 0.125°
Code:
THERM= BUSIN %10010001,0
THERM=THERM>>5 'Suppress the last zeroes (>>5)
SIGN=THERM.10 ' Get the first bit. Needed to interpret the sign
IF SIGN=0 THEN
VAL_THERM=THERM*0.125 'We multiply by 0.125 to get decimals
PRINT AT 1,1,"Temp= "
ELSE
VAL_THERM=(%11111111111-THERM)*0.125 ' Adapt calculation for negative value (2's complement)
PRINT AT 1,1,"Temp=-"
ENDIF
PRINT AT 1,7,DEC1 VAL_THERM
Conclusion
Those 2 examples show you also the cost of floating point math.
The first one compiles (PROTON+ 2.1.3) in 455 Words and 21 Variables used in the 16F628 from a possible 224 The second one (PROTON+ 2.1.3) in 835 Words and 51 Variables used in the 16F628 from a possible 224 The difference does not need any comments...
The program without floating point calculation
Code:
' Using a LM75A
' No Floating Point
' Olivier de Broqueville
Device 16F628
REMARKS On
REMINDERS OFF
Config INTRC_OSC_NOCLKOUT,PWRTE_ON,CP_OFF,WDT_ON,LVP_OFF,MCLRE_OFF,BODEN_ON
REMINDERS On
ALL_DIGITAL On
Declare XTAL=4
Declare WATCHDOG On
Declare LCD_INTERFACE 4
Declare LCD_LINES 2
Declare LCD_DTPIN PORTB.0
Declare LCD_ENPIN PORTA.4
Declare LCD_RSPIN PORTA.3
Declare SDA_PIN PORTA.1
Declare SCL_PIN PORTA.2
Declare SLOW_BUS On
Dim THERM As Word
Dim SIGN As Bit
DelayMS 100 ' Let PICŪstabilize
Clear
Cls
MAIN:
While 1=1 ' Do forever...
THERM= BusIn %10010001,0
THERM=THERM>>5 ' Suppress the last zeroes (>>5)
SIGN=THERM.10 ' Get the first bit. Needed to interpret the sign
If SIGN=0 Then
THERM=THERM>>3 ' Divide by 8 for positive value (same as multiply by 0.125)
Print At 1,1,"Temp= "
Else
THERM=(%11111111111-THERM)>>3 'Adapt calculation for negative value (2's complement)
Print At 1,1,"Temp=-"
EndIf
Print At 1,7,DEC2 THERM,%11011111
DelayMS 200
Wend
End
The program with floating point calculation
Code:
' Using a LM75A
' Floating point
' Olivier de Broqueville
Device 16F628
REMARKS On
REMINDERS OFF
Config INTRC_OSC_NOCLKOUT,PWRTE_ON,CP_OFF,WDT_ON,LVP_OFF,MCLRE_OFF,BODEN_ON
REMINDERS On
ALL_DIGITAL On
Declare XTAL=4
Declare WATCHDOG On
Declare LCD_INTERFACE 4
Declare LCD_LINES 2
Declare LCD_DTPIN PORTB.0
Declare LCD_ENPIN PORTA.4
Declare LCD_RSPIN PORTA.3
Declare SDA_PIN PORTA.1
Declare SCL_PIN PORTA.2
Declare SLOW_BUS On
Dim THERM As Word
Dim SIGN As Bit
Dim VAL_THERM As Float
Clear
Cls
MAIN:
While 1=1 ' Do forever...
THERM= BusIn %10010001,0
THERM=THERM>>5 'Suppress the last zeroes (>>5)
SIGN=THERM.10 ' Get the first bit. Needed to interpret the sign
If SIGN=0 Then
VAL_THERM=THERM*0.125
Print At 1,1,"Temp= "
Else
VAL_THERM=(%11111111111-THERM)*0.125 'Adapt calculation for negative value (2's complement)
Print At 1,1,"Temp=-"
EndIf
Print At 1,7,DEC1 VAL_THERM
DelayMS 200
Wend
End


Menu
Recent Articles


Using PDS with SPI GLCD based on ST7565R Controller
Graphic LCDs based on the ST7565 are cheaper then GLCDs with other controllers. SPI requires only four pins. If the circuit