Proton BASIC Compiler - MCP9800 Temperature Sensor Interface

  • 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 ""                                      ' 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


    It's Christmas, how about a bit of giving?

    Thread Starter: johngb

    How about sending some Christmas to Les as donations for all the support and continued improvements he has provided throughout the year. You can...

    joesaliba Yesterday, 13:43 Go to last post

    SERIN/SEROUT how low can you go?

    Thread Starter: davroski

    (PIC is 16F18344 on 32 MHz internal clk). I want to use SERIN/SEROUT (hardware UART already in use) at lower than 300 bd - preferably as close to...

    towlerg Yesterday, 18:41 Go to last post

    Clean up old versions

    Thread Starter: rcurl

    I just installed and after the install was done I had two shortcuts on my desktop. It appears I have two working versions installed at the...

    towlerg Yesterday, 13:17 Go to last post