• PicŪ Basic

  • MCP9800 Temperature Sensor Interface

    The MCP9800 digital temperature sensor converts temperatures between -55°C and +125°C. It provides an accuracy of ą1°C (maximum) from -10°C to +85°C. Interfacing to it is very straightforward via an I2C bus.

    The MCP9800 datasheet can be downloaded from here: MCP9800.pdf

    A suitable circuit for the MCP9800 temperature sensor is shown below:

    Click here for a larger image

    The Proton code for the interface is shown below:
    ' Interface to an MCP9800 temperature sensor
    ' Transmits the temperature (in degrees Centigrade) to the serial terminal
    ' For the Amicus18 board, which uses a PIC18F25K20 device operating at 64MHz
    ' Written by Les Johnson 06-01-2016
        Include "Amicus18.inc"                                      ' Configure the compiler to use a PIC18F25K20 at 64MHz. i.e. An Amicus18 board
        Declare Float_Display_Type = Fast                           ' Set for faster and more accurate floating point displaying
        Declare SDA_Pin PORTB.1                                     ' Setup the I2C SDA pin
        Declare SCL_Pin PORTB.0                                     ' Setup the I2C SCL pin
    ' Create some constants for the MCP9800 device
    $define cMCP9800_ADDRESS_WRITE       $90
    $define cMCP9800_ADDRESS_READ        $91
    $define cMCP9800_ALERT_ACTIVE_LOW    $00
    $define cMCP9800_ALERT_ACTIVE_HIGH   $04
    $define cMCP9800_COMP_MODE           $00
    $define cMCP9800_CONFIGURATION       $01
    $define cMCP9800_HYSTERESIS          $02
    $define cMCP9800_INT_MODE            $02
    $define cMCP9800_LIMITSET            $03
    $define cMCP9800_ONESHOT_OFF         $00
    $define cMCP9800_ONESHOT_ON          $80
    $define cMCP9800_SHUTDOWN_OFF        $00
    $define cMCP9800_SHUTDOWN_ON         $01
    $define cMCP9800_TEMPERATURE         $00
    $define cMCP9800_TSET_DEFAULT        $50
    $define cMCP9800_CONFIG_BITS         $64
    $define cMCP9800_RES_9bit            $00
    $define cMCP9800_RES_10bit           $20
    $define cMCP9800_RES_11bit           $40
    $define cMCP9800_RES_12bit           $60
    $define cMCP9800_FAULT_QUEUE_0       $00
    $define cMCP9800_FAULT_QUEUE_2       $08
    $define cMCP9800_FAULT_QUEUE_4       $10
    $define cMCP9800_FAULT_QUEUE_6       $18
    Symbol cMCP9800 = cMCP9800_ONESHOT_OFF | cMCP9800_RES_12bit | cMCP9800_FAULT_QUEUE_0 | cMCP9800_ALERT_ACTIVE_LOW | cMCP9800_COMP_MODE | cMCP9800_SHUTDOWN_OFF
    ' Create some variables
        Dim MCP_fTemperature As Float                               ' Holds the temperature
        Dim MCP_wRawData As Word                                    ' Used for reading data from the device
        GoTo Main                                                   ' Jump over the subroutines
    ' Setup the MCP9800 device
    ' Input     : None
    ' Output    : None
    ' Notes     : None
    $define MCP9800_Init() GoSub _MCP9800_Init
        BusOut cMCP9800_ADDRESS_WRITE, [cMCP9800_CONFIGURATION, cMCP9800]
    ' Interface to an MCP9800 I2C temperature sensor
    ' Input     : None
    ' Output    : pResult holds the temperature (in degrees Centigrade)
    ' Notes     : None
    $define MCP9800_GetTemperature(pResult) '
        GoSub _MCP9800_ReadTemp             '
        pResult = MCP_fTemperature
        BusIn cMCP9800_ADDRESS_READ,[MCP_wRawData.Byte0, MCP_wRawData.Byte1]
        MCP_fTemperature = MCP_wRawData.SByte0
        If MCP_wRawData.15 = 1 Then
            MCP_fTemperature = MCP_fTemperature + 0.5
        If MCP_wRawData.14 = 1 Then
            MCP_fTemperature = MCP_fTemperature + 0.25
        If MCP_wRawData.13 = 1 Then
            MCP_fTemperature = MCP_fTemperature + 0.125
        If MCP_wRawData.12 = 1 Then
            MCP_fTemperature = MCP_fTemperature + 0.0625
    ' The main program loop starts here
            HRSOut "Temperature = ", Dec2 MCP_fTemperature, 13
            DelayMS 500
    Below is the program running within the Proteus simulator:

    The above simulation files can be downloaded from here:

  • Recent Activity



    Thread Starter: normnet

    Coming soon a new IDE: FineLineIDE! Features include:<O:p</O:p Bracket lines linking If-Endif, For-Next etc.<O:p</O:p Tabbed explorer so...

    normnet Today, 09:31 Go to last post

    Compiler issue with 16F1829 and I2C-LCD

    Thread Starter: Henk57

    Spend this afternoon with a compiler issue; no error's, but my LCD give only first line with squares, no characters, nothing. If I flash an old .hex...

    Henk57 Today, 11:43 Go to last post

    New dual core dsPIC33CH PIC

    Thread Starter: normnet

    The Master core and Slave core can operate independently, and can be programmed and debugged separately during the application development. Both...

    Les Yesterday, 15:40 Go to last post