PDA

View Full Version : I am so confused!



Ramius
- 3rd March 2012, 23:00
Hi All!
I am working with a program and after updating PBP and Micro Code Studio and for some reason I am not able to find answers except by asking here.

The code:

Include "Modedefs.bas"
define Loader_Used 1

'18F1320 EXT OSC RUNNING AT 20MHZ TO 40MHZ MCLR AS INPUT AND OSC PINS AS INPUTS
@ __CONFIG _CONFIG1H, _HS_OSC_1H & _FSCM_OFF_1H & _RC_OSC_1H
@ __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _BORV_27_2L
@ __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_32K_2H
@ __CONFIG _CONFIG3H, _MCLRE_OFF_3H
@ __CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_ON_4L & _STVR_ON_4L
@ __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L
@ __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
@ __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
@ __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
@ __CONFIG _CONFIG7H, _EBTRB_OFF_7H

DEFINE OSC 20 'Define crystal frequency

'********************* Declaired Pins **************************

Clk var PortA.0
Dout VAR PortA.1
Din var PortA.2
Sclk var PortA.3
Mclk var PortB.1

'************************* Defines *****************************

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
temp2 var word

' 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
d var BYTE[18]
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 : TRISA.3 = 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.
gosub resetintersema


The errors:

[ASM ERROR} DEPTH1.ASM (650) : Overwriting previous address contents (0001)
[ASM ERROR} DEPTH1.ASM (650) : Overwriting previous address contents (0000)
[ASM ERROR} DEPTH1.ASM (666) : Overwriting previous address contents (0003)
[ASM ERROR} DEPTH1.ASM (666) : Overwriting previous address contents (0002)
[ASM ERROR} DEPTH1.ASM (682) : Overwriting previous address contents (0007)
[ASM ERROR} DEPTH1.ASM (682) : Overwriting previous address contents (0006)The error number will change if you do a plain compile vs an IDC compile. The above errors are from a IDC compile.

Thanks in advance for you insights and assistance.


Ed

ScaleRobotics
- 4th March 2012, 04:01
With PBP3, it expects you to use the #config and #endconfig statments:



#config
;18F1320 EXT OSC RUNNING AT 20MHZ TO 40MHZ MCLR AS INPUT AND OSC PINS AS INPUTS
__CONFIG _CONFIG1H, _HS_OSC_1H & _FSCM_OFF_1H & _RC_OSC_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _BORV_27_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_32K_2H
__CONFIG _CONFIG3H, _MCLRE_OFF_3H
__CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_ON_4L & _STVR_ON_4L
__CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L
__CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
__CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
__CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
__CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
__CONFIG _CONFIG7H, _EBTRB_OFF_7H
#endconfig

Ramius
- 4th March 2012, 16:15
Thank you! This is all new to me!