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:
    Code:
    '
    ' 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
    
    _MCP9800_Init:
        BusOut cMCP9800_ADDRESS_WRITE, [cMCP9800_CONFIGURATION, cMCP9800]
        BusOut cMCP9800_ADDRESS_WRITE, [cMCP9800_TEMPERATURE]
        Return
    
    '--------------------------------------------------------------------------------
    ' 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
    
    _MCP9800_ReadTemp:
        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
        EndIf
        If MCP_wRawData.14 = 1 Then
            MCP_fTemperature = MCP_fTemperature + 0.25
        EndIf
        If MCP_wRawData.13 = 1 Then
            MCP_fTemperature = MCP_fTemperature + 0.125
        EndIf
        If MCP_wRawData.12 = 1 Then
            MCP_fTemperature = MCP_fTemperature + 0.0625
        EndIf
        Return
    
    '--------------------------------------------------------------------------------
    ' The main program loop starts here
    '
    Main:
        MCP9800_Init()
    
        While
            MCP9800_GetTemperature(MCP_fTemperature)
    
            HRSOut "Temperature = ", Dec2 MCP_fTemperature, 13
            DelayMS 500
        Wend
    Below is the program running within the Proteus simulator:


    The above simulation files can be downloaded from here:
    MCP9800_Proteus_Design.zip


  • Recent Activity

    rcurl-44

    PICKitPlus Forum

    Thread Starter: evan

    PICkitPlus PICkitPlus is a total replacement for the existing Microchip PICkit2™ and PICkit3™ Windows GUI software. The PICkitPlus software ...

    rcurl Yesterday, 20:28 Go to last post
    John Drew-26

    Request for Assistance - PIC16F15323

    Thread Starter: gdesantis

    After having successfully programmed various enhanced PIC16 MCUs, I plan to use a PIC16F15323 in a new application. As always, I first start with a...

    John Drew Yesterday, 23:03 Go to last post