Compass module and I2C bus


Closed Thread
Results 1 to 13 of 13

Hybrid View

  1. #1
    Join Date
    Jul 2006
    Location
    Surrey, BC, Canada
    Posts
    31

    Question Compass module and I2C bus

    Hello everybody. I bought compass module CMPS03 produced by Devantech. It’s employs I2C bus. I wrote a program but it doesn’t work properly. I expect readings from 0 to 359 but I have from 65535 to 49279 and readings are jumping. I’m novice in I2C bus technology, and I can’t figure out what is the problem. If someone has experience with this module, please let me know where I made a mistake or at least point me on a good tutorial of I2C bus.
    Thank you in advance
    Vladimir

    This is my code
    '---------------- Definitions---------------------------------------------
    define OSC 20
    '------------- Define LCD registers and bits------------------------------
    Define LCD_DREG PORTB 'Set LCD data port
    Define LCD_DBIT 0 'Set starting data bit
    Define LCD_RSREG PORTB 'Set LCD register select port
    Define LCD_RSBIT 4 'Set LCD register select bit
    Define LCD_EREG PORTB 'Set LCD enable port
    Define LCD_EBIT 5 'Set LCD enable bit
    define DEBUG_REG PORTC
    DEFINE DEBUG_BIT 3
    DEFINE DEBUG_BAUD 2400
    DEFINE DEBUG_MODE 0



    DPIN var PORTc.2 ' I2C data pin
    CPIN var PORTc.1 ' I2C clock pin
    bearing var word


    Main
    i2cread dpin,cpin,%11000000,1,[bearing]
    lcdout $fe, 1,"Bearing ", # bearing
    DEBUG " Compass Bearing ",DEC bearing,13,10

    pause 200

    goto main

  2. #2
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Have a look at this one for Basic Stamp
    http://www.robot-electronics.co.uk/htm/cmps2bs2.shtml
    http://www.robot-electronics.co.uk/htm/cmpsatom.shtml

    I don't think your software is the main problem.. double check your hardware first

    And probably you need to calibrate it first...
    http://www.robot-electronics.co.uk/htm/cmps_cal.shtml

    EDIT: AHHHH F*** You used a Word sized Variable... it must be a BYTE sized variable for this specific register
    Last edited by mister_e; - 8th December 2006 at 14:45.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  3. #3
    Join Date
    Jul 2006
    Location
    Surrey, BC, Canada
    Posts
    31


    Did you find this post helpful? Yes | No

    Default

    Hello Mister E.
    I tried everything, but it doesn’t work.
    I contacted to Devantech Co and Gerald said:
    “We've had this before.
    It's the PIC Basic Pro compiler.
    It does not correctly implement the I2C bus protocol (SCL bus hold).”

    Maybe exist other way to implement I2C protocol, or some sort of trick which can help me to overcome these limits
    Vladimir

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    mpffffff well if it works with a Stamp.. and i use I2CREAD/WRITE in 90% of my stuff without problem, i would probably look at something else first before to tell it's a compiler related stuff.

    Tell us your PIC model

    Post your config fuses settings

    post your schematic

    Once again, i doubt it's a PBP problem...
    Last edited by mister_e; - 11th December 2006 at 07:20.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  5. #5
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    what happened to your results when you change to a Byte Sized variable? you should read something between 0-255

    NOW if you want to use a word sized variable, YOU MUST READ register #2, not 1, so try...
    Code:
    ControlByte VAR BYTE
    Register VAR BYTE
    ControlByte = $C0
    Register = 2
    '
    '
    '
    '
    i2cread dpin,cpin,ControlByte,Register,[bearing.highbyte, bearing.lowbyte]
    and you should read something in a range of 0-3599
    <img src="http://www.picbasic.co.uk/forum/attachment.php?attachmentid=1249&stc=1&d=116582183 1">

    About now?
    Attached Images Attached Images  
    Last edited by mister_e; - 11th December 2006 at 07:30.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  6. #6
    Join Date
    Jul 2006
    Location
    Surrey, BC, Canada
    Posts
    31


    Did you find this post helpful? Yes | No

    Default

    Big Thank You Mister E.
    You and MELABs staff helped me to find mistake. I insert in my code two lines and now program works great. These are two lines:
    DEFINE I2C_HOLD 1
    DEFINE I2C_SLOW 1

    Maybe, someone will have the same problems in future, so I decided to post all my code. It works flawless.
    Thanks again
    Vladimir

    'PIC16f872
    '---------------- Definitions---------------------------------------------
    define OSC 20
    '------------- Define LCD registers and bits------------------------------
    DEFINE I2C_HOLD 1
    define I2C_SLOW 1
    Define LCD_DREG PORTB 'Set LCD data port
    Define LCD_DBIT 0 'Set starting data bit
    Define LCD_RSREG PORTB 'Set LCD register select port
    Define LCD_RSBIT 4 'Set LCD register select bit
    Define LCD_EREG PORTB 'Set LCD enable port
    Define LCD_EBIT 5 'Set LCD enable bit
    define DEBUG_REG PORTC 'Set DEBUD port
    DEFINE DEBUG_BIT 1 'Set DEBUG pin
    DEFINE DEBUG_BAUD 2400 'Set DEBUG baud rate
    DEFINE DEBUG_MODE 0 'Set DEBUG mode



    DPIN var PORTc.4 ' I2C data pin
    CPIN var PORTc.3 ' I2C clock pin
    bearing var word ' word size bearing value 0 - 359
    bearing1 var byte ' byte size bearing value 0 - 255

    Main:
    i2cread dpin,cpin,%11000000,2,[bearing.Highbyte,bearing.lowbyte]

    lcdout $fe, 1,"BEARING ",DEC BEARING/10

    i2cread dpin,cpin,%11000000,1,[bearing1]

    lcdout $fe, $c0,"Bearing ", dec bearing1

    DEBUG " Compass Bearing ", # bearing,13,10

    pause 20

    goto main

  7. #7
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Nice!

    Now forward the info to Devantech
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

Similar Threads

  1. HARDWARE I2C SAMPLE CODE question
    By Michael Wakileh in forum Code Examples
    Replies: 2
    Last Post: - 16th June 2009, 21:07
  2. Oscillator stops when touching with a wire
    By Wilbert Ingels in forum mel PIC BASIC Pro
    Replies: 23
    Last Post: - 25th April 2008, 08:51
  3. PIC16F877 I2C programme
    By cooqo in forum mel PIC BASIC
    Replies: 3
    Last Post: - 21st April 2008, 10:02
  4. I2C Comm with Digital Compass HMC6352
    By jihlein in forum Serial
    Replies: 10
    Last Post: - 9th April 2008, 22:25
  5. I2C compass - Philips KMZ51
    By barkerben in forum General
    Replies: 0
    Last Post: - 25th December 2005, 20:10

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts