Adxl345 - single tap

sto cercando di attivare l'interrupt INT1 di un adxl345, in modalità single tap, riferendomi alle specifiche ufficiali.

per il momento ho prodotto questo script che legge benissimo i dati provenienti dall'accelerometro, ma non rileva gli interrupt.

gli elementi che probabilmente sono più importanti nel codice sono i seguenti:

  writeTo(DEVICE0, TAP_AXES, 0x04);       //abilita l'identificazione del tap per il solo asse X
  writeTo(DEVICE0, DUR, 0x65);       //imposta il tempo di 625E-6 s per il valore massimmo di un tap (circa 20 centimetri alla velocità del suono).
  writeTo(DEVICE0, THRESH_TAP, 0x30);       //imposta la soglia di ampiezza per l'identificazione di un TAP.
  writeTo(DEVICE0, INT_MAP, 0xBF);       //abbina la funzione SINGLE_TAP all'interrupt 1 (e tutte le altre funzioni all'interrupt 2).
  writeTo(DEVICE0, INT_ENABLE, 0x40);       //abilita esclusivamente la funzione SINGLE_TAP, che in precedenza è stata abbinata all'interrupt 1)

in particolare, i registri INT_MAP e INT_ENABLE sono stati impostati leggendo questa parte delle speficifiche.

ho verificato che l'interrupt sul pin digitale 7 dell'arduino micro che sto utilizzando è correttamente funzionante.
tuttavia, controllando il comportamento del INT1 sull'adxl345 tramite un canale analogico, ho osservato che l'interrupt non produce eventi CHANGE perché risulta costantemente acceso.

cosa può esserci di sbagliato in quello che sto facendo?
cosa potrei approfondire per capire meglio il fenomeno?

[EDIT] è strano, oggi il sensore sta funzionando a singhiozzo.
a volte il pin INT1 appare correttamente spento in assenza di segnale e l'interrupt scatta regolarmente, altre si stabilizza in condizione acceso e inevitabilmente non dà interrupt. sembrerebbe utile inserire nel codice qualche lettura del registro readonly INT_SOURCE ... ma detta così, mi sembra davvero astrologia.
???
[EDIT 2] niente da fare, sembra che la lettura del registro INT_SOURCE sia proprio indispensabile. nelle spesifiche ho letto due frasi al proposito che probabilmente dicono proprio questo, ma che non capisco del tutto. quasi quasi le riporto qui sotto, poi chiudo il thread come risolto, e magari ritorno sul tema in seguito con una richiesta più chiara.

The interrupt functions are latched and cleared by either reading
the data registers (Address 0x32 to Address 0x37) until the interrupt
condition is no longer valid for the data-related interrupts or by
reading the INT_SOURCE register (Address 0x30) for the remain-
ing interrupts.

Other bits, and the corresponding interrupts, are cleared by
reading the INT_SOURCE register.

Ovviamente SI ed è chiaramente indicato ...
... tutte le condizioni di interrupt hanno bisogno di sapere, in un modo o in un altro, quando qualcuno le ha processate e li, uno dei modi indicati è proprio la lettura di INT_SOURCE.

Guglielmo

infatti.
più che altro, visto che, nel mio caso particolare, sto ricevendo l'interrupt dell'adxl direttamente con quello di arduino, non sento alcun bisogno di avvisare il sensore che ho ricevuto il segnale.

al contrario, i progettisti hanno stabilito che il reset dell'interrupt debba necessariamente essere effettuato dall'utente, altrimenti resta accesso all'infinito, proprio come accadeva a me.

lo strumento per azzerare l'interrupt è, appunto, la lettura del registro INT_SOURCE.

... che però così NON potrebbe sapere che deve "pulire" la condizione che ha generato l'interrupt :wink:

Guglielmo