Initiera ADXL345 för single tap??

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
newbadboy
Inlägg: 2112
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Initiera ADXL345 för single tap??

Inlägg av newbadboy »

Sitter och försöker sätta upp kretsen för att detektera single tap och skicka ut det via INT1 pinnen men det händer inget.

Har kollat med logikanalysator och det jag förväntar mig skicka till kretsen är precis det jag får. dessutom läser jag ut Device ID och får svaret 229 vilket stämmer enl datablad. Så jag förutsätter att hårdvaran funkar då den kan svara.

Vad är det jag missar/gör fel?

datablad

https://www.analog.com/media/en/techni ... dxl345.pdf

Kod

Kod: Markera allt

void ADXL345_init(){

//Read out device id ocf the ADXL345 chip. By sniffing the I2C, the
//device id should be seen as 229
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x00);
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();

                
//Set threshold for single tap detection
                I2C1_Start();
                I2C1_Wr(0xA6);     //slave adress
                I2C1_Wr(0x1D);     // Tap register adress
                I2C1_Wr(0x01);     //data to be sent  15.8mg/LSB
                I2C1_Stop();

//Set the latency for single tap detection, disable double tap
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x22);
                I2C1_Wr(0x40);
                I2C1_Stop();
                
//Set the window for double tap detection to 0, disable double tap
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x23);
                I2C1_Wr(0x00);
                I2C1_Stop();
                
//Set tap axes. Use xyz axis
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2A);
                I2C1_Wr(0x07);
                I2C1_Stop();
                
//Set power control to normal.
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2D);
                I2C1_Wr(0x09);
                I2C1_Stop();
                
//Set data format.
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x31);
                I2C1_Wr(0x0A);
                I2C1_Stop();
                
//Set the duration for single tap detection
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x21);
                I2C1_Wr(0x01);  //625us/LSB
                I2C1_Stop();

                
//Link single tap to be output to INT1 pin
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x38);
                I2C1_Wr(0x00);   //00000000
                I2C1_Stop();
                
//Map single tap interupt to INT1 pin
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2F);
                I2C1_Wr(0x00);   //00000000
                I2C1_Stop();

                
//Enable INT1
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2E);
                I2C1_Wr(0x40);   //01000000
                I2C1_Stop();
                }
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Initiera ADXL345 för single tap??

Inlägg av lillahuset »

The maximum tap duration time is defined by the DUR
register (Address 0x21).
Testa att ställa upp register 0x21. 625us är inte mycket.
Användarvisningsbild
newbadboy
Inlägg: 2112
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Initiera ADXL345 för single tap??

Inlägg av newbadboy »

FF hjälpte inte heller. Mäter med scope
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Initiera ADXL345 för single tap??

Inlägg av lillahuset »

Läs ut alla register ur accelerometern för att se att värdena är som förväntat.

Testa för att se att du kan få *något* interrupt från accelerometern.
Användarvisningsbild
newbadboy
Inlägg: 2112
Blev medlem: 16 september 2006, 19:16:28
Ort: Landskrona
Kontakt:

Re: Initiera ADXL345 för single tap??

Inlägg av newbadboy »

Fick till det nu.

Hade blandat ihop lite grejer. Till vissa adresser skulle man skriva hex värden medans till vissa adresser skulle man skriva heltal. Jag skrev HEX överallt så det blev ju fel kan man säga. Nedan följer rätt kod ifal ngn vill i framtiden ha hjälp

Kod: Markera allt

//Read out device id ocf the ADXL345 chip. By sniffing the I2C, the
//device id should be seen as 229
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x00);
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();

//Set power control to normal.
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2D);
                I2C1_Wr(0x08);
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                
                I2C1_Stop();
                
//Set tap axes. Use xyz axis
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2A);
                I2C1_Wr(0x01);
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();

//Set threshold for single tap detection
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x1D);
                I2C1_Wr(40);
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();
                
//Set the duration for single tap detection
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x21);
                I2C1_Wr(32);  //625us/LSB
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();

//Set the latency for single tap detection, disable double tap
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x22);
                I2C1_Wr(80);
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();

//Map single tap interupt to INT1 pin
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2F);
                I2C1_Wr(0x00);   //00000000
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();

//Enable INT1
                I2C1_Start();
                I2C1_Wr(0xA6);
                I2C1_Wr(0x2E);
                I2C1_Wr(0x40);   //01000000
                I2C1_Repeated_Start();
                I2C1_Wr(0xA7);
                DevID=I2C1_Rd(0);
                I2C1_Stop();
}
Skriv svar