Wie konfiguriere ich den LIS3DH als Schrittzähler, der beim Gehen Unterbrechungen erzeugt?

Ich habe viele Algorithmen für Schrittzähler gefunden, die eine schnelle CPU mit einer anständigen ALU und hohen Abtastraten voraussetzen, die ich nicht habe. (Z80) Der LIS3DH hat jedoch verschiedene Optionen zum Erzeugen von Unterbrechungen, wenn eine bestimmte Bedingung eintritt.

Wie kann ich es so konfigurieren, dass es Interrupts erzeugt, wenn ich gehe? Eine hohe Genauigkeit ist nicht erforderlich, ich muss nur wissen, ob sich der Benutzer bewegt oder nicht.

Ich habe das Datenblatt durchgesehen, aber es gibt mehr Optionen, als ich mir vorstellen kann. Die Klickerkennung sah vielversprechend aus, lieferte jedoch nutzlose, halbzufällige Ergebnisse, vielleicht weil sie nur schnelle Klicks und keine Gehgeschwindigkeiten erkennt. Es gibt auch Optionen für Freifallunterbrechung, Trägheitsunterbrechung, Orientierungserkennung, Hochpassfilter, FIFO und mehr.

Ich werde morgen darüber schlafen und mich abmühen, aber weise Worte sind sehr willkommen.

Datenblatt
Anwendungshinweis

Es ist unklar, warum Sie den LIS3DH benötigen, um Interrupts zu generieren. Ein Z80 ist nicht superschnell, aber immer noch ziemlich viele Anweisungen/Sekunde. Normalerweise würde ich erwarten, den Sensor mit einer regelmäßigen Rate zu überwachen, sagen wir 1 kHz. Durch regelmäßiges Abtasten sollte es einfacher sein, Geschwindigkeit und Richtung abzuschätzen als anhand von Unterbrechungen.
Nun, mit einem SPI-Bus bei 8000 Hz ist das nicht tragbar. Denken Sie an 7 Bytes pro Sample und eine langsame Chipauswahl, und Sie sehen maximal 100 Hz. Dann müssen Sie mit 16-Bit-Zahlen mit einer ALU rechnen, die nur 8-Bit-Addieren/Subtrahieren auf einer CPU ausführt, die mit einem Spiel beschäftigt ist.
Nun, ich lebe und lerne. Interessant. Danke schön. Ich hatte angenommen, weil SPI so verbreitet und unkompliziert ist, dass es 1 MHz sein würde. Entschuldigung für die Zeitverschwendung.

Antworten (1)

Abschnitt 6.3.2 und 6.3.3 des Anwendungshinweises erläutern, wie ein Interrupt ausgelöst wird, wenn eine Achse einen bestimmten Wert überschreitet. In Kombination mit einem Hochpass-Interrupt, um den Schwerkraftvektor loszuwerden, konnte ich einen wirklich niedrigen Schwellenwert festlegen, der bei 64 mg auslöst.

  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