STM32F407discovery board'unun accelerometresini kullanamıyorum

Başlatan alper0017, 06 Aralık 2012, 23:44:24

alper0017

Merhaba herkese.Forumdaki ilk yazım.Konuyu yanlış yere açtıysam lütfen kusruma bakmayın fakat bu sorunla günlerdir uğraşmaktayım.Forumda %90 keil kullanılmasına rağmen ben mikroc kullanıyorum ve lis302dl isimli accelerometremi kullanamamaktayım.SPI ile denemediğim çalışma kalmadı.Cortex M4 kitimde şematiği incelememe rağmen lis302 dl'nin PA5-PA6-PA7 bacaklarına bağlı olduğunu görmekteyim ve mikroişlemcide bu bacaklara ait sadece spi var.i2c ile programlamak istersek ne yapmamız gerekli?Bu konuda birileri bana yardımcı olursa çok çok sevinirim.Şimdiden teşekkür ederim :)

Klein

Eğer I2C pinlerine bağlı değilse, port remap ile I2C donanımına yönlendirilemiyorsa, yapabileceğin bir şey yok. Ya SPI olarak kulanacaksınız , ya da ivmeölçeri söküp dışarıdan bağlayacaksınız.

mesaj birleştirme:: 08 Aralık 2012, 12:12:35

SPI ile yaptığınız çalışmanın kodlarını yüklerseniz, yardımcı olmaya çalışırım.

alper0017

Belirli bir süre yanıt gelmeyince bende i2c ile çalışmalarıma başlamıştım.i2c'yi mikroc 'nin software_i2c kütüphanesini kullanarak yapıyorum.yazılımsal bir i2c ile.Fakat bu seferde değer olarak sürekli 640 okuyorum.Yine bi çözüm bulamadım yani...

/* CHİP SELECT cihazın spi mi i2c mi kullanılacağını söylüyor.1 olursa spi 0 olursa i2c seçiliyor.SDA bacağı PA7 bacağına, SCL bacağı PA5 bacağına bağlı.Kod stm32f4discovery arm kiti ve lis302dl accelerometer modülü için yazılmış.Bu bacaklarda donanımsal i2c çıkışı olmadığı için software i2c kullanılmıştır ve kesmeler aşağıdaki fonksiyonda soft_i2c_break() komutu ile kontrol edilmektedir.*/

    sbit GLCD_D7_Direction at GPIOB_ODR.B7;
    sbit GLCD_D6_Direction at GPIOB_ODR.B6;
    sbit GLCD_D5_Direction at GPIOB_ODR.B5;
    sbit GLCD_D4_Direction at GPIOB_ODR.B4;
    sbit GLCD_D3_Direction at GPIOB_ODR.B3;
    sbit GLCD_D2_Direction at GPIOB_ODR.B2;
    sbit GLCD_D1_Direction at GPIOB_ODR.B1;
    sbit GLCD_D0_Direction at GPIOB_ODR.B0;

    sbit GLCD_CS1           at GPIOD_ODR.B1;
    sbit GLCD_CS2           at GPIOD_ODR.B0;
    sbit GLCD_RS            at GPIOD_ODR.B2;
    sbit GLCD_RW            at GPIOD_ODR.B3;
    sbit GLCD_EN            at GPIOD_ODR.B4;
    sbit GLCD_RST           at GPIOD_ODR.B5;  // direk 1'e bağlanacak

     sbit Soft_I2C_Scl                   at GPIOA_ODR.B5;
     sbit Soft_I2C_Sda                 at GPIOA_ODR.B7;
     sbit Soft_I2C_Scl_Direction   at GPIOA_ODR.B5;
     sbit Soft_I2C_Sda_Direction at GPIOA_ODR.B7;

    int status=5,result=0;
   
    char status_txt[7];

    void Timer_7_kesmesi() iv IVT_INT_TIM7 ics ICS_AUTO //Timer7 interruptı  Tools/Interrupt assistant aracılığı ile ayarlandı.
    {
       TIM7_SR=0;  // Timer7 Interrupt bayrağı.
       
       Soft_I2C_Break();
    }

     void LIS302DL_Write(int adresso,int lis_data)
    {
    GPIOA_ODR.B5=1;
    Delay_us(500);
   
    Soft_I2C_Start();
    Soft_I2C_Write(0x30);
    Soft_I2C_Write(adresso);
    Soft_I2C_Write(lis_data);
    Soft_I2C_Stop();
    }
   
     int LIS302DL_Read(int adresso)
    {
    Soft_I2C_Start();
    Soft_I2C_Write(0x30);
    Soft_I2C_Write(adresso);
   
    Soft_I2C_Start();
    Soft_I2C_Write(0x31);
    result=Soft_I2C_Read(0);
    Soft_I2C_Stop();
    }
   
      void I2C_Config()
     {
     soft_i2c_init();
     
     LIS302DL_Write(0X20,0XC7); DELAY_MS(25);
     LIS302DL_Write(0X21,0X95); DELAY_MS(25);
     LIS302DL_Write(0X22,0X00); DELAY_MS(25);
     LIS302DL_Write(0X23,0X90); DELAY_MS(25);
     LIS302DL_Write(0X24,0X03); DELAY_MS(25);
     LIS302DL_Write(0X30,0X2A); DELAY_MS(25);
     LIS302DL_Write(0X32,0X0A); DELAY_MS(25);
     }

