İvme Ölçer ADXL345

Başlatan BenC, 27 Kasım 2010, 00:21:16

BenC

ADXL345 İvme ölçer entegresine ait yazma ve okuma fonksiyonları.

Soft spi kullanarak yazdım. Hard SPI de henüz başaramadım. MCU olarak 16F876A 4 MHZ kullandım. Derleyici olarak Hi-Tech Pro kullandım. ADXL345 dahili adc ye sahip 10bit veya 13 bit çözünürlükte 3 eksendeki g leri veriyor. İlgilenen arkadaşlara yardımcı olması dileğiyle.

ADXL345.c dosyası

#include "ADXL345.h"
#include "Delay.h"	

/*******************************************************************************/
/**********                   ADXL345 INITILAZE                      ***********/
/*******************************************************************************/
/*******************************************************************************/
/*Fonksiyon Adı  : void ADXL345_INIT()                                         */
/*Açıklama       : ADXL 345'e ait özelliklerin ayarlanması bu fonksiyonla      */
/*                 gerçekleştirilir.                                           */
/*                                                                             */
/*                                                                             */
/*Yazar          : Armağan YILMAZ                                              */
/*Tarih          : 26.11.2010                                                  */
/*Version        : 1.0                                                         */
/*                                                                             */
/*Giriş          : Yok						                                   */
/*               :                                                             */
/*Çıkış          : Yok                                                         */
/*                                                                             */
/*                                                                             */
/*Kullanılan Veri:                                                             */
/*******************************************************************************/
void ADXL345_INIT()
	{
		// DATA FORMAT  0x31
		//Bit 7 = SELF TEST , 1=ON,0=OFF
		//Bit 6 = SPI , 1=3 WIRE,0=4 WIRE
		//Bit 5 = INT_INVERT , 1=ACTIF HIGH,0=ACTIF LOW
		//Bit 4 = USE 0
		//Bit 3 = FULL RES , 1=16 bit,0=10 bit
		//Bit 2 = JUSTIFY BIT , 1=left-justified,0=right-justified
		//Bit 1 = RANGE 
		//Bit 0 = RANGE   
		// 0 0 +-2g
		// 0 1 +-4g
		// 1 0 +-8g
		// 1 1 +-16g
		//0b00001111 = 0x0F
		ADXL345_YAZ(DATA_FORMAT,0x0F);


		// INTERRUPT ENABLE KONTROLU 0x2E
		//Bit 7 = DATA READY , 1=ON,0=OFF
		//Bit 6 = SINGLE TAB , 1=ON,0=OFF
		//Bit 5 = DOUBLE TAB , 1=ON,0=OFF
		//Bit 4 = ACTIVITY   , 1=ON,0=OFF
		//Bit 3 = INACTIVITY , 1=ON,0=OFF
		//Bit 2 = FREE FALL  , 1=ON,0=OFF
		//Bit 1 = WATERMARK  , 1=ON,0=OFF
		//Bit 0 = OVERRUN    , 1=ON,0=OFF
		//0b00000000 = 0x00
		ADXL345_YAZ(INT_ENABLE,0x00);
	
		// BW RATE 0x2C
		//Bit 7 = 0
		//Bit 6 = 0
		//Bit 5 = 0
		//Bit 4 = LOW POWER  , 1=ON,0=NORMAL
		//Bit 3 = RATE
		//Bit 2 = RATE
		//Bit 1 = RATE
		//Bit 0 = RATE
		// 1 0 1 0 DEFAULT
		//0b00001010 = 0x0A
		ADXL345_YAZ(BW_RATE,0x0A);
		
		// POWER KONTROLU 0x2D
		//Bit 7 = 0
		//Bit 6 = 0
		//Bit 5 = LINK         , 1=ON,0=OFF
		//Bit 4 = AUTO SLEEP   , 1=ON,0=OFF
		//Bit 3 = MEASURE      , 1=ON,0=OFF
		//Bit 2 = SLEEP        , 1=ON,0=OFF
		//Bit 1 = WAKE UP      , 1=ON,0=OFF
		//Bit 0 = WAKE UP      , 1=ON,0=OFF
		//0b00001000 = 0x00
		ADXL345_YAZ(POWER_CTL,0x08);
	}


