ADIS16209 Inklinometre Pic16f877a

Başlatan caksoy, 18 Nisan 2013, 12:12:26

caksoy

Arkaşlar Merhaba,

ADIS16209 Inklinometre sensörüyle Xinc_out ve Yinc_out registerlarından veri okumak istiyorum. Kontrol amaçlı PROD_ID registerını okuyorum. Veriler 2 byte olduğu için yüksek ve alçak olmak üzere ayrı ayrı alıp işlem yapıyorum. Fakat okuma yapamıyorum. Kullandığım sensör yaygın bir sensör değil. Kodları datasheeti okuyarak yazdım. Kodlar aşağıdaki gibi. Yardımcı olursanız çok sevinirim.

spi.c
#include <pic.h>
#include "spi.h"

void spi_init(void)
{
   //SSPSTAT->SMP,CKE,BF
   //SSPCON1->WCOL,SSPOV,SSPEN,CKP,SSPM3,:SSPM0
   
   SMP=1;              //Data 8.bitten sonra aliniyor.
   SSPBUF=0;          //SSPBUF siliniyor.
   BF=0;              //SSPBUF bos
   
   CKE=0;
        CKP=1;
   
    WCOL=0;     //Basta alim hatalarinin olmadigi varsayiliyor
    SSPOV=0;
   
    /* Clock Hiz Ayari Yapiliyor
   
    0101: SPI Slave, SS disabled
    0100: SPI Slave, SS enabled
    0011: SPI Master, CLK=TMR2/2
    0010: SPI Master, CLK=Fosc/64
    0001: SPI Master, CLK=Fosc/16
    0000: SPI Master, CLK=Fosc/4
   
    */
   
    SSPM3=0;
    SSPM2=0;
    SSPM1=1;     //CLK=Fosc/64
    SSPM0=0;
   
    SSPEN=1;  //SCK,SDO,SDI,SS seri port pini oldu.
   
    }
void spi_write(unsigned char veri)
    {
       BF=0;
       SSPBUF=veri;  //BF=1 ve SSPBUF dolu
       while(!BF);   //BF=0 olana kadar bekleniyor
      
   }
   
   unsigned char spi_read(unsigned char veri)
   {
      BF=0;
         
      SSPBUF=veri; //SCK göndermek için tanımlanmıs kod gönderiliyor
      while(!BF);
      
      return SSPBUF;
   }
   
   
   
adis16209.c

#include <htc.h>
#include <stdio.h>
#include "spi.h"
#include "lcd.h"

#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 4000000
#endif

__CONFIG(LVP_OFF&BOREN_ON&PWRTE_ON&WDTE_OFF&FOSC_HS&CP_OFF&CPD_OFF&DEBUG_OFF);


#define CS RC6
#define RST RC7
#define SCK RC3
#define SDO RC5
#define SDI RC4





void adis_init(void)  //adis İLK YÜKLEMELER YAPILIYOR
{

   
   spi_init();
 
   CS=0;
    spi_write(0x3E);
    __delay_us(144);
    spi_write(0x00);
__delay_us(48);
   CS=1;
}

void adis(unsigned char *msb1,unsigned char *lsb1,unsigned char *msb2,unsigned char *lsb2,unsigned char *control1,unsigned char *control2)
{

__delay_us(48);   
CS=0;
    spi_write(0x0D);  //Yuksek byte bir adres yukarıda,X_INC
__delay_us(128);
   *msb1=spi_read(0xFF);
__delay_us(128);
spi_write(0x0C);  //Alçak byte,X_INC
__delay_us(128);
   *lsb1=spi_read(0xFF);
__delay_us(128);
CS=1;
__delay_us(48);
CS=0;
     spi_write(0x0F);//Yuksek byte bir adres yukarıda,Y_INC
__delay_us(128);
    *msb2=spi_read(0xFF);
__delay_us(128);
spi_write(0x0E);//Alçak byte,Y_INC
__delay_us(128);
   *lsb2=spi_read(0xFF);
__delay_us(48);
CS=1;
    __delay_us(128);
CS=0;
     spi_write(0x4B); ////Yuksek byte bir adres yukarıda,PROD_ID
__delay_us(128);
     *control1=spi_read(0xFF);
__delay_us(128);    //Alçak Byte,PROD_ID
spi_write(0x4A);
__delay_us(128);
    *control2=spi_read(0xFF);
__delay_us(128);;
CS=1;
   
}

