
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
'----------------------------------------------------------------------------------------------------' '***********************************************************************' '* WINDT SYSTEMS *' '* CMPS03 16 bit bearing read v1.0 for CCIMU1.1 with CCISB *' '* H.J. WINDT *' '* 2004 *' '***********************************************************************' '----------------------------------------------------------------------------------------------------' 'This software, with the C-Control Main Unit 1.1 mounted on the C-Control starterboard,' 'will read the 16 bit bearing from the compass CMPS03 and display the bearing on a terminal program.' 'Port 15 will be used as the sda port for I2C communication.' 'Port 16 will be used as the scl port for I2C Communication.' 'For demonstration purpose use a terminal program like the one I found >>' 'RS232 TERMINAL at www.b-kainka.de/pcmessfaq.htm' 'Feel free to use and share this software.' '----------------------------------------------------------------------------------------------------' '*************** INS and OUTS **************' define sda port[15] define scl port[16] '*******************************************' '**************** VARIABLES ****************' define i2c_byte byte[1] define d7 bit[8] define d0 bit[1] define i2c_error bit[9] define i2c_high_byte byte[3] define i2c_low_byte byte[4] define i2c_word word[2] define loop byte[5] '*******************************************' '**************** CONSTANTS ****************' '*******************************************' '****************** SETUP ******************' '*******************************************' '***************** PROGRAM *****************' #start gosub get_cmps03_bearing_word print"Bearing = ";i2c_word goto start '*******************************************' '*************** SUBROUTINES ***************' #get_cmps03_bearing_word i2c_error = 0 gosub start_i2c i2c_byte = &b11000000 'CMPS03 ADDRESS + WRITE' for loop = 1 to 8 sda = d7 gosub scl_pulse i2c_byte = i2c_byte shl 1 next gosub ack_i2c i2c_byte = 2 'CMPS03 REGISTER' for loop = 1 to 8 sda = d7 gosub scl_pulse i2c_byte = i2c_byte shl 1 next gosub ack_i2c gosub restart_i2c i2c_byte = &b11000001 'CMPS03 ADDRESS + READ' for loop = 1 to 8 sda = d7 gosub scl_pulse i2c_byte = i2c_byte shl 1 next gosub ack_i2c for loop = 1 to 8 'CMPS03 16 BIT BEARING HIGH BYTE' d0 = sda gosub scl_pulse if loop < 8 then i2c_byte = i2c_byte shl 1 next i2c_high_byte = i2c_byte deact sda sda = 0 gosub scl_pulse deact sda for loop = 1 to 8 'CMPS03 16 BIT BEARING LOW BYTE' d0 = sda gosub scl_pulse if loop < 8 then i2c_byte = i2c_byte shl 1 next i2c_low_byte = i2c_byte deact sda sda = 0 gosub scl_pulse gosub stop_i2c if i2c_error then goto get_cmps03_bearing_word if i2c_word < 0 or i2c_word > 3599 then goto get_cmps03_bearing_word return #start_i2c sda = 0 scl = 0 return #restart_i2c deact sda deact scl sda = 0 scl = 0 return #stop_i2c deact scl deact sda return #scl_pulse deact scl #wait if scl = 0 then goto wait deact scl scl = 0 return #ack_i2c deact sda if sda <> 0 then i2c_error = 1 goto scl_pulse '*******************************************' '****************** DATA *******************' '*******************************************' |
| Antwort schreiben |