Bosch Sensortec Community

    Showing results for 
    Search instead for 
    Did you mean: 

    BNO055 no-motion interrupt not cleared

    BNO055 no-motion interrupt not cleared


    Hi all,

    I configured the BNO055 to trigger a no-motion interrupt according to some threshold and duration value.
    The interrupt is triggered after duration amount of time being at rest position, which is what I expect.

    However, when moving the sensor arround with accelerations clearly above the threshold (threshold is 1 LSB), the interrupt pin stays high instead of going low. From the diagram in the data sheet page 43 I read that the interrupt is cleared once the slope is above the threshold. Is this assumption correct?

    When I clear the interrupt by writing to the SYS_TRIGGER (0x3F) register bit RST_INT (6),  the interrupt is cleared and stays low while the sensor is moving. When the sensor is at rest again, the interrupt is triggered after duration amount of time, but again is not cleared when moving again.

    What is the correct behaviour of this interrupt?

    I use the following API functions to configure the no-motion interrupt:

        bno055_ret = bno055_set_accel_any_motion_no_motion_axis_enable(BNO055_ACCEL_ANY_MOTION_NO_MOTION_X_AXIS, BNO055_BIT_ENABLE);
        bno055_ret += bno055_set_accel_any_motion_no_motion_axis_enable(BNO055_ACCEL_ANY_MOTION_NO_MOTION_Y_AXIS, BNO055_BIT_ENABLE);
        bno055_ret += bno055_set_accel_any_motion_no_motion_axis_enable(BNO055_ACCEL_ANY_MOTION_NO_MOTION_Z_AXIS, BNO055_BIT_ENABLE);
        bno055_ret += bno055_set_accel_slow_no_motion_thres(1);
        bno055_ret += bno055_set_accel_slow_no_motion_durn(0);
        bno055_ret += bno055_set_accel_slow_no_motion_enable(1);
        bno055_ret += bno055_set_intr_accel_no_motion(BNO055_BIT_ENABLE);
        bno055_ret += bno055_set_intr_mask_accel_no_motion(BNO055_BIT_ENABLE);


    Thanks for your help.

    8 REPLIES 8

    Community Moderator
    Community Moderator

    If you read the first paragrah of chapter 3.8.1 on page 40,  you will find the following description:

    The interrupt trigger is configured as raising edge and is latched on to the INT pin.  Once an interrupt occurs, the INT pin is set to high and will remain high until it is reset by host. 

    So, your understanding of INT mechanism is correct,  but the INT pin is latched which means it will not goes to low automatically even the INT condition is not fulfilled. 

    So your trigger to reset INT pin is mandatory here and correct behavior. 

    Ok, thanks for your explanation.

    But the IN_STA (0x37) register will always represent the INT status according to the INT condition, e.g. no-motion interrupt status  is 0 when moving again, right?

    Follow up question to the no-motion interrupt:

    If the sensor is moving at constant velocity (acceleration = 0) over some time, will the no-motion interrupt be triggered?
    I assume yes, because the slope (difference between two successive acceleration values) is zero.

    Is there a way to detect "real" no-motion (i.e. sensor being at rest within threshold) and not to trigger no-motion interrupt when sensor is moving at constant speed? I think any-motion interrupt will also not be triggered when moving with constant speed. Is there a way to use all 9-axis fused data to detect "real" no-motion?

    Please correct me if my assumptions are wrong.

    Yet another question, let's call it 3):

    3) Is the no-motion interrupt not retriggered after INT_STA readout or writing to RST_INT when the no-motion interrupt condition is still met?
    E.g. when the sensor is at rest without any movement, then no-motion interrupt is triggered. Then interrupt is reset/cleared by the host controller. Then the interrupt pin stays low (although no-motion condition is met). Is this the intended behaviour?


    4) General question to other interrupts. For the accel any-motion interrupt it says in chapter p.45 in the datasheet:

    "As soon as the slopes of all enabled axes fall or stay below this threshold for [AM_DUR +1] consecutive times the interrupt is cleared unless interrupt signal is latched."

    As you already mentioned above and in the data sheet, the interrupts are latched to the INT pint. Can you explain how to achieve clearance of the interrupt status/pin as soon as interrupt condition is no longer met when the interrupt signal is always latched to the INT pin? Can this latch mechanism be disabled?
    I am a bit confused about the notation in the data sheet, because it says interrupt is cleared but if it is latched then it is not cleared - the interrupt is always latched, hence the interrupt will never be cleared when interrupt condition is no longer met.

    Hopefully, this was not too confusing.