You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
The text was updated successfully, but these errors were encountered:
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.
The text was updated successfully, but these errors were encountered: