ADXL345 I2C PIC18

Gast #3031836
Lesenswert?

Ich möchte gerne den ADXL345 mit meinem PIC18F45K22 über I2C ansprechen. 
Ich verwende den C18 Compiler. Ich habe noch nie mit I2C gearbeitet, 
aber mit SPI schon eine wenig Erfahrung gesammelt. Ich kann den Sensor 
nicht mit SPI ansprechen, da der SDO bei meinem Breakoutboard auf Masse 
ist. Da ich die viele Dinge oft am besten mit Beispielen lerne möchte 
ich fragen, ob jemand einen Code für den C18 Compiler um den ADXL345 
anzusprechen hat?
Gast #3038116
Lesenswert?

Ich habe jetzt ein bisschen probiert, und habe folgenden Code 
geschrieben. Wenn ich alles richtig verstanden habe müsste der ADXL 
jetzt dauernd Messungen ausführen. Ich kann mit dem Oszi am 
Interrupt-Pin aber nichts messen. Wo könnte der Fehler liegen.
Anbei ist noch der Schaltplan der Platine.
Könnte es ein Problem sein, dass der PIC mit 5V versorgt wird, der ADXL 
aber nur mit 3,3V?
1
  LATC=0x00;
2
  TRISC=0xFF;
3
  ANSELC=0x00;
4

5
  OpenI2C1(MASTER, SLEW_ON);
6

7
  IdleI2C1();  
8
  StartI2C1();
9
  WriteI2C1(0xA6);    // Write
10
  WriteI2C1(0x31);    // Data Format    
11
  WriteI2C1(0x0B);    // +/-16g, 13-BIT    
12
  StopI2C1();  
13
  
14
  IdleI2C1();
15
  StartI2C1();
16
  WriteI2C1(0xA6);    // Write    
17
  WriteI2C1(0x2D);    // POWER_CTL    
18
  WriteI2C1(0x08);    // START MEASUREMENT    
19
  StopI2C1();
20
    
21
  IdleI2C1();
22
  StartI2C1();
23
  WriteI2C1(0xA6);    // Write
24
  WriteI2C1(0x2E);    // INT_ENABLE
25
  WriteI2C1(0x80);    // ENABLE DATA_READ INTERRUPT
26
  StopI2C1();
Angehängte Dateien:
Gast #3038275
Lesenswert?

Mario schrieb:
> Die Frequenz ist laut Oszi ca. 600kHz

Laut Datenblatt ist für den Sensor 100kHz bis max. 400kHz !!! erlaubt.
Wahrscheinlich bekommt der Sensor es garnicht richtig mit was Du von Ihm 
haben möchtest.
Das Oszibild ist leider sehr schlecht zu interpretieren was das ACK vom 
Sensor angeht.
Stell den Takt mal Testweise auf 100kHz runter und versuche es nochmal.

Grüße
Gast #3038318
Lesenswert?

Schreib mal in das Register 0x2F (Interrupt MAP ) eine 0x7F rein.
Evtl. bleibt der PIN immer auf einem Pegel, da ja alle Interrupts 
verodert auf einem PIN sind. Also evtl. ist immer einer aktiv und 
deshalb bleibt er auf einem Level.
Gast #3038334
Lesenswert?

Tach schrieb:
> Schreib mal in das Register 0x2F (Interrupt MAP ) eine 0x7F rein.
> Evtl. bleibt der PIN immer auf einem Pegel, da ja alle Interrupts
> verodert auf einem PIN sind. Also evtl. ist immer einer aktiv und
> deshalb bleibt er auf einem Level.

Das habe ich gemacht.

INT 1 ist 1
INT 2 ist 0

Muss ich die Interupt Flag-Bits wider löschen?
#3038340
Lesenswert?

Mario schrieb:
> Jetzt ist der Takt ca. 90 kHz.

Wieso eigentlich ca. 90 kHz? Ich bin zwar mit PICs nicht wirklich 
vertraut, aber das Datenblatt verrät, dass der o.g. Controller durchaus 
über ein entsprechendes Hardware-Modul verfügt. Insofern sollte es kein 
Problem sein, da "echte" 100 kHz hinzubekommen.

Nicht, dass das jetzt deine Probleme "löst", aber besonders sauber 
erscheint mir ja deine Vorgehensweise nicht zu sein, da "irgendwas" zu 
nehmen und z.B. mit 600 kHz anzufangen. Im Standard-Mode sind halt 100 
kHz üblich, und stellen i.d.R. auch kein Problem dar.
Gast #3038754
Lesenswert?

Stimmt die Leseroutine so?
1
      IdleI2C1();
2
      StartI2C1();
3
      WriteI2C1(0xA6);    // Write  
4
      WriteI2C1(0x30);    // INT_SOURCE
5
      StopI2C1();
6
      StartI2C1();    
7
      WriteI2C1(0xA7);    // Read
8
      read=ReadI2C1();
9
      NotAckI2C1();
10
      StopI2C1();  
11
      PORTD=read;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren