Here is some code that should work with your MCP9801. It is a stripped-down version of some code that does work.
Code:
ASM
ifndef __18F2321
error "18F2321 not selected"
endif
ENDASM
ASM
movlw 0x52 ; %0101 0010 = 2Mhz, internal osc block
movwf OSCCON
movlw 0x80 ; %1000 0000 = PLL disabled
movwf OSCTUNE
ENDASM
DEFINE OSC 4 ; We are running at 2, but there is no DEFINE for that
Define USE_LFSR 1
DEFINE I2C_HOLD 1
DEFINE I2C_SLOW 1
DataPin var portc.1
ClockPin var portc.0
LED VAR PORTB.5
TRISA = $FF
TRISB = $FF
TRISC = $FF
MCP9800_ADDR VAR BYTE
MCP9800_CONFIG VAR BYTE
ConfigByte VAR BYTe
TemperatureRaw VAR WORD
TempOutLSB VAR BYTE
TXBuffer VAR BYTE[5]
TempVar VAR BYTE
FinalTemp VAR BYTE
LEDCNTR VAR WORD
SensorErrorFlag VAR BYTE
TEMPERATURES var word
SerialNumber VAR WORD
FinalTempW VAR WORD
TRISB.5 = 0 ; LED pin
RES CON 0 ; low resolution
WDTCON = 1 ; Turn on the WDT
Gosub InitSensor
Gosub ReadSensor ; prime the pump
Pause 200 ; Really 400 msec
Main:
Gosub ReadSensor ; Do it again
Pause 500 ;Really 1 sec
; TEMPERATURE will be in TXBuffer[0]
Goto Main
InitSensor:
MCP9800_ADDR = %10010000
MCP9800_TEMPERATURE CON 0 ; Temperature register
MCP9800_CONFIGURATION CON 1 ; Configuration register
MCP9800_HYSTERESIS CON 2
MCP9800_LIMITSET CON 3
ONESHOT_OFF CON %00000000 ;bits for register configuration
ONESHOT_ON CON %10000000
RESOLUTION_9bits CON %00000000
RESOLUTION_10bits CON %00100000
RESOLUTION_11bits CON %01000000
RESOLUTION_12bits CON %01100000
INT_MODE CON %00000010
SHUTDOWN_OFF CON %00000000
SHUTDOWN_ON CON %00000001
Start:
IF !RES THEN
MCP9800_CONFIG = oneshot_off | Resolution_9bits |shutdown_off
ELSE
MCP9800_CONFIG = oneshot_off | Resolution_12bits |shutdown_off
ENDIF
; Tempout = (TEMPERATURE.LowByte >>5 ) * 125 ; resolution 11 bits
; TempOut = (TEMPERATURE.LowByte >>6 ) * 25 ; resolution 10 bits
INIT_MCP9800:
IF !CLOCKPIN or !DATAPIN then goto SensorError
i2cwrite DATAPIN,CLOCKPIN,MCP9800_ADDR,[mcp9800_configuration,mcp9800_config],SensorError
i2cwrite DATAPIN,CLOCKPIN,MCP9800_ADDR,[mcp9800_temperature],SensorError
PIE1.3 = 1
Pause 10 ; 20
RETURN
;--------------------------------------------------------------------------------
ReadSensor:
SensorErrorFlag.1 = 1 ; set to error condition before we start
IF !CLOCKPIN or !DATAPIN then goto SensorError
i2cread DATAPIN,CLOCKPIN,MCP9800_ADDR,[TemperatureS.HighByte,TEMPERATURES.LowByte],SensorError
IF RES = 0 THEN
IF TempOutLSB.7 THEN TemperatureS.Highbyte = (TemperatureS.HighByte + 1) ; round up
FinalTemp = TemperatureS.HighByte ;
IF FinalTemp = 0 THEN FinalTemp.7 = 1 ; Zero degrees is negative
TxBuffer[0]= FinalTemp
TxBuffer[1] = 0 - FinalTemp
SensorErrorFlag.1 = 0
ELSE
FinalTempW.HighByte = TemperatureS.HighByte ;
FinalTempW.LowByte = Temperatures.LowByte
IF FinalTempW = 0 THEN FinalTempW.15 = 1 ; Zero degrees is negative
TxBuffer[0]= FinalTempW.HighByte
TempVar = FinalTempW.Lowbyte >> 4
TXBuffer[1]= TempVar *66/10
TxBuffer[2] = 0 - (TxBuffer[0] - TXBuffer[1])
SensorErrorFlag.1 = 0
ENDIF
Goto ENDRoutine
SensorError:
LED = 0
PAUSE 100 ; 200
LED = 1
PAUSE 100
LED = 0
PAUSE 100
LED = 1
SensorErrorFlag.0 = 1 ; Restart if error, but flash LED
TXBuffer[0] = $F0 + SensorErrorFlag
ENDRoutine:
Return
;-------------------------------------------------------------------------------------------------------
ASM
ORG 0x8FE ; More than Half full
nop
ENDASM
Bookmarks