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.