Surely it would have been simpler to tell us ...
http://www.elektor.com/magazines/201....1673686.lynkx
Code:
ELEKTOR Project IR Thermometer ...
program IR_Thermometer
' * IR_Thermometer
' * Copyright C.TAVERNIER- 2010
' * for Elektor Magazine
' * www.tavernier-c.com
' *
' * Microchip PIC16F876A and
' * Melexis MLX90614 IR Thermometer
' LCD module connections
' LCD used in 4 bits mode on Port B
dim LCD_RS as sbit at RB2_bit
LCD_EN as sbit at RB3_bit
LCD_D4 as sbit at RB4_bit
LCD_D5 as sbit at RB5_bit
LCD_D6 as sbit at RB6_bit
LCD_D7 as sbit at RB7_bit
LCD_RS_Direction as sbit at TRISB2_bit
LCD_EN_Direction as sbit at TRISB3_bit
LCD_D4_Direction as sbit at TRISB4_bit
LCD_D5_Direction as sbit at TRISB5_bit
LCD_D6_Direction as sbit at TRISB6_bit
LCD_D7_Direction as sbit at TRISB7_bit
' End LCD module connections
' Variable definitions
dim SensorLow as byte ' Raw temp. low byte
SensorHigh as byte ' Raw temp. high byte
SensorRaw as word ' Raw temp. word
SensorRawCur as word ' Current raw temp.
SensorRawMax as word ' Max. raw temp.
SensorRawMin as word ' Min. raw temp.
Sensor as float ' Real temp (floating point)
SensorString as string[9]
DisplayString as string[9]
PEC as byte ' Control byte (read but not used)
com as byte ' MLX90614 command
PosDecPoint as byte ' Decimal point position
i as byte
' Procedure definition
' Read Temperature From MLX90614
' Input : com specify temp. to read
' Output : raw temp as a word
Sub procedure Read_temp(dim com as byte)
I2C1_Start() ' issue I2C start signal
I2C1_Wr(0x00) ' send address (device address + W)
I2C1_Wr(com) ' send command
I2C1_Repeated_Start() ' issue I2C signal repeated start
I2C1_Wr(0x01) ' send address (device address + R)
SensorLow = I2C1_Rd(1) ' Read temp. low byte (acknowledge)
SensorHigh = I2C1_Rd(1)' Read temp. high byte (acknowledge)
PEC = I2C1_Rd(1) ' Read PEC (not used) (acknowledge)
I2C1_Stop() ' issue I2C stop signal
SensorRaw = SensorLow + (SensorHigh << 8) ' Build temp. word
End sub
' Convert raw data in SensorRaw
' to displayable string in DisplayString
Sub procedure Convert_raw
Sensor = SensorRaw * 0.02 - 273.15 ' Raw temp to Celsius
FloatToStr (Sensor, SensorString) ' Float to string
PosDecPoint = Strchr (SensorString,".") ' Search for dec. point
For i = 0 to PosDecPoint+2 ' Limit display to two digits
DisplayString[i] = SensorString[i] ' after decimal point
Next i
DisplayString[PosDecPoint+3]= ""
DisplayString = DisplayString + " C"
End sub
' Main Program
main:
' Initialize I/O
PORTB = 0
TRISB = 0 ' All PORTB lines as output
ADCON1 = 0x0F ' Configure AN pins as digital I/O
' Initialize LCD display
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
' Initialize Min and Max object temp.
SensorRawMax = 0
SensorRawMin = 0xFFFF
' Initialize SMBus
I2C1_Init(100000) ' I2C/SMBus Clock speed 100 kHz
SETBIT (SSPSTAT,6) ' Force MSSP in SMBus mode
while true
Read_temp (0x06) ' Read ambiant temp.
Convert_raw
Lcd_Out(1,1,"T Amb. : ") ' Write ambiant temp in first row
Lcd_Out(1,10,DisplayString)
Read_temp (0x07) ' Read object temp.
SensorRawCur = SensorRaw ' Make obj. temp. current temp.
If SensorRawCur > SensorRawMax Then ' Is current temp. higher than max. temp.
SensorRawMax = SensorRawCur ' Make max. temp. equal current temp.
End if
If SensorRawCur < SensorRawMin Then ' Is current temp. lower than min. temp.
SensorRawMin = SensorRawCur ' Make min. temp. equal current temp.
End if
Convert_raw
Lcd_Out(2,1,"T Obj. : ") ' Write object temp in second row
Lcd_Out(2,10,DisplayString)
SensorRaw = SensorRawMax
Convert_raw
Lcd_Out(3,1,"T Max. : ") ' Write Max object temp in third row
Lcd_Out(3,10,DisplayString)
SensorRaw = SensorRawMin
Convert_raw
Lcd_Out(4,1,"T Min. : ") ' Write Min object temp in fourth row
Lcd_Out(4,10,DisplayString)
Delay_ms (1000)
wend
end.
Code:
IR_Thermometer Fuses for a PIC 16F876A
--------------------------------------
Oscillator : HS
Watchdog Timer : Disabled
Power Up Timer : Disabled
Brown Out Detect : Enabled
Low Voltage Program : Disabled
Data EE Protect : Disabled
In-Circuit Debugger : Disabled
Code Protect : None
FLASH Write Enable : Write Protection Off
Bookmarks