Soy nuevo en la codificación de imágenes. Estoy tratando de girar el motor de acuerdo con el cambio del acelerómetro en la dirección x. Estoy usando Pic18f452 y adxl345. Pero no pude averiguar cómo comunicarme con adxl345 usando i2c.
Aquí está mi código de foto:
int outputs[6];
int x,y,zz;
int px,py,pzz;
int diffx,diffy,diffz;
void motor(int v) {
PWM1_INIT(2000);
PWM1_Start();
if(v>0){
PORTC.F0=1; //c0 and c1 is for rotation direction
PORTC.F1=0;
}else{
PORTC.F0=0;
PORTC.F1=1;
}
PWM1_Set_Duty(120);
}
void stopmotor(){
PWM1_Stop();
}
int i;
void Read_Data() {
I2C1_Start(); // issue I2C start signal
for (i=0;i<6;i++){
I2C1_Wr(0x32+i); //read 0x32 to 0x37
outputs[i] = I2C1_Rd(0);
I2C1_Stop();
}
}
getDegrees(){
x=(signed) outputs[1]<<8|outputs[0];
y=(signed) outputs[3]<<8|outputs[2];
zz=(signed) outputs[5]<<8|outputs[4];
}
void main() {
// PORTC.F6 = 0;
// TRISC.F6 = 0; // Configure PORTB as output
PORTB.F0=0;
TRISB.F0=0;
TRISC.F0=0;
TRISC.F1=0;
TRISC.F2=0;
I2C1_Init(100000); // initialize I2C communication
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xD2); // send byte via I2C (device address + W)
I2C1_Wr(8); // for initializing acceloremeter
I2C1_Stop(); // issue I2C stop signal
while(1){
if(x!=0|y!=0|zz!=0){
px=x;
py=y;
pzz=zz;
}
Read_Data();
getDegrees();
if(px!=0|py!=0|pzz!=0){
diffx=x-px;
diffy=y-py;
diffz=zz-pzz;
}
if(diffx>0){
motor(x);
} else{
stopmotor();
}
delay_ms(500);
}
}
Sé que no es un código perfecto, pero solo quiero saber si me estoy comunicando con el acelerómetro de forma real o no. Si bien no tengo pantalla led, no puedo ver la salida de datos. Así que no tengo opciones de depuración paso a paso.
¿Cómo debo modificar el código para obtener una salida de 0x32-0x37 bits de acelerómetro usando i2c?