Hi Ed,

Here is a code snip for driving the Intersema MS5541.
Code:
  
'************************* Defines *****************************

DEFINE OSC 4               'Define crystal frequency
DEFINE DEBUG_REG PORTB     'Debug output pin port 
DEFINE DEBUG_BIT 6         'Debug output pin bit 
DEFINE DEBUG_BAUD 19200    'Debug baud rate 
DEFINE DEBUG_MODE 0        'Debug mode: 0 = True, 1 = Inverted 


'************** Intersema Variables *********************************   
C1          var   word        ' 5540 Pressure sensitivity 
C2          var   word        ' 5540 Pressure Offset 
C3          var   word        ' 5540 Temp Coef of pressure sensitivity
C4          var   word        ' 5540 Temp Coef of Pressure Offset
C5          var   word        ' 5540 Reference temperature
C6          var   word        ' 5540 temp coef of Temp reading
' C1 to C6 are in EEROM as VAL.byte0, VAL.byte1 from 108 to 159
D1          var   word        ' raw pressure word from Intersema sensor
D2          var   word        ' raw temperature word 
D1Flag      var   bit
W1          var   word        ' coefficient from 5540
W2          var   word        ' coefficient from 5540
W3          var   word        ' coefficient from 5540
W4          var   word        ' coefficient from 5540
' W1 to W4 are NOT stored in EEROM - they are not needed again.
dT          var   long        ' intermediate calc value
dT1         var   long        ' intermediate calc value
dT2         var   long
UT1         var   word        ' Calibration temperature
II          var   byte     'used ONLY within Intersema routines
IJ          var   byte
IK          var   byte
IL          var   byte
ILoop       var   word
CalFlag     var   bit   'EEROM 99.  Used to reduce wear on EEROM

'General purpose Intersema and DS1629 RTC/Temperature variables
ClkChk      var   word     '= 8192 if IntRC clock is exactly on frequency
TimeFlag    var   bit
TempRead    var   word
CntRem      var   word
CntPerC     var   word

IW          var   long
IX          var   long
IY          var   long
IZ          var   long

T2          var   long   'Second order Temperature correction
P2          var   long   'Second order Pressure correction
Offset      var   long   
Senstvty    var   long
Pressure    var   long  ' 
Celsius     var   long  'a LONG allows negative temperatures 

goto endofsubroutines      ' jump subroutines at startup
'*************************** Subroutines *****************************

ResetIntersema: 
   ' need 32768 @ 50% for Intersema on CCP2.
   TRISB = %10000001 : TRISD.7 = 0  'DIn, DOut & SClk
   high presspwr : pause 100 : hpwm 2, 127, 32767  : pause 50
   shiftout din, sclk, 0, [85, 85, 0\5]  ' Sense of Din is IN to 5541
   pauseus 100
return

FetchWord:
   shiftin dout, sclk, 2, [ij, ii, ik\1] 
   'IJ is hi byte, II is lo byte, IK is a dummy and discarded  
return

CalSensor:
   read 99, calflag  : if calflag = 1 then calsensordone
   debug 13, 10, "Fetch Intersema data", 13, 10
      ' This fetches and unpacks the factory calibration coefficients 
      ' from W1 ~ W4.  W values need not be stored.
      ' These bitmaps are unpacked into the 6 working coefficients
      ' C1 to C6 which must be stored in EEROM for later use.  
'W1
   gosub resetintersema
   shiftout din, sclk, 0, [87, 1\5]    ' Send W1 pattern to all sensors
   gosub fetchword                     ' get reply
   W1.byte0 = ii
   W1.byte1 = ij

'W2    
   gosub resetintersema
   shiftout din, sclk, 0, [215, 0\5]       ' Send W2 pattern 
   gosub fetchword
   W2.byte0 = ii
   W2.byte1 = ij

'W3
   gosub resetintersema
   shiftout din, sclk, 0, [55, 1\5]       ' Send W3 pattern
   gosub fetchword
   W3.byte0 = ii
   W3.byte1 = ij

'W4    
   gosub resetintersema
   shiftout din, sclk, 0, [183, 0\5]       ' Send W4 pattern 
   gosub fetchword
   W4.byte0 = ii
   W4.byte1 = ij

