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);
}
}
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...
S.A.
Hocam veriler 8bit isaretli olrakmi geliyor?
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)
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.
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
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 :( :(
Kendi adıma çok yararlı bir paylaşım. Teşekkürler.
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.
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?
#use fast_io(c)
output_float(pin_c3);
output_float(pin_c4);
Bunları kaldırıp denedinizmi ?
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ı?
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)
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?
Ben kullandığım adxl345 'te CS bacağını biyere bağlamıyordum diye hatırlıyorum.
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 ???
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
accel_data[n] degerleri sifirdan farklimi?
Sensor enable, calibration vs gibi durumlar varmi?
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 :-\
Registerlere baktim da standby modu falan var. Bence init rutinin eksik. Dokumandaki registerleri okuyup init edilmesi unutulan bir register varmi bakmalisin.
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 :-\
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.
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.
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...
Mucit23, hocam son durum nedir? Uzaktan takipteydim, bir gelişme var mı?
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
xaxis=(int16)accel_data[1]<<8|accel_data[0];
Bu şekilde çalışmıyor mu ?
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.
@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);
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.
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.
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)