MS5540C
SwordfishUser.MS5540C History
Hide minor edits - Show changes to output
Added line 2:
%center%http://www.ohararp.com/images/WEATHER_A.JPG"Easypic4 Dev Board"\\
Changed lines 10-13 from:
This module is setup to use the software shift commands to communicate via the SPI interface of the MS5540C pressure and temperature sensor. Overall, the sensor works great and I plan on integrating this with a SHT11 humidity and temperature sensor for some upcoming weather station work.
This sensor compares favorably with the SCP1000 pressure sensor, but has a much friendlier SMT package.
This sensor compares favorably with the SCP1000 pressure sensor, but has a much friendlier SMT package.
to:
This module is setup to use the software shift commands to communicate via the SPI interface of the MS5540C pressure and temperature sensor (Barometer). Overall, the sensor works great and I plan on integrating this with a SHT11 humidity and temperature sensor for some upcoming weather station work.
This sensor compares favorably with the SCP1000 pressure sensor, but has a much friendlier SMT package. I would recommend running an external 32.768 KHz oscillator as referenced in the schematic above, however, some forums have reported that the hardware pwm port of the pic could be configured to proved the necessary MCLK signal when running at a 50% duty cycle.
This sensor compares favorably with the SCP1000 pressure sensor, but has a much friendlier SMT package. I would recommend running an external 32.768 KHz oscillator as referenced in the schematic above, however, some forums have reported that the hardware pwm port of the pic could be configured to proved the necessary MCLK signal when running at a 50% duty cycle.
Added line 1:
%center%http://www.ohararp.com/images/WEATHER_A_SCH.JPG"MS5540C Schematic"\\
Added lines 8-12:
This module is setup to use the software shift commands to communicate via the SPI interface of the MS5540C pressure and temperature sensor. Overall, the sensor works great and I plan on integrating this with a SHT11 humidity and temperature sensor for some upcoming weather station work.
This sensor compares favorably with the SCP1000 pressure sensor, but has a much friendlier SMT package.
Changed line 5 from:
to:
%lfloat% http://www.sfcompiler.co.uk/wiki/uploads/StevenWright/download.gif
Changed lines 1-3 from:
to:
[[http://www.intersema.ch/products/guide/calibrated/ms5540c/ | MS5540C - Product Page]]
%lfloat% http://www.sfcompiler.co.uk/wiki/uploads/StevenWright/download.gif
[[http://www.intersema.ch/index.php?option=com_rubberdoc&view=doc&id=41&format=raw| MS5540C Datasheet]]
[[http://www.intersema.ch/products/documentation/application-notes/doc/9/raw | AN502 - C Code]]
%lfloat% http://www.sfcompiler.co.uk/wiki/uploads/StevenWright/download.gif
[[http://www.intersema.ch/index.php?option=com_rubberdoc&view=doc&id=41&format=raw| MS5540C Datasheet]]
[[http://www.intersema.ch/products/documentation/application-notes/doc/9/raw | AN502 - C Code]]
Changed lines 56-57 from:
to:
<<<<<<<
Changed lines 271-488 from:
to:
End =]
=======
!!! Module
=code [=
Module MS5540C
Include "UTILS.BAS"
Include "SHIFT.bas"
// DEFAULT MODULE OPTIONS - USER OPTIONS CAN OVERRIDE THESE VALUES...
#option MS_CLK = PORTC.3
#option MS_SDI = PORTC.4
#option MS_SDO = PORTC.5
// Validate CLK pin...
#if IsOption(MS_CLK) And Not IsValidPortPin(MS_CLK)
#error MS_CLK, "Invalid option. CLK must be a valid port pin."
#endif
// Validate SDI pin...
#if IsOption(MS_SDI) And Not IsValidPortPin(MS_SDI)
#error MS_SDI, "Invalid option. DI must be a valid port pin."
#endif
// Validate SDO pin...
#if IsOption(MS_SDO) And Not IsValidPortPin(MS_SDO)
#error MS_SDO, "Invalid option. DO must be a valid port pin."
#endif
// Bring port and pin options into the module...
Dim CLK As MS_CLK.MS_CLK@
Dim SDI As MS_SDI.MS_SDI@
Dim SDO As MS_SDO.MS_SDO@
// PRIVATE VARIABLES
Dim W1 As Word
Dim W2 As Word
Dim W3 As Word
Dim W4 As Word
Dim D1 As Word
Dim D2 As Word
Dim C1 As Word
Dim C2 As Word
Dim C3 As Word
Dim C4 As Word
Dim C5 As Word
Dim C6 As Word
{
****************************************************************************
* Name : WaitOnDoutFall(PRIVATE)
* Purpose : Wait for SDO line of MS5540C to go low
****************************************************************************
}
Function WaitOnDoutFall() As Boolean
Dim IDX As Word
IDX = 0
While TRUE
If SDI = 1 Then
DelayMS(20)
Inc(IDX)
If IDX > 1024 Then
result = FALSE
Break
EndIf
ElseIf SDI = 0 Then
result = TRUE
Break
EndIf
Wend
End Function
{
****************************************************************************
* Name : Reset_MS(PRIVATE)
* Purpose : Reset the MS5540C
****************************************************************************
}
Sub Reset_MS()
Shift.Out(LSB_FIRST,$55,8)
Shift.Out(LSB_FIRST,$05,8)
Shift.Out(LSB_FIRST,$00,5)
End Sub
{
****************************************************************************
* Name : getW(PRIVATE)
* Purpose : get W1,W2,W3,W4 calibration data
****************************************************************************
}
Sub getW()
Shift.Out(LSB_FIRST,$57,8)
Shift.Out(LSB_FIRST,$01,5)
W1 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$D7,8)
Shift.Out(LSB_FIRST,$00,5)
W2 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$37,8)
Shift.Out(LSB_FIRST,$01,5)
W3 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$B7,8)
Shift.Out(LSB_FIRST,$00,5)
W4 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
End Sub
{
****************************************************************************
* Name : getD(PRIVATE)
* Purpose : get D1,D2 - digital pressure and temperature data
****************************************************************************
}
Sub getD()
// get D1
Shift.Out(LSB_FIRST,$2F,8)
Shift.Out(LSB_FIRST,$00,2)
Shift.Out(LSB_FIRST,$00,2)
If WaitOnDoutFall() Then
D1 = Shift.In(MSB_POST,16)
EndIf
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
//get D2
Shift.Out(LSB_FIRST,$4F,8)
Shift.Out(LSB_FIRST,$00,3)
Shift.Out(LSB_FIRST,$00,1)
If WaitOnDoutFall() Then
D2 = Shift.In(MSB_POST,16)
EndIf
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
End Sub
{
****************************************************************************
* Name : ConvertWtoC(PRIVATE)
* Purpose : Convert calibration data to coefficients
****************************************************************************
}
Sub ConvertWtoC()
Dim x As Word
Dim y As Word
C1 = (W1 >> 1) And $7FFF
x = (W3 << 6) And $0FC0
y = W4 And $003F
C2 = x Or y
C3 = (W4 >> 6) And $03FF
C4 = (W3 >> 6) And $03FF
x = (W1 << 10) And $0400
y = (W2 >> 6 ) And $03FF
C5 = x Or y
C6 = W2 And $003F
End Sub
{
****************************************************************************
* Name : CalcPT(PUBLIC)
* Purpose : Calculate pressure and temperature
****************************************************************************
}
Public Sub CalcPT(ByRef PRES As Float, ByRef TEMP As Float)
Dim UT1 As Float
Dim dT As Float
Dim OFF As Float
Dim SENS As Float
Dim X As Float
getW() //Get the calibration data
getD() //Get pressure and temperature data
ConvertWtoC() //Get calibration coefficients
UT1 = 8 * C5 + 20224 //Calculate Calibration Temperature
dT = D2 - UT1 //Calculate actual temperature
TEMP = DT * (C6 + 50)
TEMP = (200 + (TEMP / 1024)) / 10.0 //Temperature in C
TEMP = (TEMP * 9 /5) + 32 //Temperature in F
OFF = ((C4 - 512.0) * dT)
OFF = C2 * 4 + OFF / 4096
SENS = (C3 * dT) / 1024
SENS = C1 + SENS + 24576
X = SENS * (D1 - 7168.0)
X = X / 16384 - OFF
PRES = (((X * 10) / 32) + 2500) / 10.0 //millibars
PRES = PRES * 0.0295333727 //inches of mercury
End Sub
{
****************************************************************************
* Name : Init(PUBLIC)
* Purpose : Initialize the pins and MS5540C
****************************************************************************
}
Public Sub Init()
Shift.SetClock(CLK,TRUE) //initialise shiftOUT clock pin, IDLE HIGH
Shift.SetInput(SDI)
Shift.SetOutput(SDO) //initialise shiftOUT pin
Reset_MS()
End Sub
End =]
>>>>>>>
=======
!!! Module
=code [=
Module MS5540C
Include "UTILS.BAS"
Include "SHIFT.bas"
// DEFAULT MODULE OPTIONS - USER OPTIONS CAN OVERRIDE THESE VALUES...
#option MS_CLK = PORTC.3
#option MS_SDI = PORTC.4
#option MS_SDO = PORTC.5
// Validate CLK pin...
#if IsOption(MS_CLK) And Not IsValidPortPin(MS_CLK)
#error MS_CLK, "Invalid option. CLK must be a valid port pin."
#endif
// Validate SDI pin...
#if IsOption(MS_SDI) And Not IsValidPortPin(MS_SDI)
#error MS_SDI, "Invalid option. DI must be a valid port pin."
#endif
// Validate SDO pin...
#if IsOption(MS_SDO) And Not IsValidPortPin(MS_SDO)
#error MS_SDO, "Invalid option. DO must be a valid port pin."
#endif
// Bring port and pin options into the module...
Dim CLK As MS_CLK.MS_CLK@
Dim SDI As MS_SDI.MS_SDI@
Dim SDO As MS_SDO.MS_SDO@
// PRIVATE VARIABLES
Dim W1 As Word
Dim W2 As Word
Dim W3 As Word
Dim W4 As Word
Dim D1 As Word
Dim D2 As Word
Dim C1 As Word
Dim C2 As Word
Dim C3 As Word
Dim C4 As Word
Dim C5 As Word
Dim C6 As Word
{
****************************************************************************
* Name : WaitOnDoutFall(PRIVATE)
* Purpose : Wait for SDO line of MS5540C to go low
****************************************************************************
}
Function WaitOnDoutFall() As Boolean
Dim IDX As Word
IDX = 0
While TRUE
If SDI = 1 Then
DelayMS(20)
Inc(IDX)
If IDX > 1024 Then
result = FALSE
Break
EndIf
ElseIf SDI = 0 Then
result = TRUE
Break
EndIf
Wend
End Function
{
****************************************************************************
* Name : Reset_MS(PRIVATE)
* Purpose : Reset the MS5540C
****************************************************************************
}
Sub Reset_MS()
Shift.Out(LSB_FIRST,$55,8)
Shift.Out(LSB_FIRST,$05,8)
Shift.Out(LSB_FIRST,$00,5)
End Sub
{
****************************************************************************
* Name : getW(PRIVATE)
* Purpose : get W1,W2,W3,W4 calibration data
****************************************************************************
}
Sub getW()
Shift.Out(LSB_FIRST,$57,8)
Shift.Out(LSB_FIRST,$01,5)
W1 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$D7,8)
Shift.Out(LSB_FIRST,$00,5)
W2 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$37,8)
Shift.Out(LSB_FIRST,$01,5)
W3 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$B7,8)
Shift.Out(LSB_FIRST,$00,5)
W4 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
End Sub
{
****************************************************************************
* Name : getD(PRIVATE)
* Purpose : get D1,D2 - digital pressure and temperature data
****************************************************************************
}
Sub getD()
// get D1
Shift.Out(LSB_FIRST,$2F,8)
Shift.Out(LSB_FIRST,$00,2)
Shift.Out(LSB_FIRST,$00,2)
If WaitOnDoutFall() Then
D1 = Shift.In(MSB_POST,16)
EndIf
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
//get D2
Shift.Out(LSB_FIRST,$4F,8)
Shift.Out(LSB_FIRST,$00,3)
Shift.Out(LSB_FIRST,$00,1)
If WaitOnDoutFall() Then
D2 = Shift.In(MSB_POST,16)
EndIf
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
End Sub
{
****************************************************************************
* Name : ConvertWtoC(PRIVATE)
* Purpose : Convert calibration data to coefficients
****************************************************************************
}
Sub ConvertWtoC()
Dim x As Word
Dim y As Word
C1 = (W1 >> 1) And $7FFF
x = (W3 << 6) And $0FC0
y = W4 And $003F
C2 = x Or y
C3 = (W4 >> 6) And $03FF
C4 = (W3 >> 6) And $03FF
x = (W1 << 10) And $0400
y = (W2 >> 6 ) And $03FF
C5 = x Or y
C6 = W2 And $003F
End Sub
{
****************************************************************************
* Name : CalcPT(PUBLIC)
* Purpose : Calculate pressure and temperature
****************************************************************************
}
Public Sub CalcPT(ByRef PRES As Float, ByRef TEMP As Float)
Dim UT1 As Float
Dim dT As Float
Dim OFF As Float
Dim SENS As Float
Dim X As Float
getW() //Get the calibration data
getD() //Get pressure and temperature data
ConvertWtoC() //Get calibration coefficients
UT1 = 8 * C5 + 20224 //Calculate Calibration Temperature
dT = D2 - UT1 //Calculate actual temperature
TEMP = DT * (C6 + 50)
TEMP = (200 + (TEMP / 1024)) / 10.0 //Temperature in C
TEMP = (TEMP * 9 /5) + 32 //Temperature in F
OFF = ((C4 - 512.0) * dT)
OFF = C2 * 4 + OFF / 4096
SENS = (C3 * dT) / 1024
SENS = C1 + SENS + 24576
X = SENS * (D1 - 7168.0)
X = X / 16384 - OFF
PRES = (((X * 10) / 32) + 2500) / 10.0 //millibars
PRES = PRES * 0.0295333727 //inches of mercury
End Sub
{
****************************************************************************
* Name : Init(PUBLIC)
* Purpose : Initialize the pins and MS5540C
****************************************************************************
}
Public Sub Init()
Shift.SetClock(CLK,TRUE) //initialise shiftOUT clock pin, IDLE HIGH
Shift.SetInput(SDI)
Shift.SetOutput(SDO) //initialise shiftOUT pin
Reset_MS()
End Sub
End =]
>>>>>>>
Added lines 1-3:
%lfloat% http://www.intersema.ch/images/stories/technical/ms5540.jpg
Changed line 267 from:
End =]
to:
End =]
Added lines 50-264:
!!! Module
=code [=
Module MS5540C
Include "UTILS.BAS"
Include "SHIFT.bas"
// DEFAULT MODULE OPTIONS - USER OPTIONS CAN OVERRIDE THESE VALUES...
#option MS_CLK = PORTC.3
#option MS_SDI = PORTC.4
#option MS_SDO = PORTC.5
// Validate CLK pin...
#if IsOption(MS_CLK) And Not IsValidPortPin(MS_CLK)
#error MS_CLK, "Invalid option. CLK must be a valid port pin."
#endif
// Validate SDI pin...
#if IsOption(MS_SDI) And Not IsValidPortPin(MS_SDI)
#error MS_SDI, "Invalid option. DI must be a valid port pin."
#endif
// Validate SDO pin...
#if IsOption(MS_SDO) And Not IsValidPortPin(MS_SDO)
#error MS_SDO, "Invalid option. DO must be a valid port pin."
#endif
// Bring port and pin options into the module...
Dim CLK As MS_CLK.MS_CLK@
Dim SDI As MS_SDI.MS_SDI@
Dim SDO As MS_SDO.MS_SDO@
// PRIVATE VARIABLES
Dim W1 As Word
Dim W2 As Word
Dim W3 As Word
Dim W4 As Word
Dim D1 As Word
Dim D2 As Word
Dim C1 As Word
Dim C2 As Word
Dim C3 As Word
Dim C4 As Word
Dim C5 As Word
Dim C6 As Word
{
****************************************************************************
* Name : WaitOnDoutFall(PRIVATE)
* Purpose : Wait for SDO line of MS5540C to go low
****************************************************************************
}
Function WaitOnDoutFall() As Boolean
Dim IDX As Word
IDX = 0
While TRUE
If SDI = 1 Then
DelayMS(20)
Inc(IDX)
If IDX > 1024 Then
result = FALSE
Break
EndIf
ElseIf SDI = 0 Then
result = TRUE
Break
EndIf
Wend
End Function
{
****************************************************************************
* Name : Reset_MS(PRIVATE)
* Purpose : Reset the MS5540C
****************************************************************************
}
Sub Reset_MS()
Shift.Out(LSB_FIRST,$55,8)
Shift.Out(LSB_FIRST,$05,8)
Shift.Out(LSB_FIRST,$00,5)
End Sub
{
****************************************************************************
* Name : getW(PRIVATE)
* Purpose : get W1,W2,W3,W4 calibration data
****************************************************************************
}
Sub getW()
Shift.Out(LSB_FIRST,$57,8)
Shift.Out(LSB_FIRST,$01,5)
W1 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$D7,8)
Shift.Out(LSB_FIRST,$00,5)
W2 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$37,8)
Shift.Out(LSB_FIRST,$01,5)
W3 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$B7,8)
Shift.Out(LSB_FIRST,$00,5)
W4 = Shift.In(MSB_POST,16)
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
End Sub
{
****************************************************************************
* Name : getD(PRIVATE)
* Purpose : get D1,D2 - digital pressure and temperature data
****************************************************************************
}
Sub getD()
// get D1
Shift.Out(LSB_FIRST,$2F,8)
Shift.Out(LSB_FIRST,$00,2)
Shift.Out(LSB_FIRST,$00,2)
If WaitOnDoutFall() Then
D1 = Shift.In(MSB_POST,16)
EndIf
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
//get D2
Shift.Out(LSB_FIRST,$4F,8)
Shift.Out(LSB_FIRST,$00,3)
Shift.Out(LSB_FIRST,$00,1)
If WaitOnDoutFall() Then
D2 = Shift.In(MSB_POST,16)
EndIf
Shift.Out(LSB_FIRST,$00,1) // to be compliant with the data sheet
End Sub
{
****************************************************************************
* Name : ConvertWtoC(PRIVATE)
* Purpose : Convert calibration data to coefficients
****************************************************************************
}
Sub ConvertWtoC()
Dim x As Word
Dim y As Word
C1 = (W1 >> 1) And $7FFF
x = (W3 << 6) And $0FC0
y = W4 And $003F
C2 = x Or y
C3 = (W4 >> 6) And $03FF
C4 = (W3 >> 6) And $03FF
x = (W1 << 10) And $0400
y = (W2 >> 6 ) And $03FF
C5 = x Or y
C6 = W2 And $003F
End Sub
{
****************************************************************************
* Name : CalcPT(PUBLIC)
* Purpose : Calculate pressure and temperature
****************************************************************************
}
Public Sub CalcPT(ByRef PRES As Float, ByRef TEMP As Float)
Dim UT1 As Float
Dim dT As Float
Dim OFF As Float
Dim SENS As Float
Dim X As Float
getW() //Get the calibration data
getD() //Get pressure and temperature data
ConvertWtoC() //Get calibration coefficients
UT1 = 8 * C5 + 20224 //Calculate Calibration Temperature
dT = D2 - UT1 //Calculate actual temperature
TEMP = DT * (C6 + 50)
TEMP = (200 + (TEMP / 1024)) / 10.0 //Temperature in C
TEMP = (TEMP * 9 /5) + 32 //Temperature in F
OFF = ((C4 - 512.0) * dT)
OFF = C2 * 4 + OFF / 4096
SENS = (C3 * dT) / 1024
SENS = C1 + SENS + 24576
X = SENS * (D1 - 7168.0)
X = X / 16384 - OFF
PRES = (((X * 10) / 32) + 2500) / 10.0 //millibars
PRES = PRES * 0.0295333727 //inches of mercury
End Sub
{
****************************************************************************
* Name : Init(PUBLIC)
* Purpose : Initialize the pins and MS5540C
****************************************************************************
}
Public Sub Init()
Shift.SetClock(CLK,TRUE) //initialise shiftOUT clock pin, IDLE HIGH
Shift.SetInput(SDI)
Shift.SetOutput(SDO) //initialise shiftOUT pin
Reset_MS()
End Sub
End =]
Added lines 1-49:
!!! Code
=code [=
// DEVICE AND CLOCK
Device = 18F2620
Clock = 40
// DEVICE FUSE CONFIG
Config
OSC = HSPLL, // HS Oscillator
FCMEN = OFF, // Failsafe Clock Monitor Disabled
IESO = OFF, // Int/Ext Oscillator Switch Over Disabled
PWRT = OFF, // Power Up Timer Disabled
BOREN = OFF, // Brownout Reset Disabled
WDT = OFF, // Watchdog Timer Disabled
MCLRE = ON, // MCLR Enabled
WDTPS = 256, // 15000 x 4mS = 60 seconds
LVP = OFF, // Low_Voltage Programming
PBADEN = OFF // PORTB Digital
Include "UTILS.BAS"
Include "CONVERT.bas"
Include "SUART.bas"
Include "SHIFT.bas"
Include "MS5540C.bas"
Dim PRESSURE As Float
Dim TEMPERATURE As Float
Sub SETUP()
SetAllDigital()
SetTX(PORTB.7)
SetRX(PORTB.6)
SetBaudrate(sbr9600)
SetMode(umTrue)
End Sub
SETUP()
While TRUE
MS5540C.Init()
MS5540C.CalcPT(PRESSURE,TEMPERATURE)
UART.Write("Temperature = ",FloatToStr(TEMPERATURE),13,10)
UART.Write("Pressure = ",FloatToStr(PRESSURE),13,10)
UART.Write(13,10)
DelayMS(1000)
Wend
End=]
=code [=
// DEVICE AND CLOCK
Device = 18F2620
Clock = 40
// DEVICE FUSE CONFIG
Config
OSC = HSPLL, // HS Oscillator
FCMEN = OFF, // Failsafe Clock Monitor Disabled
IESO = OFF, // Int/Ext Oscillator Switch Over Disabled
PWRT = OFF, // Power Up Timer Disabled
BOREN = OFF, // Brownout Reset Disabled
WDT = OFF, // Watchdog Timer Disabled
MCLRE = ON, // MCLR Enabled
WDTPS = 256, // 15000 x 4mS = 60 seconds
LVP = OFF, // Low_Voltage Programming
PBADEN = OFF // PORTB Digital
Include "UTILS.BAS"
Include "CONVERT.bas"
Include "SUART.bas"
Include "SHIFT.bas"
Include "MS5540C.bas"
Dim PRESSURE As Float
Dim TEMPERATURE As Float
Sub SETUP()
SetAllDigital()
SetTX(PORTB.7)
SetRX(PORTB.6)
SetBaudrate(sbr9600)
SetMode(umTrue)
End Sub
SETUP()
While TRUE
MS5540C.Init()
MS5540C.CalcPT(PRESSURE,TEMPERATURE)
UART.Write("Temperature = ",FloatToStr(TEMPERATURE),13,10)
UART.Write("Pressure = ",FloatToStr(PRESSURE),13,10)
UART.Write(13,10)
DelayMS(1000)
Wend
End=]