/*******************************************************************************/
/**********                   ADXL345'TEN VERİ OKUMA                 ***********/
/*******************************************************************************/
/*******************************************************************************/
/*Fonksiyon Adı  : unsigned char ADXL345_OKU(unsigned char Adres)              */
/*Açıklama       : ADXL 345'in Yazmaçlarında (Register) bulunan veriler bu     */
/*                 fonksiyonla okunur.                                         */
/*                                                                             */
/*                                                                             */
/*Yazar          : Armağan YILMAZ                                              */
/*Tarih          : 26.11.2010                                                  */
/*Version        : 1.0                                                         */
/*                                                                             */
/*Giriş          : unsigned char Adres 		                                   */
/*               :                                                             */
/*Çıkış          : unsigned char Değer                                         */
/*                                                                             */
/*                                                                             */
/*Kullanılan Veri: 1 Byte                                                      */
/*******************************************************************************/
unsigned char ADXL345_OKU(unsigned char Adres)

	{	
		unsigned char Veri=0;
		int Sayac;
		
		ADXL_CLK = HIGH;    // ADXL345 CLOCK HATTI HIGH
		ADXL_CS = LOW;  	// ADXL345 CHIP SECIM HATTI LOW
	
		for(Sayac = 7; Sayac >= 0; Sayac-- )

			{
			
				ADXL_CLK = LOW;  // ADXL345 CLOCK HATTI LOW
				
				
				if( ( (Adres | 0x80 )>> Sayac ) & 0x01 )
					{
						ADXL_SDO = HIGH; // ADXL345 SDO HATTI HIGH
					}
				else 
					{
						ADXL_SDO = LOW; // ADXL345 SDO HATTI LOW
					}
				

				DelayUs(2);
				
				ADXL_CLK = HIGH;  // ADXL345 CLOCK HATTI HIGH
				DelayUs(2);

			}



		for(Sayac = 7; Sayac >=0; Sayac-- )
			
			{
				ADXL_CLK = LOW;  // ADXL345 CLOCK HATTI LOW
				DelayUs(2);
				ADXL_CLK = HIGH;  // ADXL345 CLOCK HATTI HIGH
				DelayUs(2);
				
				if (ADXL_SDI==HIGH)
					{
						Veri = Veri | (1 << Sayac );
					}
				else
					{
						Veri = Veri | (0 << Sayac );
					}

			}

			ADXL_CS = HIGH;	// ADXL345 CHIP SECIM HATTI HIGH

			return Veri;
	}


/*******************************************************************************/
/**********                   ADXL345'E VERİ YAZMA                   ***********/
/*******************************************************************************/
/*******************************************************************************/
/*Fonksiyon Adı  : void ADXL345_YAZ(unsigned char Adres,unsigned char Veri)    */
/*Açıklama       : ADXL 345'in Yazmaçlarına (Register) veriler bu fonksiyonla  */
/*                 yazılır.                                                    */
/*                                                                             */
/*                                                                             */
/*Yazar          : Armağan YILMAZ                                              */
/*Tarih          : 26.11.2010                                                  */
/*Version        : 1.0                                                         */
/*                                                                             */
/*Giriş          : unsigned char Adres 	unsigned char Veri                     */
/*               :                                                             */
/*Çıkış          : Yok                                                         */
/*                                                                             */
/*                                                                             */
/*Kullanılan Veri: 2 Byte                                                      */
/*******************************************************************************/
void ADXL345_YAZ(unsigned char Adres,unsigned char Veri)

	{
		int Sayac;	
		
		ADXL_CLK = HIGH;  	// ADXL345 CLOCK HATTI HIGH
		ADXL_CS = LOW;		// ADXL345 CHIP SECIM HATTI LOW
		
		for(Sayac = 7; Sayac >= 0; Sayac-- )

			{
			
				ADXL_CLK = LOW;  // ADXL345 CLOCK HATTI LOW
				
				if( ( Adres  >> Sayac ) & 0x01 )
					{
						ADXL_SDO = HIGH; // ADXL345 SDO HATTI LOW
					}
				else 
					{
						ADXL_SDO = LOW; // ADXL345 SDO HATTI HIGH
					}

				DelayUs(2);
				
				ADXL_CLK = HIGH;  // ADXL345 CLOCK HATTI HIGH
				DelayUs(2);

			}


		for(Sayac = 7; Sayac >= 0; Sayac-- )

			{
			
				ADXL_CLK = LOW;  // ADXL345 CLOCK HATTI LOW
				
				if( ( Veri  >> Sayac ) & 0x01 )
					{
						ADXL_SDO = HIGH; // ADXL345 SDO HATTI HIGH
					}
				else 
					{
						ADXL_SDO = LOW; // ADXL345 SDO HATTI LOW
					}
				

				DelayUs(2);
				
				ADXL_CLK = HIGH;  // ADXL345 CLOCK HATTI HIGH
				
				DelayUs(2);

			}

		ADXL_CS=HIGH; // ADXL345 CHIP SECIM HATTI HIGH

	}



