Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: ertsen - 20 Ocak 2013, 15:08:30

Başlık: ADXL345 ivme sensörü uygulaması
Gönderen: ertsen - 20 Ocak 2013, 15:08:30
Arkadaşlar şu anda x,y ve z koordinatlarını sorunsuzda okuyabiliyorum. adxl ile açılan diğer başlıkta (https://www.picproje.org/index.php/topic,44491.0.html) paylaşılan dosyanın kodlarını kendime göre düzenledim.
aşağıdaki şekilde pic-adxl345 bağlantısını kurdum:
[IMG]http://img10.imageshack.us/img10/9858/adxl345arduinoschematic.jpg[/img] (http://imageshack.us/photo/my-images/10/adxl345arduinoschematic.jpg/)


video linki:
video 2013 01 20 14 56 16 (http://www.youtube.com/watch?v=RroPr4s6SIw#)

Kodlar:
Adxl345.c
// ADXL345  Registers
#define ADXL345_DEVID                   0x00    // R     Device ID
#define ADXL345_THRESH_TAP              0x1D    // R/W   Tap threshold
#define ADXL345_OFSX                    0x1E    // R/W   X-axis offset
#define ADXL345_OFSY                    0x1F    // R/W   Y-axis offset
#define ADXL345_OFSZ                    0x20    // R/W   Z-axis offset
#define ADXL345_DUR                     0x21    // R/W   Tap duration
#define ADXL345_Latent                  0x22    // R/W   Tap latency
#define ADXL345_Window                  0x23    // R/W   Tap window
#define ADXL345_THRESH_ACT              0x24    // R/W   Activity threshold
#define ADXL345_THRESH_INACT            0x25    // R/W   Inactivity threshold
#define ADXL345_TIME_INACT              0x26    // R/W   Inactivity time
#define ADXL345_ACT_INACT_CTL           0x27    // R/W   Axis enable control for activity and inactivity detection
#define ADXL345_THRESH_FF               0x28    // R/W   Free-fall threshold
#define ADXL345_TIME_FF                 0x29    // R/W   Free-fall time
#define ADXL345_TAP_AXES                0x2A    // R/W   Axis control for single tap/double tap
#define ADXL345_ACT_TAP_STATUS          0x2B    // R     Source of single tap/double tap
#define ADXL345_BW_RATE                 0x2C    // R/W   Data Rate and power mode control
#define ADXL345_POWER_CTL               0x2D    // R/W   Power-saving features control
#define ADXL345_INT_ENABLE              0x2E    // R/W   Interrupt enable control
#define ADXL345_INT_MAP                 0x2F    // R/W   Interrupt mapping control
#define ADXL345_INT_SOURCE              0x30    // R     Source of interrupts
#define ADXL345_DATA_FORMAT             0x31    // R/W   Data format control
#define ADXL345_DATAX0                  0x32    // R     X-Axis Data 0
#define ADXL345_DATAX1                  0x33    // R     X-Axis Data 1
#define ADXL345_DATAY0                  0x34    // R     Y-Axis Data 0
#define ADXL345_DATAY1                  0x35    // R     Y-Axis Data 1
#define ADXL345_DATAZ0                  0x36    // R     Z-Axis Data 0
#define ADXL345_DATAZ1                  0x37    // R     Z-Axis Data 1
#define ADXL345_FIFO_CTL                0x38    // R/W   FIFO control
#define ADXL345_FIFO_STATUS             0x39    // R     FIFO status
#define ADXL345_OUTPUTS                 0x32

void adxl345_init(){
         
         i2c_start();
         i2c_write(0xA6);
         //delay for ack in the slave device
         //Put the ADXL345 into +/- 4G range by writing the value 0x01 to the DATA_FORMAT register.
         i2c_write(ADXL345_DATA_FORMAT);
         i2c_write(0x01);
         i2c_stop();
         
         delay_ms(1);
         i2c_start();
         i2c_write(0xA6);
         i2c_write(ADXL345_FIFO_CTL);
         //i2c_write(0x40);
         i2c_write(0x00);//FIFO inactive
         i2c_stop();
         
         //Put the ADXL345 into Measurement Mode by writing 0x08 to the POWER_CTL register.
         delay_ms(1);
         i2c_start();
         i2c_write(0xA6);
         i2c_write(ADXL345_BW_RATE);
         i2c_write(0x0c);
         i2c_stop();
         
         delay_ms(1);
         i2c_start();
         i2c_write(0xA6);
         i2c_write(ADXL345_POWER_CTL);
         i2c_write(0x08); //Measurement mode
         i2c_stop();
}
     
     
int adxl345_read(int add){
         int retval;
         i2c_start();
         i2c_write(0xA6);
         i2c_write(add);
         i2c_start();
         i2c_write(0xA7);
         retval=i2c_read(0);
         i2c_stop();
         return retval;
}


main.c


//lcd portB
//şemadaki gibi adx345 in bağlantısı gerçekleştiriliyor
#include <18F2550.h>

#fuses  HSPLL,NOWDT,NOPROTECT,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN      // dont change
#use    delay(clock=48000000) 

#build (reset=0x1000, interrupt=0x1008)                              // new addresses
#org 0x0,0xfff {}                                             // reserved space

#use I2C(master, sda=PIN_C7, scl=PIN_C6, slow)
#include "LCD_FLEX.c"
#include "ADXL345.c"
int i,values[6];
unsigned char display[4]={0,0,0,'g'};

void conversion(int16 i) 

    display[0]=i/1000+0x30 ;
    i=i%1000;
    display[1]=i/100+0x30 ;
    i=i%100;
    display[2]=i/10+0x30 ;
}

void display_x(void)
{   float temp;
    int16 x;

    x=adxl345_read(0x33);
    x=(x<<8)+adxl345_read(0x32);

 
   if(x>65000){
    x=-x;
      printf(lcd_putc,"\fX: -%lu",x);
   }
   else
   {
printf(lcd_putc,"\fX:  %lu",x);
//!    printf(lcd_putc,"\fX:%lu\n %d,%d,%d",x,display[0],display[1],display[2]);
   }
}
//*******************************

void display_y(void)
{   float temp;
    int16 y;
     y=adxl345_read(0x35);
    y=(y<<8)+adxl345_read(0x34);
   
    if(y>65000){
    y=-y;
      printf(lcd_putc," Y: -%lu",y);
   }
   else
   {
printf(lcd_putc," Y:  %lu",y);
//!    printf(lcd_putc,"\fX:%lu\n %d,%d,%d",x,display[0],display[1],display[2]);
   }
}

void display_z(void)
{   float temp;
    int16 z;

     z=adxl345_read(0x37);
    z=(z<<8)+adxl345_read(0x36);
   
   if(z>65000){
    z=-z;
      printf(lcd_putc,"\n Z: -%lu",z);
   }
   else
   {
printf(lcd_putc," \nZ:  %lu",z);
//!    printf(lcd_putc,"\fX:%lu\n %d,%d,%d",x,display[0],display[1],display[2]);
   }

}

void main()
{
   delay_ms(500);
   lcd_init();
   adxl345_init();
   printf(lcd_putc,"\f");
   while(TRUE)
   {
      display_x();
      display_y();
      display_z();

      delay_ms(100);
   }

}


Başlık: Ynt: Arduino ADXL345 ivme sensörü uygulaması
Gönderen: artapon - 20 Ocak 2013, 17:19:54
hocam elinize sağlık gayet güzel görünüyor. şimdi birde ben deneyeyim bakalım nasıl bir sonuç elde edeceğim...
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Murat Mert - 25 Ocak 2013, 22:13:26
S.A.
Hocam veriler 8bit isaretli olrakmi geliyor?
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: ertsen - 25 Ocak 2013, 22:17:47
işin teknik kısmını tam olarak tarif edemesemde şöyle anlatayım. - veriler binary olarak geliyor. yani -1 için 65534 gibi bir sonuç veriyor. dolayısıyla if(x>65000) şeklinde bir kontrolle - mi + mı olduğunu kontrol ediyorum. (kendimce bulduğum bir çözüm)

Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Murat Mert - 26 Ocak 2013, 09:45:33
16 bitlik veriler halindeyse ekranda daha büyük sayılar görükmesi lazım diye düşündüm.
Ellerinize sağlık güzel bir çalışma sizi baya yordu. Bilgi paylaşımı için teşekkürler.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: gutaussehender - 06 Mart 2013, 21:55:29
merhaba arkadaşlar bende adxl345 ıle bı deneme yapmak istedim

https://www.picproje.org/index.php?topic=30624.0 (https://www.picproje.org/index.php?topic=30624.0)

konudakı BenC arakadasın kodunu protona a cevirdim

fakat pc den aldıgım degerler

X: 0 Y:08 Z:0
DeviceID 0

bu degerler sürekli sabit hiç değişmiyor acaba nerede hata yaptım yardımcı olurmusunuz.

ADXL345 yanmış olabilirmi acaba.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 28.07.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 18F4520                      'işlemci 18f4520                               
XTAL 8

CONFIG_START
'OSC = HSPLL ; HSPLL Oscillator
FCMEN = off ; Failsafe Clock Monitor Disabled
IESO = off ; Int/Ext Oscillator Switch Over Disabled
PWRT = off ; Power Up Timer Enabled
BOREN = off ; Brownout Reset Disabled
BORV = 0     ; Brownout Reset Voltage 4.6V
WDT = off ; Watchdog Timer Disabled
WDTPS = 1 ; Watchdog Postscaler: 1:1
MCLRE = off ; MCLR Enabled
LPT1OSC = off ; T1 Oscillator Disabled
PBADEN = off ; Port B A/D Enable Port B<4:0> digital on RESET
CCP2MX = PORTC ; CCP2 Mux Muxed with RC1
STVREN = off ; Stack Overflow Reset Enabled
LVP = off ; Low Voltage ICSP Disabled
XINST = off ; XINST Disabled
Debug = off ; Background Debugger Disabled
CP0 = OFF ; Code Protection Block 0 Disabled
CP1 = OFF ; Code Protection Block 1 Disabled
CP2 = OFF ; Code Protection Block 2 Disabled
CP3 = OFF ; Code Protection Block 3 Disabled
CPB = OFF ; Boot Block Code Protection Disabled
CPD = Off ; Data EEPROM Code Protection Disabled
WRT0 = off ; Write Protection Block 0 Disabled
WRT1 = off ; Write Protection Block 1Disabled
WRT2 = off ; Write Protection Block 2 Disabled
WRT3 = off ; Write Protection Block 3 Disabled
WRTB = off ; Boot Block Write Protection Disabled
WRTC = off ; Configuration Register Write Protection Disabled
WRTD = off ; Data EEPROM Write Protection Disabled
EBTR0 = off ; Table Read Protection Block 0 Disabled
EBTR1 = off ; Table Read Protection Block 1 Disabled
EBTR2 = off ; Table Read Protection Block 2 Disabled
EBTR3 = off ; Table Read Protection Block 3 Disabled
EBTRB = off ; Boot Block Table Read Protection Disabled
CONFIG_END

    OSCTUNE.6=0                 'HPLL DİSABLE
    OSCCON=%01110110            '8mhz intrc osc
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''' PORT  TANIMLAMALARI''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    TRISA=%00000000
    TRISB=%00000000
    TRISC=%10000000
    TRISD=%00000000
    TRISE.0=0
    TRISE.1=0
    TRISE.2=0
   
    ADCON0=%00000000                      'A/D Converter module is enabled
    'ADCON2=%10101101                '101 = 12 TAD--101 = FOSC/16
    'ADCON1=%00001110                'AN0 analog diğerleri diğital
    CMCON=7                         'karşılaştırmalar kapalı
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Symbol  RTC_DTA=PORTA.2
    Symbol  RTC_CLK=PORTA.1
    Symbol  RTC_RST=PORTA.3
    Symbol  GIE=INTCON.7
   
    Declare ADIN_RES 10
    Declare ADIN_TAD frc
    Declare ADIN_STIME 50
   
    HSERIAL_BAUD = 9600
    HSERIAL_RCSTA = $90
    HSERIAL_TXSTA = $20
    HSERIAL_CLEAR = On
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''DEĞİŞKENLER'''''''''''''''''''''''''''''''''''' 
    Dim x       As Word
    Dim y       As Word
    Dim z       As Word
    Dim sayac   As Byte
    Dim veri    As Byte
    Dim verix   As Byte
    Dim ADRESS   As Byte
    Dim adresx  As Byte   
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Symbol  ADXl_CLK    =   PORTD.1
    Symbol  ADXL_CS     =   PORTD.2
    Symbol  ADXL_SDO    =   PORTD.0
    Symbol  ADXL_SDI    =   PORTC.3
    Symbol  adxl_vs     =   PORTD.3
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
main:
    adxl_vs=1
        GoSub ADXL345_INIT
main2:
       
        ADRESS=$32
        GoSub adxl345_oku
        x.HighByte=veri
        ADRESS=$33
        GoSub adxl345_oku
        x.LowByte=veri
       
       
        ADRESS=$34
        GoSub adxl345_oku
        y.HighByte=veri
        ADRESS=$35
        GoSub adxl345_oku
        y.LowByte=veri
       
       
        ADRESS=$36
        GoSub adxl345_oku
        z.HighByte=veri
        ADRESS=$37
        GoSub adxl345_oku
        z.LowByte=veri

        HSerOut [#x," - ",#y," - ",#z," - ",13,10]
        DelayMS 500
       
        ADRESS=$00
        GoSub adxl345_oku
        HSerOut ["DeviceID ",#veri,13,10]
     GoTo main2

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ADXL345_INIT:
   
        ' DATA FORMAT  0x31
        'Bit 7 = SELF TEST , 1=ON,0=OFF
        'Bit 6 = SPI , 1=3 WIRE,0=4 WIRE
        'Bit 5 = INT_INVERT , 1=ACTIF HIGH,0=ACTIF LOW
        'Bit 4 = USE 0
        'Bit 3 = FULL RES , 1=16 bit,0=10 bit
        'Bit 2 = JUSTIFY BIT , 1=left-justified,0=right-justified
        'Bit 1 = RANGE
        'Bit 0 = RANGE   
        ' 0 0 +-2g
        ' 0 1 +-4g
        ' 1 0 +-8g
        ' 1 1 +-16g
        '0b00001111 = 0x0F
        ADRESS=$31
        veri=$0f
        GoSub ADXL345_YAZ
       

        ' INTERRUPT ENABLE KONTROLU 0x2E
        'Bit 7 = DATA READY , 1=ON,0=OFF
        'Bit 6 = SINGLE TAB , 1=ON,0=OFF
        'Bit 5 = DOUBLE TAB , 1=ON,0=OFF
        'Bit 4 = ACTIVITY   , 1=ON,0=OFF
        'Bit 3 = INACTIVITY , 1=ON,0=OFF
        'Bit 2 = FREE FALL  , 1=ON,0=OFF
        'Bit 1 = WATERMARK  , 1=ON,0=OFF
        'Bit 0 = OVERRUN    , 1=ON,0=OFF
        '0b00000000 = 0x00
        ADRESS=$2e
        veri=$00
        GoSub ADXL345_YAZ
   
        ' BW RATE 0x2C
        'Bit 7 = 0
        'Bit 6 = 0
        'Bit 5 = 0
        'Bit 4 = Low POWER  , 1=On,0=NORMAL
        'Bit 3 = RATE
        'Bit 2 = RATE
        'Bit 1 = RATE
        'Bit 0 = RATE
        ' 1 0 1 0 DEFAULT
        '0b00001010 = 0x0A
        ADRESS=$2c
        veri=$0C
        GoSub ADXL345_YAZ
       
        ' POWER KONTROLU 0x2D
        'Bit 7 = 0
        'Bit 6 = 0
        'Bit 5 = LINK         , 1=On,0=OFF
        'Bit 4 = AUTO Sleep   , 1=On,0=OFF
        'Bit 3 = MEASURE      , 1=On,0=OFF
        'Bit 2 = Sleep        , 1=On,0=OFF
        'Bit 1 = WAKE UP      , 1=On,0=OFF
        'Bit 0 = WAKE UP      , 1=On,0=OFF
        '0b00001000 = 0x00
        ADRESS=$2d
        veri=$08
        GoSub ADXL345_YAZ
       
        Return
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
adxl345_oku:
        veri=0                      'Veri değişkenini sıfırla
       
        ADXl_CLK=1                  'ADXL345 CLOCK HATTI HIGH
        ADXL_CS=0                   'ADXL345 CHIP SELECT HATTI LOW
       
        adresx=ADRESS & $80          'Adres değerini &80 ile topla (adres.7=1)
       
        For sayac=0 To 7            '8 Bit veri için döngü
       
            ADXl_CLK=0              'ADXL345 CLOCK HATTI LOW
            If adresx.7=1 Then      'Adresx in 7 inci biti 1 ise
                ADXL_SDO=1          'adxl_sdo hattını 1 yap
            Else                    'değilse
                ADXL_SDO=0          'adxl_sdo hattını 0 yap
            EndIf
            adresx=adresx<<1        'adresx içeriğini bir bit saga kaydır
        DelayUS 2                   '2 uSn bekle
        ADXl_CLK=1                  'ADXL345 CLOCK HATTI HIGH
        DelayUS 2
        Next sayac
       
       
        For sayac=0 To 7            '8 Bit veri için döngü
            ADXl_CLK=0              'Adxl345 clock hattı low
                DelayUS 2           '2 uSn bekle
            ADXl_CLK=1              'Adxl345 clock hattı hıgh
                DelayUS 2           '2 uSn bekle
               
                If ADXL_SDI=1 Then  'adxl_sdi hattı 1 ıse
                    veri.0=1        'veri değişkeninin 0 ıncı biti 1 yap
                Else                'değilse
                    veri.0=0        'veri değişkeninin 0 ıncı biti 0 yap
                EndIf
            veri=veri<<1            'veri değişkeninin içeriğini bit bit sağa kaydır
            Next sayac
            ADXL_CS=1               'adxl345 chıp select hattı high
            Return

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
ADXL345_YAZ:
        verix=veri                  'Veri değişkenini yedeğini al

        ADXl_CLK=1                  'ADXL345 CLOCK HATTI HIGH
        ADXL_CS=0                   'ADXL345 CHIP SELECT HATTI LOW
       
        adresx=ADRESS & $7F
       
        For sayac=0 To 7            '8 Bit veri için döngü
       
            ADXl_CLK=0              'ADXL345 CLOCK HATTI LOW
            If adresx.7=1 Then      'Adresx in 7 inci biti 1 ise
                ADXL_SDO=1          'adxl_sdo hattını 1 yap
            Else                    'değilse
                ADXL_SDO=0          'adxl_sdo hattını 0 yap
            EndIf
            adresx=adresx<<1        'adresx içeriğini bir bit saga kaydır
        DelayUS 2                   '2 uSn bekle
        ADXl_CLK=1                  'ADXL345 CLOCK HATTI HIGH
        DelayUS 2
        Next sayac


        For sayac=0 To 7            '8 Bit veri için döngü
            ADXl_CLK=0              'Adxl345 clock hattı low
                If verix.7=1 Then   'verix in 7ci biti 1 se
                    ADXL_SDO=1      'adxl_sdo hattı 1 yap
                Else                'değilse
                    ADXL_SDO=0      'adxl_sdo hattı 0 yap
                EndIf
            verix=verix<<1          'verix değişkenin içeriğini 1 bit saga kaydır
                DelayUS 2           '2 uSn bekle
            ADXl_CLK=1              'Adxl345 clock hattını high
                DelayUS 2           '2 uSn bekle
        Next sayac
            ADXL_CS=1               'Adxl345 chıp select hattını 1 e çek
       
        Return

  End
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: dilruba.mdk - 02 Mayıs 2013, 23:11:40
arkadaşlar mrb ben bu programı ccs de derledim devreyi kurdum ama lcd de hiç bi hareketlilik alamıyorum lütfennnnn yardımcı olur musunuz :( :(
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: shakuzi - 04 Kasım 2013, 16:08:03
Kendi adıma çok yararlı bir paylaşım. Teşekkürler.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 00:58:46
Elimde Resimdeki ADXL345 modülü var.

(http://s30.postimg.cc/rflg6i1od/indir.jpg) (http://postimg.cc/image/rflg6i1od/)

Buradaki kodları ADXL345 kütüphanesini kullanarak ADXL345'den veri okumaya çalışıyorum.
Çipi init ediyorum(öyle görünüyor) Fakat değer okuduğum zaman bütün değerler sıfır geliyor.

CCS'de yazdığım kodlar bunlar.
#include <16F877A.h>
#device ADC=10
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES HS

#use delay(crystal=10000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#use I2C(master, sda=PIN_C4, scl=PIN_C3, slow)

#include <lcd_driver.c>
#include <ADXL345.c>

int8 accel_data[6];
int16 xaxis=0,yaxis=0,zaxis=0;

void main()
{
   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x00);
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   output_d(0x00);
   output_e(0x00);
   
   output_float(pin_c3);
   output_float(pin_c4);
   
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   setup_spi(SPI_DISABLED);
   
   delay_ms(500);
   lcd_init();
   adxl345_init();   
   
   printf(lcd_putc,"\f");
   lcd_gotoxy(1,1);
   printf(lcd_putc,"ADXL345 Accmeter");

   while(TRUE)
   {
     accel_data[0]=adxl345_read(32); //Read X axis(LSB)
     accel_data[1]=adxl345_read(33); //Read X axis(MSB)
     accel_data[2]=adxl345_read(34); //Read Y axis(LSB)
     accel_data[3]=adxl345_read(35); //Read Y axis(MSB)
     accel_data[4]=adxl345_read(36); //Read Z axis(LSB)
     accel_data[5]=adxl345_read(37); //Read Z axis(MSB)

     xaxis=(int16)((accel_data[1]<<8)|accel_data[0]);
     yaxis=(int16)((accel_data[3]<<8)|accel_data[2]);
     zaxis=(int16)((accel_data[5]<<8)|accel_data[4]);
     
     lcd_gotoxy(1,2);
     printf(lcd_putc,"X%03ld Y%03ld Z%03ld",xaxis, yaxis, zaxis);
     delay_ms(100);
     output_toggle(pin_a0);
 
   }

}


Durumu çözmeye çalışıyorum. Çipin INT bacaklarını kullanmadım, boştalar. CS bacağını +5V'a bağlı, I2C ile iletişim kurmaya çalışıyorum.

Sıkıntı ne olabilir.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 10:17:45
Dünden beri uğraşıyorum durum aynı.

Sisteme ilk enerji verdiğimde hatta oluşan data aktivitesi aşağıdaki gibi
(http://s3.postimg.cc/u679fq1yr/Ekran_Al_nt_s.jpg)

Yanlış birşeymi yapıyorum? Neden Sensörlerden sürekli 0 verisi geliyor?
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: sadogan - 10 Mayıs 2014, 11:17:29
#use fast_io(c)
output_float(pin_c3);
output_float(pin_c4);
Bunları kaldırıp denedinizmi ?

Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 11:22:38
Hocam sizin söylemenizle birlikte hemen denedim. Ama değişen birşey olmadı.

mesaj birleştirme:: 10 Mayıs 2014, 11:50:35

Kafayı yedirtecek bana,

Yahu Lojik analizatörde görüldüğü üzere ACK geliyor. Demekki sensör canlı, cevap veriyor bize. O halde neden gelen datalar hep sıfır?

Acaba SPI ilemi haberleştirsek?

Bildiğiniz çalışan sağlam kütüphane kod parçası felan varmı?
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: sadogan - 10 Mayıs 2014, 12:05:23
SPI için bir örnek paylaşmıştım.
https://www.picproje.org/index.php/topic,44491.30.html (https://www.picproje.org/index.php/topic,44491.30.html)
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 12:09:16
Hocam Ben ilk önce I2C nin çalışıp çalışmadığını doğrulamam lazım. XYZ bilgilerini alamıyorum. Birde Register okuması yapayım bakalım yazdığım değerleri geri geliyormu?
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: mistek - 10 Mayıs 2014, 12:18:55
Ben kullandığım adxl345 'te CS bacağını biyere bağlamıyordum diye hatırlıyorum.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 12:27:32
Hocam Datasheette I2C modu anlatılırken CS high konumunda olmalı diyor.

mesaj birleştirme:: 10 Mayıs 2014, 12:45:08

Yok arkadaşlar I2C çalışıyor.

ADXL345'in Register Map'inde DEVICE_ID registerinin default değeri 0xE5(11100101) olarak verilmiş. Ben DEVICE_ID registerini okuyorum aynı şekilde 0xE5 değeri geliyor.

Başka registerleride okuyorum yine yazılan değerler veya default değerleri geri okuyabiliyorum.

Sensör çalışıyor, I2C çalışıyor. O halde neden data göndermiyor bana bu velet.

     accel_data[0]=adxl345_read(32); //Read X axis(LSB)
     accel_data[1]=adxl345_read(33); //Read X axis(MSB)
     accel_data[2]=adxl345_read(34); //Read Y axis(LSB)
     accel_data[3]=adxl345_read(35); //Read Y axis(MSB)
     accel_data[4]=adxl345_read(36); //Read Z axis(LSB)
     accel_data[5]=adxl345_read(37); //Read Z axis(MSB)

     xaxis=(int16)((accel_data[1]<<8)|accel_data[0]);
     yaxis=(int16)((accel_data[3]<<8)|accel_data[2]);
     zaxis=(int16)((accel_data[5]<<8)|accel_data[4]);


Burada yanlış birşeymi yapıyorum?

Konu sahibi nasıl çalıştırmış anlamıyorum. Kütüphane aynı, init kodları aynı? Neyi atlıyorum çok merak ediyorum ???
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 17:04:31
Yukarıdaki kodlardada sıkıntı yok.

Yahu bu ne iştir, ivme ölçer çalışıyor, Register okuması yapabiliyorum. I2C de problem yok. Fakat X,Y ve Z eksen bilgilerini okuduğumda hep sıfır okuyorum. İvme ölçerin değer göndermesi için başka birşeymi yapmam gerekiyor? Fikri olan yokmu
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: z - 10 Mayıs 2014, 17:32:57
 accel_data[n] degerleri sifirdan farklimi?

Sensor enable, calibration vs gibi durumlar varmi?
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 17:43:15
Hocam Eksenler ile ilgili bütün değerler sıfır geliyor. Ama buna rağmen örneğin POWER_CTL registerine init aşamasında 0x08 yazılmışsa main içerisinde aynı registeri okuyorum 0x08 geliyor. DEVICE_ID registerini okuyorum datasheette yazdığı gibi 0xE5 geliyor.

Main programındada düzenli olarak okuma yapılıyor. Yani programda aksamalarda olmuyor.

Acaba sensörün içine ivme ölçer yerleştirmeyimi unuttular.  :-X  :o :-\

Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: z - 10 Mayıs 2014, 18:10:59
Registerlere baktim da standby modu falan var. Bence init rutinin eksik. Dokumandaki registerleri okuyup init edilmesi unutulan bir register varmi bakmalisin.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 18:31:33
Hocam iyide uyku modunu ayarlayan POWER_CTL registerini init işleminde geçiriyorum. 3. bit Measurement biti Bu biti set etmişim.
(ADXL345_POWER_CTL=0x08)

Anlamadığım nokta şu, Bu çipi ilk kullanan ben değilim. Başkalarının kullandığı kodları kullanıyorum. Millet çatır çatır çalıştırıyorken ben aynı kodlarla anlamsız problemlerle karşılaşıyorum.

Harbiden elektronik biraz şans işi diye düşünmeye başladım. Belliki bu alanda şansım yok

Haydi çık şimdi işin içinden. Yardıma ihtiyacım var  :-\
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: z - 10 Mayıs 2014, 18:49:17
Donanimsal bir sorunun olabilir. Ne bileyim cipin dekuplaj kapasitesi varmi diye en bastan didiklemek lazim.

Boyle bir sorunla karsilassam oncelikle init ettigim registerleri bir de okurdum gercekten de istedigimi yazmisim mi diye.

Ip uclari verebilir.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 10 Mayıs 2014, 19:52:04
Hocam okuma yapıyorum yazdığım değerleri geri veriyor.

Arkadaşımda üzerinde Yine ADXL345 bulunan farklı bir modül var. Gidip onu aldım. Birde onunla deneme yapayım.

Edit; Yok oda aynı şekilde çalışıyor. Arada hiçbir fark yok.

İnternetteki çoğu kütüphaneyi inceledim. Arduinocular da aynı şekilde init etmişler. Sadece DATA_FORMAT ve POWER_CTL registerlerinde işlem yapmışlar.

Daha önce bu çiple uğraşan kimler var. Ben şu kodları kullanarak çalıştırdım diyen kimse yokmu? Farklı kütüphaneleri incelemem lazım.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: artapon - 13 Mayıs 2014, 00:32:50
usta ben arduino da çalıştırdım. eğer biraz beklersen kodları bulup paylaşayım. gayet güzel bir şekilde çalışıyordu.

mesaj birleştirme:: 13 Mayıs 2014, 14:49:04


http://s3.dosya.tc/server22/aXGU2X/inoile_vme_l__m_veRfileKablosuzKontrol.docx.html (http://s3.dosya.tc/server22/aXGU2X/inoile_vme_l__m_veRfileKablosuzKontrol.docx.html)

http://s3.dosya.tc/server22/23LaGi/B_L_M6.-PROGRAMKODLARI.docx.html (http://s3.dosya.tc/server22/23LaGi/B_L_M6.-PROGRAMKODLARI.docx.html)

yukarıdaki iki link işini görecektir...

bu benim tez konumdu. dosyalarda gerekli açıklamayı bulabilirsin...

mesaj birleştirme:: 13 Mayıs 2014, 00:54:42

ayrıca bu chipte ekstra olarak I2C yoluna direnç bağlamanıza gerek yok.

ADXL345 Modülü Açık Şeması:

(http://i.hizliresim.com/XWEonj.jpg) (http://hizliresim.com/XWEonj)

Ayrıca dökümanda Modülü mikrdenetleyiciye nasıl bağanacağı ile alakalı açıklama mevcut. bağlantı şekli çok önemli... çünkü chip buna göre ID alıyor...

İyi Çalışmalar...
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: vitruvius - 15 Mayıs 2014, 19:51:30
Mucit23, hocam son durum nedir? Uzaktan takipteydim, bir gelişme var mı?
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 15 Mayıs 2014, 21:29:38
Hocam ertesi gün sakin kafayla bakınca kodları inceleyince gördüm. adreslerde hata vardı. Şimdi okuma konusunda sıkıntı yok.

Birşey sorayım. CCS nin make16 komutu nasıl çalışıyor?

     xaxis=make16(accel_data[1],accel_data[0]);
Bu kodla
     xaxis=(int16)((accel_data[1]<<8)|accel_data[0]);
Bu kod farklı sonuçlar veriyor.

Make16 doğru çalışırken benim yaptığım düzgün çalışmıyor
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: sadogan - 15 Mayıs 2014, 22:45:41

xaxis=(int16)accel_data[1]<<8|accel_data[0];

Bu şekilde çalışmıyor mu ?
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 15 Mayıs 2014, 23:43:51
Yok o şekilde iki adet işaretli tam sayı 16 bit olarak birleşmiyor

make16 ile sonuçta yerçekimi etkisinde eksenlerden +280 ile -280 arası bir değer alıyorum

make16 yerine kendim birleştirsem aldığım değerler sürekli pozitif ve anlamsız oluyor.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: mistek - 15 Mayıs 2014, 23:50:47
@mucit23

Ben şu şekilde kullanıyormuşum.
   

int16_t adxl345_data_x=0;

int16_t adxl345_msb_x = i2c_read(ADXL345_ADR, ADXL345_xMSB);
int16_t adxl345_lsb_x = i2c_read(ADXL345_ADR, ADXL345_xLSB);

adxl345_data_x = ((adxl345_msb_x << 8) + adxl345_lsb_x);
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: sadogan - 16 Mayıs 2014, 01:17:00
2 adet işaretli tam sayı birleştirmekten kastın aslında 16 bit olan bir sayıyı
8 bit 8 bit okuyup 16 bit sayı elde etmek deyilmi yapmaya çalıştığın işlem bu.
Olmayan bir kaç örenek verebilirmisin.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: Mucit23 - 16 Mayıs 2014, 01:35:49
hocam sizin verdiğiniz parçacık çalışmıyor. Gerçi ben gelen parçaları tek tek incelemedim.
Galiba iki parçayı or ile birleştiriyorum ondan kaynaklanıyor. Birde @Mistek'ğin dediği gibi deneyeyim.
Başlık: Ynt: ADXL345 ivme sensörü uygulaması
Gönderen: sadogan - 16 Mayıs 2014, 11:44:23
Alıntı yapılan: Mucit23 - 16 Mayıs 2014, 01:35:49
hocam sizin verdiğiniz parçacık çalışmıyor. Gerçi ben gelen parçaları tek tek incelemedim.
Galiba iki parçayı or ile birleştiriyorum ondan kaynaklanıyor. Birde @Mistek'ğin dediği gibi deneyeyim.
İlginc olan bende çalışması (CCS 5.020 versiyon)