diff --git a/example/README.md b/example/README.md index c02f582..3b8d37f 100644 --- a/example/README.md +++ b/example/README.md @@ -17,11 +17,11 @@ This device supports two different interrupt "output pins," `INT1` and `INT2`. T ### file: single-click.c -Set up single-click detection +Set up single-click detection (no latching interrupt possible) ### file: double-click.c -Set up double-click detection +Set up double-click detection (no latching interrupt possible) ### file: adc.c diff --git a/example/adc.c b/example/adc.c index 44f92d9..57b342f 100644 --- a/example/adc.c +++ b/example/adc.c @@ -22,7 +22,7 @@ int main() { /* error handling */ } - /* reset device because it sometimes corrupts itself */ + /* reset device just in case */ if (lis3dh_reset(&lis)) { /* error handling */ } diff --git a/example/double-click.c b/example/double-click.c index 572c12c..f3f64f6 100644 --- a/example/double-click.c +++ b/example/double-click.c @@ -37,7 +37,7 @@ int main() { /* error handling */ } - /* reset device because it sometimes corrupts itself */ + /* reset device just in case */ if (lis3dh_reset(&lis)) { /* error handling */ } @@ -51,7 +51,8 @@ int main() { lis.cfg.mode = LIS3DH_MODE_HR; lis.cfg.range = LIS3DH_FS_2G; lis.cfg.rate = LIS3DH_ODR_400_HZ; /* minimum recommended ODR */ - lis.cfg.filter.mode = LIS3DH_FILTER_MODE_NORMAL; + + lis.cfg.filter.mode = LIS3DH_FILTER_MODE_NORMAL_REF; lis.cfg.filter.cutoff = LIS3DH_FILTER_CUTOFF_8; lis.cfg.filter.click = 1; /* enable filtering for CLICK function */ @@ -59,15 +60,14 @@ int main() { lis.cfg.click.yd = 1; /* enable Y axis double click */ lis.cfg.click.zd = 1; /* enable Z axis double click */ - lis.cfg.pin1.click = 1; /* enable click int src through pin1 */ - lis.cfg.int1.latch = 1; /* latch interrupt until INT1_SRC is read */ + lis.cfg.pin1.click = 1; /* enable CLICK INT through pin1 */ /* 1 LSb = 16 mg @ FS_2G * so a 0.3g 'shock' is 300/16 = 18.75 * However, the device can have up to +- 40mg read error, so add 40mg * 0.34g => 340/16 ~= 21 */ - lis.cfg.click_ths = 21; /* pretty sensitive */ + lis.cfg.click_ths = 21; /* Duration time is measured in N/ODR where: * --- N = The content of the intX_dur integer @@ -76,20 +76,25 @@ int main() { * 400 2.5 * * For ODR=400: - * time_limit of 75 ms = 75/2.5 = 30 - * time_latency of 40 ms = 40/2.5 = 16 + * time_limit of 75 ms = 75/2.5 = 30 + * time_latency of 40 ms = 40/2.5 = 16 * time_window of 500 ms = 500/2.5 = 200 * */ - lis.cfg.time_limit = 30; /* range: 0-127 */ - lis.cfg.time_latency = 16; /* range: 0-255 */ - lis.cfg.time_window = 200; /* range: 0-255 */ + lis.cfg.time_limit = 30; /* range: 0-127 */ + lis.cfg.time_latency = 16; /* range: 0-255 */ + lis.cfg.time_window = 200; /* range: 0-255 */ /* write device config */ if (lis3dh_configure(&lis)) { /* error handling */ } + /* read REFERENCE to set filter to current accel field */ + if (lis3dh_reference(&lis)) { + /* error handling */ + } + /* read CLICK_SRC to clear previous interrupts, if any */ if (lis3dh_read_click(&lis)) { /* error handling */ diff --git a/example/fifo.c b/example/fifo.c index 73b4882..4d180a1 100644 --- a/example/fifo.c +++ b/example/fifo.c @@ -16,23 +16,35 @@ int main() { lis.dev.sleep = usleep; lis.dev.deinit = i2c_deinit; + /* initialise LIS3DH struct */ if (lis3dh_init(&lis)) { /* error handling */ } + /* reset device just in case */ + if (lis3dh_reset(&lis)) { + /* error handling */ + } + lis.cfg.mode = LIS3DH_MODE_HR; lis.cfg.range = LIS3DH_FS_4G; lis.cfg.rate = LIS3DH_ODR_100_HZ; lis.cfg.fifo.mode = LIS3DH_FIFO_MODE_NORMAL; + /* write device config */ if (lis3dh_configure(&lis)) { /* error handling */ } + /* poll fifo register until it reports that the watermark level has + been reached, or that it has overwritten old data, whichever + happens first. */ if (lis3dh_poll_fifo(&lis)) { /* error handling */ } + /* read as many [x y z] sets as specified by watermark level (fth) */ + /* copy them to the fifo data struct given below as `fifo' */ if (lis3dh_read_fifo(&lis, &data)) { /* error handling */ } @@ -42,6 +54,7 @@ int main() { printf("x: %f, y: %f, z: %f\n", data.x[i], data.y[i], data.z[i]); } + /* deinitialise struct */ if (lis3dh_deinit(&lis)) { /* error handling */ } diff --git a/example/inertial-wakeup.c b/example/inertial-wakeup.c index be74b07..4036936 100644 --- a/example/inertial-wakeup.c +++ b/example/inertial-wakeup.c @@ -25,7 +25,7 @@ int main() { /* error handling */ } - /* reset device because it sometimes corrupts itself */ + /* reset device just in case */ if (lis3dh_reset(&lis)) { /* error handling */ } diff --git a/example/interrupts.c b/example/interrupts.c index 23b280c..b857210 100644 --- a/example/interrupts.c +++ b/example/interrupts.c @@ -22,11 +22,12 @@ int main() { lis.dev.sleep = usleep; lis.dev.deinit = i2c_deinit; + /* initalise LIS3DH struct */ if (lis3dh_init(&lis)) { /* error handling */ } - /* device sometimes corrupts itself, so reset .. */ + /* reset device just in case */ if (lis3dh_reset(&lis)) { /* error handling */ } @@ -40,25 +41,35 @@ int main() { lis.cfg.range = LIS3DH_FS_2G; lis.cfg.rate = LIS3DH_ODR_100_HZ; lis.cfg.fifo.mode = LIS3DH_FIFO_MODE_STREAM; - lis.cfg.fifo.trig = LIS3DH_FIFO_TRIG_INT1; /* trigger into INT1 */ - lis.cfg.pin1.wtm = 1; /* trigger upon watermark level reached */ + lis.cfg.fifo.trig = LIS3DH_FIFO_TRIG_INT1; /* trigger interrupt into int pin1 */ + lis.cfg.pin1.wtm = 1; /* trigger upon FIFO watermark level reached */ + /* set up HP filter to remove DC component */ - lis.cfg.filter.mode = LIS3DH_FILTER_MODE_NORMAL; + lis.cfg.filter.mode = LIS3DH_FILTER_MODE_NORMAL_REF; lis.cfg.filter.cutoff = LIS3DH_FILTER_CUTOFF_4; + /* write device config */ if (lis3dh_configure(&lis)) { /* error handling */ } + + /* read REFERENCE to set filter to current accel field */ + if (lis3dh_reference(&lis)) { + /* error handling */ + } /* wait for interrupt from LIS3DH */ if (int_poll(GPIO_INTERRUPT_PIN)) { /* error handling */ } + /* read as many [x y z] sets as specified by watermark level (fth) */ + /* copy them to the fifo data struct given below as `fifo' */ if (lis3dh_read_fifo(&lis, &fifo)) { /* error handling */ } + /* above function also writes out the qty of [x y z] sets stored in `fifo' */ for(k=0; k 112/16 = 7 + * so a 0.3g 'shock' is 300/16 = 18.75 + * However, the device can have up to +- 40mg read error, add 40 mg + * 0.34g => 340/16 ~= 21 + * (Note: 0.34g and not 1.34g because of HP filter) */ - lis.cfg.click_ths = 7; /* pretty sensitive */ + lis.cfg.click_ths = 21; - /* the 'shock' must be gone after 10 ms let's say ..*/ /* * Duration time is measured in N/ODR where: * --- N = The content of the intX_dur integer @@ -63,15 +64,26 @@ int main() { * [ODR] [1 LSb in milliseconds] * 400 2.5 * - * At 400 ODR, 10ms/2.5ms = 4 + * At 400 ODR, + * 20 ms = 20/2.5 = 8 */ - lis.cfg.time_limit = 4; + lis.cfg.time_limit = 8; /* write device config */ if (lis3dh_configure(&lis)) { /* error handling */ } + /* read REFERENCE to set filter to current accel field */ + if (lis3dh_reference(&lis)) { + /* error handling */ + } + + /* read CLICK_SRC to clear previous interrupts, if any */ + if (lis3dh_read_click(&lis)) { + /* error handling */ + } + for(;;) { /* poll interrupt on INT1 pin */ @@ -84,14 +96,17 @@ int main() { /* error handling */ } - /* print data gathered from CLICK_SRC */ - printf("Click: X=%d, Y=%d, Z=%d, Sign=%d, S_en=%d, D_en=%d\n", - LIS3DH_CLICK_SRC_X(lis.src.click), - LIS3DH_CLICK_SRC_Y(lis.src.click), - LIS3DH_CLICK_SRC_Z(lis.src.click), - LIS3DH_CLICK_SIGN(lis.src.click), - LIS3DH_CLICK_SCLICK(lis.src.click), - LIS3DH_CLICK_DCLICK(lis.src.click)); + /* only print if SCLICK=1 */ + if (LIS3DH_CLICK_SCLICK(lis.src.click)) { + /* print data gathered from CLICK_SRC */ + printf("Click: X=%d, Y=%d, Z=%d, Sign=%d, S_CLICK=%d, D_CLICK=%d\n", + LIS3DH_CLICK_SRC_X(lis.src.click), + LIS3DH_CLICK_SRC_Y(lis.src.click), + LIS3DH_CLICK_SRC_Z(lis.src.click), + LIS3DH_CLICK_SIGN(lis.src.click), + LIS3DH_CLICK_SCLICK(lis.src.click), + LIS3DH_CLICK_DCLICK(lis.src.click)); + } } /* unregister interrupt */ diff --git a/example/temp.c b/example/temp.c index bfd7559..2987f44 100644 --- a/example/temp.c +++ b/example/temp.c @@ -22,7 +22,7 @@ int main() { /* error handling */ } - /* reset device because it sometimes corrupts itself */ + /* reset device just in case */ if (lis3dh_reset(&lis)) { /* error handling */ } @@ -33,13 +33,13 @@ int main() { lis.cfg.rate = LIS3DH_ODR_400_HZ; lis.cfg.en_adc = 1; /* enable ADC */ lis.cfg.en_temp = 1; /* enable temp sensing */ - /* write device config */ if (lis3dh_configure(&lis)) { /* error handling */ } + /* Read all 3 ADCs */ if (lis3dh_read_adc(&lis)) { /* error handling */ } diff --git a/lis3dh.c b/lis3dh.c index 531a366..a52d0d1 100644 --- a/lis3dh.c +++ b/lis3dh.c @@ -214,6 +214,7 @@ int lis3dh_configure(lis3dh_t *lis3dh) { return err; } +/* should always return something with valid start configuration */ int lis3dh_poll(lis3dh_t *lis3dh) { uint8_t status; int err = 0; @@ -226,6 +227,7 @@ int lis3dh_poll(lis3dh_t *lis3dh) { return err; } +/* assume fifo configured */ int lis3dh_poll_fifo(lis3dh_t *lis3dh) { uint8_t src; int err = 0;