#include <L3G4200D.h>
#include <lcd.c>
#include <math.h>






#define WHO_AM_I 0x0F
#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 FIFO_SRC_REG 0x2F
#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
#define STATUS_REG 0x27
#define REFERENCE 0x25
#define INT1_CFG  0x30
#define INT1_SRC  0x31
#define INT1_THS_XH 0x32
#define INT1_THS_XL 0x33
#define INT1_THS_YH 0x34
#define INT1_THS_YL 0x35
#define INT1_THS_ZH 0x36
#define INT1_THS_ZL 0x37
#define INT1_DURATION 0x38
/*#define x_eksen 0
#define y_eksen 1
#define z_eksen 2*/


enum eksenler {
    x_eksen = 0,
    y_eksen = 1,
    z_eksen = 2,
};


signed int8 xMSB=0;
signed int8 xLSB=0;
signed int8 yMSB=0;
signed int8 yLSB=0;
signed int8 zMSB=0;
signed int8 zLSB=0;


signed int16 Rm[3]={0};
float32 Ro[3]={0};
float32 Rth[3]={0};
float32 Rt[3]={0};


void           init();  //Fonksiyon prototipleri
void           Setup_Gyro();
void           Gyroscope_Write(unsigned int8 yazilacakAdres,unsigned int8 deger);
signed int8    Gyroscope_Read(unsigned int8 okunacakAdres);
void           Gyroscope_Values_Raw();
void           Gyroscope_Values();
void           Calibrate_Gyro();


