Encontré muchos algoritmos para podómetros que asumen una CPU rápida con una ALU decente y altas tasas de muestreo, que yo no tengo. (Z80) Sin embargo, el LIS3DH tiene varias opciones para generar interrupciones cuando ocurre alguna condición.
¿Cómo puedo configurarlo para que genere interrupciones cuando estoy caminando? No se necesita una alta precisión, solo necesito saber si el usuario se está moviendo o no.
Revisé la hoja de datos, pero hay más opciones de las que puedo entender. La detección de clics parecía prometedora, pero dio resultados inútiles y semialeatorios, tal vez porque solo detecta clics rápidos y no velocidades de marcha. También hay opciones para interrupción de caída libre, interrupción de inercia, detección de orientación, filtro de paso alto, FIFO y más.
Dormiré y trabajaré duro mañana, pero cualquier palabra sabia es muy apreciada.
Las secciones 6.3.2 y 6.3.3 de la nota de aplicación explican cómo generar una interrupción cuando un eje supera un cierto valor. Combinado con una interrupción de paso alto para eliminar el vector de gravedad, me permitió establecer un umbral realmente bajo que se activa en 64 mg.
call DelayFrame ; raise CS
ld a, LIS3DH_REG_WHOAMI
ld b, a
call ReadRegister
ld a, c
ldh [hWhoAmI], a
call DelayFrame ; raise CS
; based on application note section 6.3.2-3
ld a, LIS3DH_REG_CTRL1
ld b, a
ld a, $77 ; CTRL1: enable all axes, 400HZ
ld c, a
call WriteRegister
ld a, $0F ; CTRL2: high-pass filter on everything
call SPITransfer
ld a, $00 ; CTRL3: not used
call SPITransfer
ld a, $88 ; CTRL4: BDU, high resolution, 2g
call SPITransfer
ld a, $08 ; CTRL5: latch interrupt on INT1_SRC
call SPITransfer
call DelayFrame ; raise CS
ld a, LIS3DH_REG_INT1CFG
ld b, a
ld a, %00101010 ; int1 config: enable high int on all axes
ld c, a
call WriteRegister
ld a, 0 ; src
call SPITransfer
ld a, 4 ; threshold
call SPITransfer
ld a, 0 ; minimum duration
call SPITransfer
gbulmer
Pepijn
gbulmer