hola a todos
necesito realizar un sistema que mida los grados de inclinación en los tres ejes, para ello
adquirí un acelerómetro adxl345 que se configura por medio de i2c, como microcontorlador he usado un 16f877a para leer los datos y poder procesarlos, he logrado comunicarlo con el pic, sin embargo no me toma lecturas negativas, la concatenación la estoy realizando como dice en la pagina de fabricante, agradecería cualquier aporte
	
	
	
		
				
			necesito realizar un sistema que mida los grados de inclinación en los tres ejes, para ello
adquirí un acelerómetro adxl345 que se configura por medio de i2c, como microcontorlador he usado un 16f877a para leer los datos y poder procesarlos, he logrado comunicarlo con el pic, sin embargo no me toma lecturas negativas, la concatenación la estoy realizando como dice en la pagina de fabricante, agradecería cualquier aporte
		Código:
	
	#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4M)
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <lcd.c>
#use i2c(MASTER, SDA=PIN_c4, SCL=PIN_c3,FORCE_HW)
#define ACCEL_WRITE_ADDR  0XA6//0xA6 //0x53//0x3a
#define ACCEL_READ_ADDR  0XA7//0xA7  //0x53//0x3b
#define ACCEL_DATA_ADDR 0x32
#define ACCEL_PWRCTRL_ADDR 0x2d
#define ACCEL_MEASURE_MODE 0x08
   unsigned int accel_data[6];
   unsigned int16 x,y,z;
   float x1,y1,z1,R;
  float teta=0, gama=0,fi=0;
void main ()
{
  enable_interrupts(int_rda);
  enable_interrupts(GLOBAL);
   // initialize
   while(true) {
     lcd_init();
      // Tell the accelerometer to wake up
      i2c_start();
      i2c_write(ACCEL_WRITE_ADDR);
      i2c_write(0X31);
      i2c_write(0X01);
      i2c_stop();
     I2C_start();
     i2c_write(ACCEL_WRITE_ADDR);
     i2c_write(ACCEL_PWRCTRL_ADDR);
     i2c_write(ACCEL_MEASURE_MODE);
     I2C_stop();
      // Read data from the accel
      i2c_start();
      i2c_write(ACCEL_WRITE_ADDR);
      i2c_write(ACCEL_DATA_ADDR);
      i2c_start();
      i2c_write(ACCEL_READ_ADDR);
      accel_data[0] = i2c_read(); //x0
      accel_data[1] = i2c_read(); //x1
      accel_data[2] = i2c_read(); //y0
      accel_data[3] = i2c_read(); //y1
      accel_data[4] = i2c_read(); //z0
      accel_data[5] = i2c_read(0); // z1, NACK on last read
      i2c_stop();
      //////////concatenar datos adxl345/////////////
      x=((accel_data[1])<<8)|accel_data[0] ;
      y=((accel_data[3])<<8)|accel_data[2];
      z=((accel_data[5])<<8)|accel_data[4];
      x1=(float)x/256;
      y1=(float)y/256;
      z1=(float)z/256;
      ////////////////////////////////////////////////
      R=sqrt((x1*x1)+(y1*y1)+(z1*z1));
      teta=acos(x1/R);
      teta=teta * 57,296;
      gama=acos(y1/R);
      gama=gama*57,296;
      fi=acos(z1/R);
      fi=fi*57,296;
     printf(lcd_putc,"\f %.2f %.2f %.2f ",x1,y1,z1);
     printf(lcd_putc,"\n %f %f %f ",teta,gama,fi);
   }
}
			
				Última edición por un moderador: 
			
		
	
								
								
									
	
								
							
							 
   
				 
						 
			 
			 
			 
			 
			 
 
		 
 
		 
 
		