void main() //Ana Fonksiyon
{
   init();
   Setup_Gyro();
   Calibrate_Gyro();
   while(true)
   {
      Gyroscope_Values();
      delay_ms(100);
      printf(lcd_putc,"\f");
      lcd_gotoxy(1,1);
      printf(lcd_putc,"X:%Ld",Rt[x_eksen]);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"Y:%Ld",Rt[y_eksen]);
      lcd_gotoxy(9,1);
      printf(lcd_putc,"Z:%Ld",Rt[z_Eksen]);
        
   }
}
//#############################################################################
void init() //Denetleyici ayarları
{
   setup_psp(PSP_DISABLED);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   lcd_init();
   lcd_gotoxy(1,1);
   printf(lcd_putc,"LCD confirmed");
   delay_ms(500);
   printf(lcd_putc,"\f");
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void Setup_Gyro()
{
 
  Gyroscope_Write(CTRL_REG2,0b00100000); //Normal mode (reset reading HP_RESET_FILTER) ,High pass filter cut off frecuency:8
  Gyroscope_Write(CTRL_REG3,0b00001000);// I2_DRDY,I2_WTM,I2_ORun,I2_Empty etkin ,push-pull--FIFO etkin olmadığı durumda push-pull hariç diğerleri geçersiz
  Gyroscope_Write(CTRL_REG4,0b10010000);//BDU:1,500 dps,self-test disabled(normal mode)
  Gyroscope_Write(CTRL_REG5,0b00001010);//HPF disabled,FIFO disabled
  /*Gyroscope_Write(REFERENCE,0b00000000);
  Gyroscope_Write(INT1_THS_XH,0b00000000);
  Gyroscope_Write(INT1_THS_XL,0b00000000);
  Gyroscope_Write(INT1_THS_YH,0b00000000);
  Gyroscope_Write(INT1_THS_YL,0b00000000);
  Gyroscope_Write(INT1_THS_ZH,0b00000000);
  Gyroscope_Write(INT1_THS_ZL,0b00000000);
  Gyroscope_Write(INT1_DURATION,0b00000000);
  Gyroscope_Write(INT1_CFG,0b00000000);*/
  Gyroscope_Write(CTRL_REG1,0b00011111); // 100Hz,25 cut-off/ X,Y,Z etkin
  delay_ms(252);
         
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void Calibrate_Gyro()
{
   float32 X[50]={0};
   float32 Y[50]={0};
   float32 Z[50]={0};
   float32 temp[3]={0};


   //50 adet çiğ değer toplanıyor ve ayrıca bu değerler hafızada tutuluyor.
   for(unsigned int8 i=0;i<50;i++)
   {
      Gyroscope_Values();
      X[i]=Rm[x_eksen];    Y[i]=Rm[y_eksen];    Z[i]=Rm[z_eksen]; 
   // her döngüde farklı değerler farklı eksen dizilerine veriler atandı.
         temp[x_eksen] = temp[x_eksen] + Rm[x_eksen];
         temp[y_eksen] = temp[y_eksen] + Rm[y_eksen];
         temp[z_eksen] = temp[z_eksen] + Rm[z_eksen]; 
         //zero-rate için veri toplanıyor
   }
         //zero-rate belirleniyor
      Ro[x_eksen] = temp[x_eksen] / 50;
      Ro[y_eksen] = temp[y_eksen] / 50;
      Ro[z_eksen] = temp[z_eksen] / 50;
   
   for(int k=0;k<50;k++)
   {//threshold için veri toplanıyor
      Rth[x_eksen] = Rth[x_eksen] +  pow((X[k] - Ro[x_eksen]),2);
      Rth[y_eksen] = Rth[y_eksen] +  pow((Y[k] - Ro[y_eksen]),2);
      Rth[z_eksen] = Rth[z_eksen] +  pow((Z[k] - Ro[z_eksen]),2);
   }
   
      Rth[x_eksen] = 3*sqrt(Rth[x_eksen] / 50);
      Rth[y_eksen] = 3*sqrt(Rth[y_eksen] / 50);
      Rth[z_eksen] = 3*sqrt(Rth[z_eksen] / 50);     
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void Gyroscope_Write(unsigned int8 yazilacakAdres,unsigned int8 deger)
{
   i2c_start();
   i2c_write(0xD2);
   i2c_write(yazilacakAdres);
   i2c_write(deger);
   i2c_stop();
   delay_ms(20);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
signed int8 Gyroscope_Read(unsigned int8 okunacakAdres)
{
   signed int8 gonder=0;
   i2c_start();
   i2c_write(0xD2);
   i2c_write(okunacakAdres);
   i2c_start();
   i2c_write(0xD3); 


       gonder = i2c_read(0);
    
   i2c_stop();
   delay_ms(10);
   return(gonder);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


void Gyroscope_Values_Raw()
{
   unsigned int8 cikis=0,hpfReset,c=0;
   cikis = Gyroscope_Read(STATUS_REG);
   delay_ms(5);


   while(bit_test(cikis,3)==0)
   {
      cikis = Gyroscope_Read(STATUS_REG);
   }
   


   //if(bit_test(cikis,7)==1)  return;
     
         xMSB = Gyroscope_Read(OUT_X_H);
         xLSB = Gyroscope_Read(OUT_X_L);
         yMSB = Gyroscope_Read(OUT_Y_H);
         yLSB = Gyroscope_Read(OUT_Y_L);
         zMSB = Gyroscope_Read(OUT_Z_H);
         zLSB = Gyroscope_Read(OUT_Z_L);
         hpfReset = Gyroscope_Read(REFERENCE);
         Rm[x_eksen] = make16(xMSB,xLSB);
         Rm[y_eksen] = make16(yMSB,yLSB);
         Rm[z_eksen] = make16(zMSB,zLSB);
         delay_ms(10);
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void Gyroscope_Values()
{
   Rt[x_eksen]=0;   Rt[y_eksen]=0;   Rt[z_eksen]=0;
   float32 deltaR[3]={0};
   Gyroscope_Values_Raw();
   for (int j = 0; j<3; j++)
   {
      deltaR[j] = Rm[j] - Ro[j]; 
      
      if (abs(deltaR[j]) < Rth[j])
            deltaR[j] = 0;
            
      Rt[j] = deltaR[j] * 0.0175 * 0.01;//0.01 ile açısal yer değiştirme bulunur.   
   }
}


//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
/*void Gyroscope_Values_Raw(signed int16 array[])
{
   Gyroscope_Write(FIFO_CTRL_REG,0b00101010);//wtm:10 fifo mod
   unsigned int8 cikis=0;
   cikis = Gyroscope_Read(FIFO_SRC_REG);
      while(bit_test(cikis,7)==0)
        cikis = Gyroscope_Read(FIFO_SRC_REG);
        
       while(bit_test(cikis,5)==0) //empty bit 0 iken verileri alr
       {
         xMSB = Gyroscope_Read(OUT_X_H);
         xLSB = Gyroscope_Read(OUT_X_L);
         yMSB = Gyroscope_Read(OUT_Y_H);
         yLSB = Gyroscope_Read(OUT_Y_L);
         zMSB = Gyroscope_Read(OUT_Z_H);
         zLSB = Gyroscope_Read(OUT_Z_L);
         
         array[0] = make16(xMSB,xLSB);
         array[1] = make16(yMSB,yLSB);
         array[2] = make16(zMSB,zLSB);
         
         cikis = Gyroscope_Read(FIFO_SRC_REG);// empty bitini öğrenmek için güncelleme
    
      delay_ms(5);
       }
     
    Gyroscope_Write(FIFO_CTRL_REG,0b00001010);
}*/


Hey guys ,I have a problem ,accordign to datasheet if  STATUS_REG 7. bit=0  in this case some values overwritten before I read previously ,How I can block this .Actually I dont know my problem is related with this but I should notify .Now I have some values very big that despite I do multiplication with like 0.00000001 ,I m moving with application notes.
Thanks for your helps .

multiplication
multiplication