Gyroscope -Veri alma sorunu-Kodlar verilmiştir.

Başlatan Zek_De, 13 Ağustos 2016, 22:47:57

Zek_De

Arkadaşlar birkaç gündür uğraşıyorum bir türlü düzgün veri alamadım bu cihazdan artık bozuk olduğundan şüphe etmeye başladım derken ki bir baktım başka kişilerde benzer sorunu yaşamış ama çözümü yazan yok .Kurulumda mı sıkıntı var ,yoksa okuma yaparken hesaba katmadığım bir durum mu.



#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
#define CTRL_REG6 0x25
#define FIFO_CTRL_REG 0x2E
#define WHO_AM_I 0x0F
#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D
unsigned short IslemAdres = 0xD2;  //Yazma yapmayı sağlar D3 ise okuma
signed int xMSB=0;
signed int xLSB=0;
signed int yMSB=0;
signed int yLSB=0;
signed int zMSB=0;
signed int zLSB=0;

sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;

sbit Soft_I2C_Scl           at RB1_bit;
sbit Soft_I2C_Sda           at RB0_bit;
sbit Soft_I2C_Scl_Direction at TRISB1_bit;
sbit Soft_I2C_Sda_Direction at TRISB0_bit;

void         init();
void         Gyroscope_Write(unsigned short yapilacakIs,unsigned short yazilacakAdres,unsigned short deger);
void         Setup_Gyro();
signed int   Gyroscope_Read(unsigned short yapilacakIs,unsigned short okunacakAdres);
void         Gyroscope_Values();
signed int          Birlestir(signed int x,signed int y);
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void main()
{
   init();
   Setup_Gyro();
   LCD_Out(2,1,"Setup_Gyro");
   delay_ms(100);
   Lcd_Cmd(_LCD_CLEAR);
   while(1)
   {
        Gyroscope_Values();
        delay_ms(10);
   }
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void init()
{
   ADCON1=0x0F;
   CMCON = 7;
   Lcd_Init();
   delay_ms(100);
   //I2C1_Init(100000);
   Soft_I2C_Init();
   LCD_Out(1,1,"I2C");
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void Setup_Gyro()
{
  Gyroscope_Write(IslemAdres,CTRL_REG1,0b00001111); // 100Hz, 12.5, Power Up
  Gyroscope_Write(IslemAdres,CTRL_REG2,0b00101001);
  Gyroscope_Write(IslemAdres,CTRL_REG3,0b00001000);
  Gyroscope_Write(IslemAdres,CTRL_REG4,0b10110000);
  Gyroscope_Write(IslemAdres,CTRL_REG5,0b00000000);
  Gyroscope_Write(IslemAdres,FIFO_CTRL_REG,0b00000000);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void Gyroscope_Write(unsigned short yapilacakIs,unsigned short yazilacakAdres,unsigned short deger)

{
    //I2C1_Start();
    Soft_I2C_Start();
    //I2C1_Wr(yapilacakIs);
    Soft_I2C_Write(yapilacakIs);
    Soft_I2C_Write(yazilacakAdres);
    //I2C1_Wr(yazilacakAdres);
    Soft_I2C_Write(deger);
    //I2C1_Wr(deger);
    Soft_I2C_Stop();
    //I2C1_Stop();
    delay_ms(100);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
signed int Gyroscope_Read(unsigned short yapilacakIs,unsigned short okunacakAdres)
{
    signed int gonder=0;
    //I2C1_Repeated_Start();
    Soft_I2C_Start();
    Soft_I2C_Write(okunacakAdres);
    //I2C1_Wr(yapilacakIs);
    //I2C1_Wr(okunacakAdres);
    Soft_I2C_Write(yapilacakIs);
    Soft_I2C_Start();
    //I2C1_Repeated_Start();
    //I2C1_Wr(yapilacakIs+1);
    Soft_I2C_Write(yapilacakIs+1);
    //gonder = I2C1_Rd(0);
    gonder = Soft_I2C_Read(0);
    //I2C1_Stop();
    Soft_I2C_Stop();
    return gonder;
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
signed int  Birlestir(signed int x,signed int y)
{       // x MSB //y LSB
       signed int z=0;
       z=x;
       z=z>>8;
       z=y|z;
       return z;
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void  Gyroscope_Values()
{
     float eksen_x=0,eksen_y=0,eksen_z=0;
     int i=0;
     float x=0,y=0,z=0;
     char text[15]="";
       xMSB = Gyroscope_Read(IslemAdres,OUT_X_H);
       xLSB = Gyroscope_Read(IslemAdres,OUT_X_L);
       eksen_x=Birlestir(xMSB,xLSB);
       eksen_x= eksen_x;
       yMSB = Gyroscope_Read(IslemAdres,OUT_Y_H);
       yLSB = Gyroscope_Read(IslemAdres,OUT_Y_L);
       eksen_y=Birlestir(yMSB,yLSB);
       
       zMSB = Gyroscope_Read(IslemAdres,OUT_Z_H);
       zLSB = Gyroscope_Read(IslemAdres,OUT_Z_L);
       eksen_z=Birlestir(zMSB,zLSB);

       IntToStr(eksen_x,text);
       LCD_Out(1,1,"x:");
       LCD_Out(1,3,text);

       IntToStr(eksen_y,text);
       LCD_Out(2,1,"y:");
       LCD_Out(2,3,text);
       
      // IntToStr(eksen_z,text);
       //LCD_Out(1,,"z:");
       //LCD_Out(1,3,text);
}

35Murat35

Merhaba
Bi vatandaş mikrobasic'te şöyle bişey yapmış. Bunu bi dene istersen. Libstock'da dosyalarıda var.
http://forum.mikroe.com/viewtopic.php?f=97&t=55844