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