Open
Description
The following code causes a tokenization error, "Unknown target module. $STAMP directive not found," yet the $STAMP directive is clearly there and the same code tokenizes just fine in the BSE.
I do not know yet, why this code does not work in Parallax IDE, but we should try it in the PBASIC Tokenizer tester first, and if that works, I suspect some kind of character handling issue between the app and its tokenizer.
' ============================================================================
' HMC5883L_Demo.bs2 - This is a Demo program for the HMC5883L Compass
' Module (PN: 29133). It displays the compass heading north, east, south and west
' clockwise from north.
'
' Author.... (C) John A. Williams
'
' {$STAMP BS2p}
' {$PBASIC 2.5}
' ============================================================================
' -----[ Pins/Constants/Variables ]-------------------------------------------
SDA PIN 0 'P0 transceives to/from SDA
SCL PIN 1 'P1 sends clock pulses
WRITE_DATA CON $3C 'Used to perform a Write operation
READ_DATA CON $3D 'Used to perform a Read operation
MODE CON $02 'Read/Write Register, Selects the operating mode. Default = Single measurement
'Send $3C $02 $00 on power up to change to continuous measurement mode.
X_MSB CON $03 'Read Register, Output of X MSB 8-bit value.
X_LSB CON $04 'Read Register, Output of X LSB 8-bit value.
Z_MSB CON $05 'Read Register, Output of Z MSB 8-bit value.
Z_LSB CON $06 'Read Register, Output of Z LSB 8-bit value.
Y_MSB CON $07 'Read Register, Output of Y MSB 8-bit value.
Y_LSB CON $08 'Read Register, Output of Y LSB 8-bit value.
Cont_Mode CON $0
SCALEFACTOR CON 4081 'SCALEFACTOR = 65536 * (255/4095) = 4081
SCALEOFFSET CON 2048 'The output range of the HMC5883L is -2048 to 2047; therefore to get a 0 (LOWRANGE)to 4095 range
'to 4095 (HIGHRANGE) range 2048 must be added to the sensor value.
ATNFACTOR CON 127 'the ATN function input range is -127 TO 127. In order to get the positive scaled range of
'0 to 255 into the range of -127 to 127, 127 must be subtracted.
LOWRANGE CON 0 'see SCALEOFFSET
HIGHRANGE CON 4095 'see SCALEOFFSET
X VAR Word 'x sensor measured value
Y VAR Word 'y sensor measured value
Z VAR Word 'z sensor measured value
brads VAR Word 'angle in brads
degr VAR Word 'angle in degrees
azimuth VAR Word 'value calculated using X ATN -Y
' -----[ Main Routine ]-------------------------------------------------------
PAUSE 10 ' Give sensor needed power up time
I2COUT SDA, WRITE_DATA, MODE, [Cont_Mode] ' Send continuous output command
DO
GOSUB GetRawReading ' Get RAW Compass reading
'RAW X,Y,Z data...
DEBUG HOME, "RAW X,Y,Z", CR
DEBUG "X = ",11, SDEC x, CR
DEBUG "Y = ",11, SDEC y, CR
DEBUG "Z = ",11, SDEC z, CR ' Print angle
DEBUG CR
'Calculate Azimuth
GOSUB GetAzimuth
'Calculated Heading in Degrees
brads = azimuth 'get angle
degr = brads */ 361 'convert to degrees
DEBUG CR
DEBUG "Heading in NORTH, EAST, SOUTH, and WEST clockwise from NORTH:", CLREOL, CR, CR
DEBUG "Degree " ,11, SDEC degr, CR 'display degrees
GOSUB GetHeading
LOOP
' -----[ Subroutines ]--------------------------------------------------------
GetRawReading: 'Compass module subroutine
PAUSE 400 'Wait for new data to become available
I2CIN SDA, READ_DATA, X_MSB, [X.HIGHBYTE] 'Read the data starting at x_msb 3
I2CIN SDA, READ_DATA ,X_LSB, [X.LOWBYTE]
'Do the same for Z and Y:
I2CIN SDA, READ_DATA, Z_MSB, [Z.HIGHBYTE]
I2CIN SDA, READ_DATA ,Z_LSB, [Z.LOWBYTE]
I2CIN SDA, READ_DATA, Y_MSB, [Y.HIGHBYTE]
I2CIN SDA, READ_DATA ,Y_LSB, [Y.LOWBYTE]
RETURN
GetAzimuth:
'The output range of the HMC5883L is -2048 to 2047 and the input range of the ATN function
'is -127 to 127. I used the method to scale the output to the input discribed in Parallax's Smart
'Sensors Student Guide v1 starting on page 76.
'SCALEFACTOR = 65536 * (255/4095) = 4081
'SCALEOFFSET = 2048
'ATNFACTOR = 127
'LOWRANGE = 0
'HIGRANGE = 4095 (2048 + 2047 = 4095)
x = x + SCALEOFFSET
x = (x MIN LOWRANGE MAX HIGHRANGE) ** SCALEFACTOR - ATNFACTOR
y = y + SCALEOFFSET
y = (y MIN LOWRANGE MAX HIGHRANGE) ** SCALEFACTOR - ATNFACTOR
DEBUG "SCALED X,Y", CR
DEBUG "X = ",11, SDEC x, CR
DEBUG "Y = ",11, SDEC y, CR
azimuth = x ATN -y
DEBUG "Azimuth ",11, SDEC azimuth, CR ' display scaled azimuth
DEBUG "COS Azimuth ",11, SDEC COS azimuth, CR ' display scaled cos azimuth
RETURN
GetHeading:
'Gives a heading in North, South, East and West.
IF degr = 90 THEN
DEBUG "NORTH"
DEBUG CLREOL
ENDIF
IF degr = 0 THEN
DEBUG "EAST"
DEBUG CLREOL
ENDIF
IF degr = 270 THEN
DEBUG "SOUTH"
DEBUG CLREOL
ENDIF
IF degr = 180 THEN
DEBUG "WEST"
DEBUG CLREOL
ENDIF
RETURN