void main (void)
{
   
   int a,yb1,db1,yb2,db2,control_1,control_2,yb1_dec,yb2_dec,db2_dec,db1_dec,xinc_dec,yinc_dec,xinc_10,yinc_10,xinc_1,yinc_1,control1_dec,control2_dec,control_dec;
   float xinc,yinc;
   unsigned char Azimuth[]=" ";
unsigned char Altitude[]=" ";
   unsigned char Control[]=" ";
   TRISB=0X00;
   PORTB=0X00;
   TRISC=0X10;
   CS=1;

   
   
   lcd_init();  //LCD ilk ayari yapiliyor
   adis_init(); //SPI ilk ayari yapiliyor
   
   
   
   for(;; )
   {
      
       
      adis(&yb1,&db1,&yb2,&db2,&control_1,&control_2);
   
        yb1=yb1&0x3f;  //masking new data and error bits//
        a=yb1&0x30; //negative or positive control //
       if(a==0)
      {
       
       yb1_dec=256*(((yb1&0x0F)/10)*10+(yb1&0x0F)%10);
       db1_dec=(((db1>>4)/10)*10+(db1>>4)%10)*16+(((db1&0x0F)/10)*10+(db1&0x0F)%10)*1;
       xinc_dec=yb1_dec+db1_dec;
      xinc=(0.025)*xinc_dec;
   
 
      } 
       
     if(a>0)
{
   
yb1_dec=256*(((yb1&0x0F)/10)*10+(yb1&0x0F)%10);//Yüksek byte desimale çeviriliyor
       db1_dec=(((db1>>4)/10)*10+(db1>>4)%10)*16+(((db1&0x0F)/10)*10+(db1&0x0F)%10)*1;//Alçak byte desimale çeviriliyor
       xinc_dec=(yb1_dec+db1_dec)-4096;
       xinc=(0.025)*xinc_dec;

}
     
xinc_10=(int)(xinc);
xinc_1=(int)(10*(xinc-xinc_10));
lcd_clear();
sprintf(Azimuth,"%d.%d",xinc_10,xinc_1);
lcd_goto(0x00);
lcd_puts("Azimuth:");
lcd_puts(Azimuth);
__delay_ms(500);

yb2=yb2&0x3f;  //masking new data and error bits//
        a=yb2&0x30; //negative or positive control //
       if(a==0)
      {
       
       yb2_dec=256*(((yb2&0x0F)/10)*10+(yb2&0x0F)%10);//Yüksek byte desimale çeviriliyor
       db2_dec=(((db2>>4)/10)*10+(db2>>4)%10)*16+(((db2&0x0F)/10)*10+(db2&0x0F)%10)*1;//Alçak byte desimale çeviriliyor
       yinc_dec=yb2_dec+db2_dec;
      yinc=(0.025)*yinc_dec;
   
 
      } 
       
     if(a>0)
{
   
yb2_dec=256*(((yb2&0x0F)/10)*10+(yb2&0x0F)%10); //Yüksek byte desimale çeviriliyor
       db1_dec=(((db2>>4)/10)*10+(db2>>4)%10)*16+(((db2&0x0F)/10)*10+(db2&0x0F)%10)*1;  //Alçak byte desimale çeviriliyor
       yinc_dec=(yb2_dec+db2_dec)-4096;
       yinc=(0.025)*yinc_dec;

}
     
yinc_10=(int)(yinc);
yinc_1=(int)(10*(yinc-yinc_10));

sprintf(Altitude,"%d.%d",yinc_10,yinc_1);
lcd_goto(0x40);
lcd_puts("Altitude:");
lcd_puts(Altitude);
__delay_ms(500);


control1_dec=4096*(((control_1>>4)/10)*10+(control_1>>4)%10)+256*(((control_1&0x0F)/10)*10+(control_1&0x0F)%10);  //Yüksek byte desimale çeviriliyor
control2_dec= db1_dec=(((control_2>>4)/10)*10+(control_2>>4)%10)*16+(((control_2&0x0F)/10)*10+(control_2&0x0F)%10)*1;//Alçak byte desimale çeviriliyor
control_dec=control1_dec+control2_dec;
sprintf(Control,"%d",control_dec);
lcd_clear();
lcd_goto(0x00);
lcd_puts("Control:");
lcd_puts(Control);
__delay_ms(500);      
   }
}