void initial()
{
GPIO_Digital_Output(&GPIOE_ODR, _GPIO_PINMASK_3);  // Chip Select çıkış yapılıyor.

GPIOE_ODR.B3=0;
   
   glcd_init();
   glcd_fill(0);
   
   I2C_config();
}

void main()
{
initial();

   while(1)
   {
   status=LIS302DL_Read(0x0F);

        inttostrwithzeros(status,status_txt);
        glcd_write_Text(status_txt,0,0,1);
   }
}
Saygılarımla;
S.Alper Oğan

pisayisi

İvmeölçerin bağlı olduğu spi1 portu i2c ile alternate function olarak kullanılamadığından, donanımsal değişiklik yapmadan i2c olarak kullanmak mümkün olmayacaktır.pe3 çıkışını lojik sıfır yaparak i2c moduna alsanız bile sda scl bağlantılarını manuel olarak elle gerçekleştirmek lazım aksi halde donanımsal i2c ile kullanma imkanı yok...
Murat

alper0017

Elimde MMA8452 adında i2c ile kontrol edilen bir başka accelerometre'de var.Bunu arm'ın i2c2 portlarına bağlıyorum ve mikroc'nin i2c kütüphanesini kullanarak kontrol etmeye çalışıyorum ve sorun hep aynı :(.

Klein

Bu çipin donanımları içinde hiç kullanmadığım donanımlar I2C , USB ve ETHERNET. Bu sebeple I2C için yazılan kodlarda hata olup olmadığını anlamam kolay olmayacak. Üstüne bir de Soft I2C kullanlımış olması işleri iyice zorlaştırıyor.
SPI ile uğraştığın zaman yazdığın kodları yükleyebilir misin? Belki daha kolay analiz edebilirim.

alper0017

Malesef SPI ile hazırladığım örneği I2C'ye dönüştürdüğüm için kodlar değişti. :(
Ama kullandığım mantığı aktarabilirim.

İstediğim sadece x,y,z den gelen verileri okumak şimdilik.
Bu yüzden mikroc'nin hazır SPI kodlarıyla ctrl_reg1 registerinin PD,Xen,Yen,Zen bitlerini 1 yapmam gerektiğini düşünüyorum.Daha sonra kolaylıkla WHO_AM_I registerindeki 0x3B datasını okumam gerektiğini düşünüyorum.Who_am_i içeriğini okuyabilsem x,y,z'yide okurum ama anladığım kadarıyla modülü uyandıramıyorum.

Kısacası SPI ile who_am_i registerinin içeriğini okuyabilmek için sırasıyla yapmamız gereken işlemler nelerdir acaba?

Mantığı anlasam kodu da yazacağım gibi geliyor ama birşeyleri atlıyorum. Bu konuyla ilgilenen yardımsever arkadaşlarımı/hocalarımı yazdığım kodlara boğmadan önce kısaca bu modülün spi mantığını anlatmalarını rica edeceğim.
Saygılarımla...

Klein

MicroC kütüphanesini tanımayınca zor olacak gibi.
SPI kütüphanesinden SPI init yaptığınızda , ilgili portlar da init oluyor mu? Portları kendiniz init etmeniz mi gerekiyor?

iyildirim

MikroC ile bende hiç çalışmadım.

