Code:
'****************************************************************
'* Name : hmc5883l.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 29/04/2011 *
'* Version : *
'* Notes : *
'* : 12f1822
'* :
'
'****************************************************************
#CONFIG
cfg1 = _FOSC_INTOSC
cfg1&= _WDTE_ON
cfg1&= _PWRTE_OFF
cfg1&= _MCLRE_ON
cfg1&= _CP_OFF
cfg1&= _CPD_OFF
cfg1&= _BOREN_ON
cfg1&= _CLKOUTEN_OFF
cfg1&= _IESO_ON
cfg1&= _FCMEN_ON
__CONFIG _CONFIG1, cfg1
cfg2 = _WRT_OFF
cfg2&= _PLLEN_OFF
cfg2&= _STVREN_ON
cfg2&= _BORV_19
cfg2&= _LVP_OFF
__CONFIG _CONFIG2, cfg2
#ENDCONFIG
osccon=$6A '4 mhz
anselA=0 'dig i/o
trisA=1110
pause 2000
serout2 porta.0,84, ["ready",13,10]
lata.0=1
SDA var porta.2 'transceives to/from SDA
SCL var porta.4 '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
X VAR byte 'x sensor measured value
Y VAR byte 'y sensor measured value
Z VAR byte 'z sensor measured value
READX VAR WORD
READY VAR WORD
READZ VAR WORD
brads VAR Word 'angle in brads
degr VAR Word 'angle in degrees
Radians VAR Word 'value calculated using X ATN -Y
' -----[ Main Routine ]-------------------------------------------------------
PAUSE 50 ' Give sensor needed power up time
I2CWRITE SDA,SCL,WRITE_DATA,MODE,[0,1,Cont_Mode] ' Send continuous output command
PAUSE 10
DO
GOSUB GetRawReading ' Get RAW Compass reading
serout2 porta.0,84, ["x ",SDEC x," y ",SDEC y ," z ",SDEC z,13,10]
brads = -x ATN -y ;
degr = brads */360 'convert to degrees
;serout2 porta.0,84, ["xy ",SDEC Radians ,","]
serout2 porta.0,84, ["xy ",DEC degr ,13,10]
brads = -x ATN -z ;
degr = brads */360 'convert to degrees
; serout2 porta.0,84, ["xz ",SDEC Radians ,","]
serout2 porta.0,84, ["xz ",DEC degr ,13,10]
brads = -y ATN -z
degr = brads */360 'convert to degrees
;serout2 porta.0,84, ["yz ",SDEC Radians ,","]
serout2 porta.0,84, ["yz ",DEC degr ,13,10]
PAUSE 2000
LOOP
' -----[ Subroutines ]--------------------------------------------------------
GetRawReading: 'Compass module subroutine
'Wait for new data to become available
I2CREAD SDA,SCL,READ_DATA, X_MSB,[READX,READZ,READY] 'Read the data starting at x_msb 3
x = readx >>2
Y = readY >>2
Z = readZ >>2
RETURN
Bookmarks