Hi, we have an issue with the BMA400 sensor, especially with the implementation of the orientation change interrupt, as we understand the step to implement this interruption are:
1. Enabled INT_CONFIG0.orientch_init = 1
2. Enable Axes
3. Select Data source
4. Set reference update
5. Set stability mode
6. Set threshold
7. Set stability threshold
8. Set interrupt duration
9. Set int_orientch_refx/y/z
10. Enabled interruptions
The problem is that, once we read the status interruption register, interruption is not detected, even when we turn the device up and down.
If its possible and you can help us with a receipt for orientation change interrupt initialization and the proper way to use the sensor to activate the alarm, would be really helpful.
Please double check the following things:
1. if sensor is already put into normal or low power mode
2. if the interrupt pin is configured correctly (push-pull, active high / low). if you don't need see physical interrupt, it can be ignored.
3. when you use orientation stability mode, please make sure you only select 1 or 2 axes. otherwise it is very difficult to be triggered.
4. i have some reference register value which is working properly at our side for orientation interrupt.
reg 0x35 = 0xA5
reg 0x36 = 0x1E
reg 0x37 = 0x06
reg 0x38 = 0x0A
reg 0x39 ~ 0x3E ignored
This is about the Orientation Change interrupt. The older datasheet (BMA400 rev1.2) describes the "stability" function, but the document is difficult to understand. (For interested readers, the "stability" function adds an additional requirement to the Orientation Change interrupt evaluation: the new orientation must remain "stable", within plus or minus the stability_thres for the entire time of orient_duration. If the acceleration value is not "stable", then the interrupt will not fire. This function was deleted from the BMA400 datasheet after rev1.2, but it still exists in silicon.) I wanted to test this function, which is how I found this post with your reference register values. It works, but there is a problem.
I'm using Development Desktop and the BMA400 evaluation board from Bosch. I loaded your settings and tried them. They work almost perfectly, but sometimes the interrupt does not fire. After playing for a few minutes, I now understand why.
When multiple axes are enabled, the interrupt engine evaluates each axis. Then it performs an "AND" operation to determine whether the interrupt should fire. This means that ALL enabled axes must satisfy the criteria, instead of ANY enabled axis.
For example, your register settings activate X and Z axes. When I tilt the evaluation board, the interrupt fires (usually). This is because X and Z change. However, when I quickly flip the board over, the interrupt does not fire. This is because Z has changed, but X is still the same. This is 100% repeatable.
The use of the "AND" operation explains why this interrupt is very unreliable when X, Y, and Z are all enabled. This would be so much better if the interrupt engine used an "OR".
Is there a way to reconfigure the interrupt engine to use an "OR" operation instead of an "AND" operation? Or is this hardwired in the silicon?
Sorry for the delay of answering your questions.
This feature logic was hard coded in BMA400 ASIC. We are not able to change it now.