'Unpack W1 ~ W4 into C1 ~ C6 coefficients 
'C1
    C1 = W1 >> 3
    write 108, c1.byte0
    write 109, c1.byte1
'C2
    C2 = ((W1 & %0000000000000111) << 10) + (W2 >> 6)
    write 110, c2.byte0
    write 111, c2.byte1
'C3
    C3 = W3 >> 6
    write 112, c3.byte0
    write 113, c3.byte1
'C4    
    C4 = W4 >> 7
    write 114, c4.byte0
    write 115, c4.byte1
'C5
    C5 = ((W2 & %0000000000111111) << 6) + (W3 & %0000000000111111)
    write 116, c5.byte0
    write 117, c5.byte1
'C6
    C6 = W4 & %0000000001111111
    write 118, c6.byte0
    write 119, c6.byte1 
      
'   high pgc : pause 1
'   debug "Intersema Factory data ", $0D, $0A, "W1 = ,"_
'   , #w1, ",  W2 = ,", #w2, ",  W3 = ,", #w3, ",  W4 =  ,", #w4, $0D, $0A
'   debug "Derived coefficients", $0D, $0A, "C1 = ,", #C1, ",  C2 = ,", #C2,_
'    ",  C3 = ,", #C3, ",  C4 = ,", #c4, ",  C5 = ,", #C5, ",  C6 = ,", #C6.byte0,_
'     $0D, $0A

'   read 99, calflag : if calflag = 0 then write 99, 1
   CalSensorDone:
return

ReadIntersema:   '
' D1 is Pressure - D2 is Temperature
' Uses LONG datatype to handle negative temperatures
' This routine reads the sensor and returns Pressure word 
' and Celsius long
' A, II, IJ, W and X are all destroyed

   gosub resetintersema
'D1
   shiftout din, sclk, 0, [47, 0\5]       ' Select D1 pattern
   While dout = 1 : wend        'Convert5541Delay:  
   gosub fetchword    
   ' This returns ii = lobyte, ij = hibyte from the sensor 
   D1.byte0 = ii
   D1.byte1 = ij
'D2    
   shiftout din, sclk, 0, [79, 0\5]       ' Select D2 pattern 
   While dout = 1 : wend
   gosub fetchword
   D2.byte0 = ii
   D2.byte1 = ij

CalcTempPress: '32 bit signed arithmetic version.  Handles negatives.
      read 108, c1.byte0  
      read 109, c1.byte1
      read 110, c2.byte0
      read 111, c2.byte1
      read 112, c3.byte0
      read 113, c3.byte1
      read 114, c4.byte0
      read 115, c4.byte1
      read 116, c5.byte0
      read 117, c5.byte1
      read 118, c6.byte0
      
      'formulae for DS5541 are NOT the same as for DS5540
      ut1 = 8*c5 + 10000  
      dt = d2 - ut1 
      Celsius = 200 + dt*(c6 + 100)/2048 
      offset = c2 + ((c4 - 250)*dt)/4096 +10000
      senstvty = c1/2 + ((c3 + 200)*dt)/8192 + 3000
      pressure = (senstvty * (d1 - offset))/4096 + 1000    

      'NOT applying second order temperature correction in this 
      'version.  
      'Note 2nd order correction formula ambiguity in datasheet.  

      if celsius < 0 then 'high bit of 32 bit number is set
         temp2 = 1000 - celsius
      else
         temp2 = 1000 + celsius
         d[17] =  temp2.byte0
         d[18] = temp2.byte1
      endif
   if calflag = 0 then
      high pgc : pause 1
      debug "MS5541 Celsius = ", sdec Celsius/10, ".", dec1 celsius//10, _
      ", Pressure = ", dec pressure, " mBar, recorded as ",_
      dec temp2, 13, 10 
   endif
return

   
EndOfSubRoutines:
'*********************** Initialise *****************************
             
FetchDepth:
    gosub readintersema
    'debug "T2 = ", dec temp2, 13, 10
    debug dec (temp2 - 1000)/10, ".", dec1 (temp2 - 1000)//10, _
    ", ", #pressure, " mBar", 13, 10

      'this returns Pressure & Celsius, both words.
            hpwm 2, 0,0       'turn off Mclk

ShutDown:
   gosub shutdownmemory
   gosub lowestpower
   end
   
ZZZZZ:
HTH
Brian