LIS302 ile de çalışmadım. Ama ST'nin çeşitli accelerometer' leri ile çalıştım. Hepsinde de SPI iletişimi aynı şekilde idi.
SPI için; Clock'un  idle' ı high olmalı ve mcu dan çıkan SDO (lis302'nin SDI sı) sinyalinde datanın düşen kenarda değişmesi gerektiğini Acc. nin de datayı yükselen kenarda okuduğunu not etmişim. Başka özel bir şey yok.

WHO_AM_I registerini okumak için SPI da okuma modunda registerin adresini göndermek yeterli. I2C de ise yine okuma modunda device adresi ve register adresini göndermek yeterli.  Write komutlarını hiç kullanmadan sadece I2C yi init edip device ve register adresini gönderip bir deneyin derim.

Birde yanlış hatırlamıyorsam, SPI da pull-up gerekmezken I2C de aynı hattı aktive eden iki ayrı cihaz olduğundan pull-up gerekiyordu. En azından data hattında.. STM32F4 de ilgili pin de pull up yoksa eklemeniz veya işlemci üzerinden yapmak için ilgili register ayarlarını yapmanız gerekir. Ki mikroC'nin soft I2C si nin zaten yapıyor olması gerekir. Ama yinede bi kontrol etmekde fayda var.

muhendisbey

Alıntı yapılan: alper0017 - 08 Aralık 2012, 17:44:47
Malesef SPI ile hazırladığım örneği I2C'ye dönüştürdüğüm için kodlar değişti. :(
Ama kullandığım mantığı aktarabilirim.

İstediğim sadece x,y,z den gelen verileri okumak şimdilik.
Bu yüzden mikroc'nin hazır SPI kodlarıyla ctrl_reg1 registerinin PD,Xen,Yen,Zen bitlerini 1 yapmam gerektiğini düşünüyorum.Daha sonra kolaylıkla WHO_AM_I registerindeki 0x3B datasını okumam gerektiğini düşünüyorum.Who_am_i içeriğini okuyabilsem x,y,z'yide okurum ama anladığım kadarıyla modülü uyandıramıyorum.

Kısacası SPI ile who_am_i registerinin içeriğini okuyabilmek için sırasıyla yapmamız gereken işlemler nelerdir acaba?

Mantığı anlasam kodu da yazacağım gibi geliyor ama birşeyleri atlıyorum. Bu konuyla ilgilenen yardımsever arkadaşlarımı/hocalarımı yazdığım kodlara boğmadan önce kısaca bu modülün spi mantığını anlatmalarını rica edeceğim.
Saygılarımla...

İşin kolayı:
accelerometer örneğini incele. Orada hazır kodlar mevcut. Bir de kullanılan accelerometer datasheet'ine bakarsan işi çözersin. Malesef benimde bakmadığım bir uygulama. Daha önce arduinoda bu protokolü kullanmıştım.
http://www.st.com/internet/evalboard/product/252419.jsp
burada dökümanlar içerisinde firmware dosyası içerisinde örnek.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

alper0017

Örnek kodları kullanarak güzel veriler okudum.

Bilgilerimi lcd'ye okutuyorum.Hem sayısal değerleri hemde x,y,z grafiklerini görebiliyorum.

Aynı zamanda linvor bluetooth modülümden com30 seri bağlantısı üzerinden seri monitörden gözlemleyebiliyorum.

Şimdi farklı sorularla karşınızdayım:)

Seriden okuduğum bu değerleri, bir arayüz yazmadan(yazılmış bir arayüz ile veya mümkünse matlab gibi bir programla) grafik (x-zaman   y-zaman     z-zaman    şeklinde 3 grafik) üzerinde nasıl gözlemleyebilirim?
Saygılarımla...
S.Alper Oğan

Firzen

Hocam bende hiç deneme yapmadım bana yardımcı olabilir misiniz ivme ölçer konusunda?
yazdığınız kodu derlemeye çalıştım onu bile kabul etmedi...
Kararsız...

alper0017

Arkadaşlar Yeni aldığım IMU(GYRO+ACCELEROMETRE+MAGNETOMETRE) sensörlerini ve lis302dl accelerometre modülü güzel bir şekilde okuyup filtre edebiliyorum şuan.Bu konuda sıkıntısı olan arkadaşlar özellikle mail adresim s.alperogan@hotmail.com adresine mail atabilirim.seve seve yardımcı olurum.Kodları da burada paylaşacağım

LukeSkywalker

@alper
mikroC ile mi okudun Lis302dl'yi?
Nasıl okuduğunu aktarır mısın?
Ben de baya bi uğraştım ama okutamadım...

fatih6761

Arkadaşlar neden LIS302DL'yi okuyamadığınızı bilmiyorum ama çok zor değil. Hatta mikroC için bir kütüphane yazmaktayım. Herhalde birkaç güne biter.
Temel özellikleri denedim. Software SPI ile çalıştırabiliyorum.