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);
}
}