¿Cómo configuro el LIS3DH como un podómetro que genera interrupciones al caminar?

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.

Hoja de datos
Nota de aplicación

No está claro por qué necesita el LIS3DH para generar interrupciones. Un Z80 no es súper rápido, pero sigue dando muchas instrucciones por segundo. Normalmente esperaría monitorear el sensor a un ritmo regular, digamos 1kHz. Al muestrear a una tasa regular, debería ser más fácil estimar la velocidad y la dirección que a partir de las interrupciones.
Bueno, con un bus SPI a 8000hHz, eso es insostenible. Piense en 7 bytes por muestra y una selección de chip lenta y verá un máximo de 100 Hz. Luego, debe hacer operaciones matemáticas con números de 16 bits con una ALU que solo suma/resta de 8 bits en una CPU que está ocupada ejecutando un juego.
Bueno, vivo y aprendo. Interesante. Gracias. Supuse que debido a que SPI es tan común y sencillo, sería de 1 MHz. Disculpas por hacerte perder el tiempo.

Respuestas (1)

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