Hola, estoy haciendo una comunicación con el acelerómetro de freescale MMA7660 y el PIC16F88, uso el compilador CCS pero al parecer el acelerómetro no responde o no lo estoy configurando bien, el PIC y el acelerómetro ambos son alimentados a 3V, el PIC trabaja a 4MHz. Podrían darme una ayudita? Es algo urgente y no logro hacer que funcione, ya lei las notas de aplicacion y use dos configuraciones diferentes pero ninguna con resultados satisfactorios. La idea es configurarlo para que provoque la interrupción por un movimiento de cualquiera de sus ejes. Les dejo los codigos que use para la comunicacion:
El otro codigo:
Saludos y espero puedan ayudarme!
Código:
#use delay(clock=4M, restart_wdt)
#fuses XT , WDT, NOPROTECT, NOMCLR, NOBROWNOUT, NOFCMEN
#use I2C (MASTER, SLOW, SCL=PIN_B7, SDA=PIN_B6, FORCE_SW, NOFLOAT_HIGH, RESTART_WDT)
#use fast_io(B)
#define DIR_MMA7660 0x4C //direccion I2C del acelerometro
#define I2C_ESCRIBIR 0 //modo escritura i2C
..............................
set_tris_b(0b00000111);
..............................
i2c_start();
I2C = i2c_write(DIR_MMA7660|I2C_ESCRIBIR);
I2C = i2c_write(0x07);
I2C = i2c_write(1);
i2c_stop();
i2c_start();
I2C = i2c_write(DIR_MMA7660|I2C_ESCRIBIR);
I2C = i2c_write(0x08);
I2C = i2c_write(0b011);
i2c_stop();
El otro codigo:
Código:
#use delay(clock=4M, restart_wdt)
#fuses XT , WDT, NOPROTECT, NOMCLR, NOBROWNOUT, NOFCMEN
#use I2C (MASTER, SLOW, SCL=PIN_B7, SDA=PIN_B6, FORCE_SW, RESTART_WDT)
#use fast_io(B)
#define DIR_MMA7660 0x4C //direccion I2C del acelerometro
#define I2C_ESCRIBIR 1 //modo escritura i2C
...............................
set_tris_b(0b00000111);
..............................
RESTART_WDT();
i2c_start(); //configuracion de los registros
i2c_write(DIR_MMA7660 | I2C_ESCRIBIR); //direccion del acelerometro y modo escritura
i2c_write(0x07); //registro MODE
i2c_write(0x00); //acelerometro en stand-by
i2c_stop();
i2c_start();
i2c_write(DIR_MMA7660 | I2C_ESCRIBIR); //direccion del acelerometro y modo escritura
i2c_write(0x05); //registro SPCNT
i2c_write(0x00); //sin sleep-count
i2c_stop();
RESTART_WDT();
i2c_start();
i2c_write(DIR_MMA7660 | I2C_ESCRIBIR); //direccion del acelerometro y modo escritura
i2c_write(0x06); //registro INTSU
i2c_write(0x03); //interrupcion solo por movimientos sobre X,Y,Z
i2c_stop();
i2c_start();
i2c_write(DIR_MMA7660 | I2C_ESCRIBIR); //direccion del acelerometro y modo escritura
i2c_write(0x09); //registro PDET
i2c_write(0xE0); //sin tap-detection
i2c_stop();
RESTART_WDT();
i2c_start();
i2c_write(DIR_MMA7660 | I2C_ESCRIBIR); //direccion del acelerometro y modo escritura
i2c_write(0x08); //registro SR
i2c_write(0x34); //8 muestras por segundo, TILT debounce filter = 2
i2c_stop();
i2c_start();
i2c_write(DIR_MMA7660 | I2C_ESCRIBIR); //direccion del acelerometro y modo escritura
i2c_write(0x0A); //registro PD
i2c_write(0x00); //No tap detection debounce count enabled
i2c_stop();
RESTART_WDT();
i2c_start(); //configuracion de los registros
i2c_write(DIR_MMA7660 | I2C_ESCRIBIR); //direccion del acelerometro y modo escritura
i2c_write(0x07); //registro MODE
i2c_write(0xC1); //interrupcion por flanco de bajada, pin INT es push-pull
//no auto-sleep, no auto-wake, modo activo
i2c_stop();
Saludos y espero puedan ayudarme!