buenas, yo ando con un adxl202 que me trajeron como salmple desde analog, luego de una ardua lucha con un 16f877a logre hacerlo funcionar, tengo un pequeño programita en C con alguna pedacito en ASM para la toma de datos, lo que simplemente hace es la recoleccion del dutty cycle desde el acelerometro y me da la inclinacion (ademas optimice un poco las funciones) les mando el codigo, haber si a alguien le sirve, cualquier consulta me dicen, espero poder ayudarlos en algo..
#include <16F877a.h>
#include <math.h>
#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define XOUT 5
#define YOUT 4
#byte PORTB = 6
void start_timer(void);
float get_acel (int16 , float );
void edge1 (void);
void edge2 (void);
void edge3 (void);
void edge4 (void);
main () {
float T2,Acx,Acy;
int16 Tb,Tc,T1x,T1y,Td;
int indice;
set_tris_a (0b00000);
set_tris_b (0b00110000);
set_tris_c (0b10000000);
set_tris_d (0b00000000);
set_tris_e (0b000);
while (!kbhit()) {
edge1 (); //espero que este bajo XOUT
edge2 (); //espero el flanco de subida de XOUT
start_timer(); //pongo a contar
edge1 (); //espero el flanco de bajada de XOUT
Tb=get_timer1(); //tomo el tiempo Tb
edge3 (); //espero que baje YOUT
edge4 (); //espero el flanco de subida de YOUT
Tc=get_timer1(); //tomo el tiempo Tc
edge3 (); //espero el flanco de bajda de YOUT
Td=get_timer1(); //tomo el tiempo Td
T1x=Tb;
T1y= Td-Tc;
T2= (Td-((Td-Tc)/2))-(Tb/2);
Acx=get_acel (T1x,T2);
Acy=get_acel (T1y,T2);
if ( (Acx >= -1) && (Acx <= 1)) {
printf ("Inclinación en X : %2.2f",asin (AcX)); }
else
Printf ("argumento de arcoseno en ACX invalido"
;
if ( (Acy >= -1) && (Acy <= 1)) {
printf ("Inclinación en Y : %2.2f",asin (Acy));
}
else
Printf ("argumento de arcoseno en ACY invalido"
;
delay_ms(40);
} //while
} //main
float get_acel (int16 T1, float T2) {
return ((T1/T2)-0.5)/0.125;
}
void start_timer(void) {
set_timer1 (0);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
}
void edge1 (void) {
#asm
EDGE1:
btfsc PORTB,XOUT //Wait for low on XOUT
goto EDGE1
#endasm
}
void edge2 (void) {
#asm
EDGE2:
btfss PORTB,XOUT //Wait for high on XOUT
goto EDGE2
#endasm
}
void edge3 (void) {
#asm
EDGE3:
btfsc PORTB,YOUT //Look a low level on YOUT
goto EDGE3
#endasm
}
void edge4 (void) {
#asm
EDGE4:
btfss PORTB,YOUT //Look for rising edge on YOUT
goto EDGE4
#endasm
}