ADXL345.h Dosyası

#ifndef   __ADXL345_H 
#define   __ADXL345_H 

#include <htc.h>


#define   ADXL_CS		RC1
#define	  ADXL_CLK		RC3
#define	  ADXL_SDI		RC4
#define	  ADXL_SDO		RC5
#define   ADXL_INT1		RB4
#define   ADXL_INT2		RB5


//ADXL Register Map
#define	DEVID			0x00	//Device ID Register
#define THRESH_TAP		0x1D	//Tap Threshold
#define	OFSX			0x1E	//X-axis offset
#define	OFSY			0x1F	//Y-axis offset
#define	OFSZ			0x20	//Z-axis offset
#define	DUR				0x21	//Tap Duration
#define	Latent			0x22	//Tap latency
#define	Window			0x23	//Tap window
#define	THRESH_ACT		0x24	//Activity Threshold
#define	THRESH_INACT	0x25	//Inactivity Threshold
#define	TIME_INACT		0x26	//Inactivity Time
#define	ACT_INACT_CTL	0x27	//Axis enable control for activity and inactivity detection
#define	THRESH_FF		0x28	//free-fall threshold
#define	TIME_FF			0x29	//Free-Fall Time
#define	TAP_AXES		0x2A	//Axis control for tap/double tap
#define ACT_TAP_STATUS	0x2B	//Source of tap/double tap
#define	BW_RATE			0x2C	//Data rate and power mode control
#define POWER_CTL		0x2D	//Power Control Register
#define	INT_ENABLE		0x2E	//Interrupt Enable Control
#define	INT_MAP			0x2F	//Interrupt Mapping Control
#define	INT_SOURCE		0x30	//Source of interrupts
#define	DATA_FORMAT		0x31	//Data format control
#define DATAX0			0x32	//X-Axis Data 0
#define DATAX1			0x33	//X-Axis Data 1
#define DATAY0			0x34	//Y-Axis Data 0
#define DATAY1			0x35	//Y-Axis Data 1
#define DATAZ0			0x36	//Z-Axis Data 0
#define DATAZ1			0x37	//Z-Axis Data 1
#define	FIFO_CTL		0x38	//FIFO control
#define	FIFO_STATUS		0x39	//FIFO status

#define	MEASURE		(1<<3)	//Measurement Mode

#define HIGH		1
#define LOW			0



//************** ADXL345 FONKSİYONLARI **************
void ADXL345_INIT();
unsigned char ADXL345_OKU(char Adres);
void ADXL345_YAZ(unsigned char Adres,unsigned char Veri);



#endif


ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

BenC

Main dosyası


void main(void)
	
	{
		unsigned char LByte=0;
		unsigned char HByte=0;
		int X=0, Y=0, Z=0;

		unsigned char DevID;


		BoardSetup();
		SerialPortHazirla();
			

		Sys_Led_Dir &= ~Sys_Led;
		
		ADXL345_INIT();

	
		
		Led_On();
		DelayMs(200);
		Led_Off();
		DelayMs(200);
		Led_On();
		DelayMs(200);
		Led_Off();
		DelayMs(200);

		printf("\r\nADXL345 Example\r\n");
	

		DevID=ADXL345_OKU(0x00);
		printf("\r\nDevice ID = %02x\r\n",DevID);
		DelayMs(200);

	
		while(1)


			{
					HByte = ADXL345_OKU(DATAX1);
					LByte = ADXL345_OKU(DATAX0);
					X = (HByte << 8) | LByte;
																
					HByte = ADXL345_OKU(DATAY1);
					LByte= ADXL345_OKU(DATAY0);
					Y = (HByte << 8) | LByte;
					

					HByte = ADXL345_OKU(DATAZ1);
					LByte = ADXL345_OKU(DATAZ0);
					Z = (HByte << 8) | LByte;
								
				
					printf("X:%04X\tY:%04X\tZ:%04X\r", X, Y, Z);
					
				
			}



	}
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

BenC

ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!