Skip to main content
Visitor II
October 9, 2017
Question

LIS2DE12 no interrupt and constant acceleration values

  • October 9, 2017
  • 2 replies
  • 2979 views
Posted on October 09, 2017 at 18:31

Hello,

Firs of all thank you for your time.

I'm currently working with a LIS2DE12 for its great low power current but unfortunately I'm not able to get any useful information from the device. I tried to active an interrupt in the idea to check movement in any direction (i just want an interrupt if the device is moving). It doesn't work but worst when I read the register of the acceleration i have always the same values (exactly the same even when moving, reversed, ...). I guess I have made some mistakes in my configuration but I was not able to find where is the problem. 

Just below my pseudo-code. The I2C function are working correctly (I'm able to communcate with the 

LIS2DE12 )

init:

Check  ACCEL_WHO_AM_I

write 0xC0 ACCEL_TEMP_CFG_REG // enable the measure of the temperature

write  0x57 

CTRL_REG1 //  100Hz & activate all the axes

write 0x00 

CTRL_REG2 // No filter

write 0x00 

CTRL_REG3 // No specific interrupt

write 0x80  

CTRL_REG4 // BDU activated for the temperature

write 0x08 

CTRL_REG5 //  Latch interrupt

write 0x00 

CTRL_REG6 // no INTERRUPT on int2

write 0b00101010 

INT1_CFG // Interrupt OR when over threshold

write 0x16 

INT1_THS  // Set the threshold

write 0x03 

INT1_DURATION // Set the duration (small one)

write 0x00 FIFO_CTRL_REG  // bypass mode

loop:

check if data available ( read STATUS_REG_AUX) then

   read ACCEL_OUT_X_H,ACCEL_OUT_Y_H,ACCEL_OUT_Z_H

check if INT1 == 1 then

      LED = 1 // to be able to see the interruption

I hope that I respected the rules of this forum.

kind regards,

Denis
    This topic has been closed for replies.

    2 replies

    ST Employee
    October 10, 2017
    Posted on October 10, 2017 at 11:06

    The STATUS_REG_AUX contains an information if new new temperature data are available, you should check STATUS_REG (27h) to get the information if new acceleration data are available and then read them.

    You can also share your complete code so I can check it.

    Visitor II
    October 10, 2017
    Posted on October 10, 2017 at 11:35

    Hi,

    Thx for your quick reply. I made a mistake in my pseudo code above I check STATUS_REG in my code.

    To be honest my code is quiet the same than the one above.

    main(){

       accelerometerInit();  // where all the config are made (pseudo code above)

       while(1){

       while(!isAccDataAvailable());   // checl STATUS_REG

       delay(100);

       accelerometerAcquire(&ax,&ay,&az);

       delay(100);

       if(INT1){            // check the interruption pin

          yellowOn();

          interruptClear();

          delay(500);

       }

       else

          ledOff();

       }

    }

    char isAccDataAvailable(){

       unsigned char a = i2c1_read1ByteRegister(ACCEL_ADDR, ACCEL_STATUS_REG);

       return ((a & 0x0F) == 0x0F);

    }

    void accelerometerAcquire(float *x, float *y, float *z){

       delay(10);

       *x = convertAccel( i2c1_read1ByteRegister(ACCEL_ADDR, ACCEL_OUT_X_H) );

       delay(10);

       *y = convertAccel( i2c1_read1ByteRegister(ACCEL_ADDR, ACCEL_OUT_Y_H) );

       delay(10);

       *z = convertAccel( i2c1_read1ByteRegister(ACCEL_ADDR, ACCEL_OUT_Z_H) );

    }

    void interruptClear(){   // Read the INT1_SRC to clear the interruption if triggered.

       i2c1_read1ByteRegister(ACCEL_ADDR, ACCEL_INT1_SRC);

    }

    The configuration above are correct for my purpose ?

    ST Employee
    October 11, 2017
    Posted on October 11, 2017 at 15:50

    Can you please disable BDU (w

    rite 0x00 to 

    CTRL_REG4) and try it?

    Visitor II
    October 12, 2017
    Posted on October 12, 2017 at 02:27

    I am having the same problem.  My goal is to continually receive interrupts (level changes) on the INT1 pin any time the device is moving, however I'm not receiving any interrupts at all.  I must have an error somewhere, can you please point me in the right direction?  I've set my processor to detect any level change on its interrupt pin that is connected to the LIS2DE12 INT1 pin, then I am applying the values below to the LIS2DE12.  The INT1 pin never changes level.  Can you tell me if I should pull the pin up or down externally, and do I need to do anything else to get a level change on the INT1 pin when the device moves?  

    write_register_value(CTRL_REG1, 0x57); // Turn on the sensor, enable X, Y and Z, ODR = 100Hz

    write_register_value(CTRL_REG2, 0x00); // High-pass filter disabled

    write_register_value(CTRL_REG3, 0x00); // No specific interrupt

    write_register_value(CTRL_REG4, 0x00); // FS = +/- 2g, disable BDU

    write_register_value(CTRL_REG5, 0x08); // Interrupt 1 pin latched, must read INT1_SRC (0x31) to clear it

    write_register_value(INT1_THS, 0x16); // Very low threshold, 0 = default

    write_register_value(INT1_DURATION, 0x03); // Minimum event duration

    write_register_value(INT1_CFG, 0x2A); // 00101010b, Interrupt OR when over threshold

    write_register_value(FIFO_CTRL_REG, 0x00); // bypass mode
    Visitor II
    October 12, 2017
    Posted on October 12, 2017 at 10:24

    Hello,

    According to the datasheet the ''LPEN'' must be set to 1.  

    You should write 0x5F in the REG1, as I understand it.

    I hope it will help you, but as it's not working for me I doubt.

    0690X00000608UbQAI.png

    Denis
    Visitor II
    October 12, 2017
    Posted on October 12, 2017 at 15:52

    Thank you for pointing that out.  I gave it a try, but unfortunately it did not make a difference.  Please post back if you get it working and I will do the same.