help reading adxl312


+ Reply to Thread
Results 1 to 12 of 12
  1. #1
    Join Date
    Jul 2011
    Posts
    21

    Default help reading adxl312

    hi,
    i am having trouble reading acceleration data from adxl312, this accelerometer is similar to adxl345. below is my code, it doesn't work, no matter how much i shake it i get only 0 reading. i would really appreciate any help..
    i am working with pic18f4550
    thanks
    Code:
    include "modedefs.bas"
    DEFINE OSC 48
    rx var porta.3
    tx var porta.4
    data_in var porta.5
    data_out var porte.0
    CLOCK var porte.1
    cs var porte.2
    adxl_data_x0 var word
    adxl_data_x1 var word 
    
    
    pause 100
    
    high CS
    SEROUT tx,T9600,["ADXL 312 Test...",10]
        high CLOCK
        low cs
        shiftout data_out, CLOCK, 2, [%0011000100100000]
        high cs  
    
        high CLOCK
        low cs
        shiftout data_out, CLOCK, 2, [%0010111010000000]
        high cs      
        
        high CLOCK
        low cs
        shiftout data_out, CLOCK, 2, [%0010111100000000]
        high cs
    
        high CLOCK
        low cs
        shiftout data_out, CLOCK, 2, [%0010110000001010]
        high cs
    
        high CLOCK
        low cs
        shiftout data_out, CLOCK, 2, [%0010110100001000]
        high cs
        
    main:
        pause 10    
        
        high CLOCK
        low cs
        shiftout data_out, CLOCK, 2, [%10110011]
        shiftin data_in, CLOCK, 6, [adxl_data_x1\13]
        high CS
    
        high CLOCK
        low cs
        shiftout data_out, CLOCK, 2, [%10110010]
        shiftin data_in, CLOCK, 6, [adxl_data_x0\13]
        high CS       
        
        SEROUT tx,T9600,["START",10]
        SEROUT tx,T9600,[#adxl_data_x0,10]
        SEROUT tx,T9600,[#adxl_data_x1,10]
        SEROUT tx,T9600,["END",10]
    goto main

  2. #2
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869

    Default Re: help reading adxl312

    are you sure you are running at 48Mhz?
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  3. #3
    Join Date
    Jul 2011
    Posts
    21

    Default Re: help reading adxl312

    thanks for you reply
    i am using 20Mhz crystal if i define osc 20 then i get garbage from serout so i changed it to 48
    is it wrong?

  4. #4
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869

    Default Re: help reading adxl312

    Is the posted code all of it? Did you do any configuring? Not sure you need to, just trying to see where to start looking in the datasheet to be able to answer. In the mean time, here is a quick easy test for if the speed is correct:

    Code:
    main:
    toggle "some output with an LED connected"
    pause 500
    goto main
    Of course you still need all setup stuff like define osc and such, but if the speed is correct you should get a blink at 60 hz.
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  5. #5
    Join Date
    Jul 2011
    Posts
    21

    Default Re: help reading adxl312

    when i put the above code (@ osc 48) led remained on and never turned off, so i modified it and led blinks at 1hz
    Code:
    test:
    high porta.0
    pause 250
    low porta.0
    pause 250
    goto test
    when i changed osc to 20 i got led to blink at 2hz..

  6. #6
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869

    Default Re: help reading adxl312

    Ok, first my apoligies, you should have gotton 1 hz with the code I posted. NOT 60 Hz. if the LED never turned off, well that is confusing. Maybe a typo somewhere?

    On to more important stuff. with your code as posted (pause 250) you should get 2 hz. Is that what you are getting? pause 250 equals 2 Hz with OSC 20? If this is so, then I think you need to have OSC 20 as your define. Heres why I know:

    pause uses OSC define to generate delays in software based on the OSC value. So when OSC matches actual pic speed the pauses will be the correct amount of time. 250 mSec on then 250 mSec of is 2 Hz.

    So assuming make sure your DEFINE OSC is correct. Of course that doesn't address the fact that you say you get junk from serout when OSC is 20.
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  7. #7
    Join Date
    Jul 2011
    Posts
    21

    Default Re: help reading adxl312

    sorry i messed up the test results, this is the result i got, tested it twice

    test program
    test:
    high porta.0
    pause 500
    low porta.0
    pause 500
    goto test

    result at osc 48
    led on off duration is exactly 1 second

    result at osc 20
    led on off duration is twice

    so i think define osc is correct.

    i found this code(in document section) from sparkfun:http://www.sparkfun.com/products/9814
    it is for adxl345 and uses spi but its in c and for atmega..

  8. #8
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869

    Default Re: help reading adxl312

    Well I am sorry it wasn't as simple as the clock being wrong, But now you know how to test it. I actually do this on all my programs before going any further just to verify the clock/osc and me are all at the same speed.
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  9. #9
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default Re: help reading adxl312

    The SHIFTOUT command sends 8-bits unless otherwise specified.
    To send a 16-bit constant, you'll need to specify the number of bits.

    shiftout data_out, CLOCK, 2, [%0011000100100000\16]
    DT

  10. #10
    Join Date
    Jul 2012
    Posts
    2

    Default Re: help reading adxl312

    Hon Cluster. that you have succeeded. your device to work? what were the errors?

  11. #11
    Join Date
    Jul 2011
    Posts
    21

    Default Re: help reading adxl312

    Hello igorkhod,
    later on i did not use adxl312 instead i used adxl345 because adxl312 was not available in small quantity.
    adxl312 is similar to adxl345, if i can remember correctly adxl312 have more resolution than adxl345.

    if you are working with adxl312 first try to read device ID. below code is for adxl345

    i2c_out VAR BYTE 'data to sent over I2C bus

    i2c_in VAR BYTE[2] 'data received over I2C bus

    i2c_ack VAR BIT 'acknowledgement bit

    loop:
    GOSUB I2C_START 'Start Condition
    i2c_out = $A6
    GOSUB I2C_TX 'Send data in “i2c_out”
    i2c_out = $00
    gosub I2C_TX
    GOSUB I2C_STOP 'Stop Condition

    GOSUB I2C_START 'Start Condition
    i2c_out = $A7
    GOSUB I2C_TX 'Send data in “i2c_out”
    GOSUB I2C_RX
    GOSUB I2C_STOP 'Stop Condition
    goto loop

    I2C_START: 'I2C start (start communication on I2C bus)

    HIGH SDA

    HIGH SCL

    LOW SDA

    LOW SCL

    RETURN



    I2C_STOP: 'I2C stop (terminate communication on I2C bus)

    LOW SDA

    HIGH SCL

    HIGH SDA

    PAUSE 1

    RETURN



    I2C_RX: 'I2C receive -> receive data from slave

    SHIFTIN SDA,SCL,0,[i2c_in[0]] 'Shift in first byte MSBpre

    SHIFTOUT SDA,SCL,1,[%0\1] 'Send acknowledge (ACK) = 0

    SHIFTIN SDA,SCL,0,[i2c_in[1]] 'Shift in second byte MSBpre

    SHIFTOUT SDA,SCL,1,[%1\1] 'Send not acknowledge (NACK) = 1

    RETURN



    I2C_TX: 'I2C transmit -> send data to the slave

    SHIFTOUT SDA,SCL,1,[i2c_out] 'Shift out “i2c_out” MSBfirst

    SHIFTIN SDA,SCL,0,[i2c_ack\1] 'Receive ACK bit
    'if i2c_ack = 1 then
    'SEROUT tx,T9600,["ACK NOT RECEIVED FOR"]
    'SEROUT tx,T9600,[#i2c_out]
    'SEROUT tx,T9600,[":"]
    'SEROUT tx,T9600,[#i2c_ack,10]
    'endif

    RETURN

  12. #12
    Join Date
    Jul 2012
    Posts
    2

    Default Re: help reading adxl312

    CLUSTER , Thanks for the reply. I have one more question. I ran into a problem. How to link pic16f877a and adxl345. Adxl 345 - is 3 volts. Pic - is 5 volts. How to decide this problem? Thanks in advance ..

Posting Permissions

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