tengo variable ejex, ejey, ejez de un acelerómetro, al querer enviarlas al otro pic que las procese y las muestre por lcd salen las lecturas del acelerómetro a 0. El error está en la comunicación de pics todo lo demás funciona correctamente. Es decir, no se usar correctamente el rs232.
http://img811.imageshack.us/i/dibujorin.jpg/
Uploaded with ImageShack.us
Debo decir que al tener un emisor y un receptor (Es inalámbrico) sólo dispongo de TX en el pic1 y RX en el pic2, por tanto no puedo hacer una comunicación en la que se establece esta y se envían las cosas como se debería, tiene que ser enviar todo el rato y el otro que recoja todo el rato.
Muchas gracias. seguir así
Código:
//TRANSMISOR
#include <16f876A.h>
//Palabra de configuración
#fuses HS,NOPROTECT,NOCPD,NOLVP,NOWDT
#use standard_io (A)
#use standard_io (B)
#use standard_io (C)
#use delay(clock=16000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) //configuración puerto serie
//Registros acelerometro
#define DIR_MMA7660 0x98
#define RegX 0
#define RegY 1
#define RegZ 2
#define RegMode 7
#define RegSR 8
#define I2C_LEER 1
#define I2C_ESCRIBIR 0
//I2C
#define RTC_SDA PIN_C4 //configuración pines I2C
#define RTC_SCL PIN_C3
#use i2c(master, sda=RTC_SDA, scl=RTC_SCL, FAST) //configuración I2C
main()
{
int EjeX,EjeY,EjeZ;
disable_interrupts(global); // desactivando interrupciones globales
SETUP_ADC_PORTS(NO_ANALOGS); //Puerta A Digital
set_tris_a(0x00); //RA0-RA5 salidas
set_tris_b(0x00); //RB0-RB7 salidas
//set_tris_c(0x00); //RC0-RC7 "se autoconfigura"
//Inicializaciones
//inicializa acelerometro
i2c_start();
i2c_write(DIR_MMA7660|I2C_ESCRIBIR);
i2c_write(RegMode);
i2c_write(1); // Lo configuramos en modo Activo
i2c_stop();
i2c_start();
i2c_write(DIR_MMA7660|I2C_ESCRIBIR);
i2c_write(RegSR);
i2c_write(0b011);// Lo configuramos para 32 samples por segundo
i2c_stop();
//Captación de datos acelerómetro
while(1){
i2c_start();
i2c_write(DIR_MMA7660|I2C_ESCRIBIR);
i2c_write(RegX); // Señalamos el registro X como primero a leer
i2c_start();
i2c_write(DIR_MMA7660|I2C_LEER);
EjeX=i2c_read(1); // Leemos RegX
EjeY=i2c_read(1); // Leemos RegY
EjeZ=i2c_read(0); // Leemos RegZ
i2c_stop();
//envío de datos
putc('X'); //Le enviamos caracter diferenciador de que después le enviamos Eje X
putc(EjeX); //Le enviamos Eje X
putc('Y'); //Le enviamos caracter diferenciador de que después le enviamos Eje Y
putc(EjeY); //Le enviamos Eje Y
putc('Z'); //Le enviamos caracter diferenciador de que después le enviamos Eje Z
putc(EjeZ); //Le enviamos Eje Z
}
}
Código:
//RECEPTOR
#include <16f876A.h>
//Palabra de configuración
#fuses HS,NOPROTECT,NOCPD,NOLVP,NOWDT
#use standard_io (A)
#use standard_io (B)
#use standard_io (C)
#use delay(clock=16000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) //configuración puerto serie
#define use_portb_lcd TRUE //utiliza el port b para lcd
#include <flex_lcd.c> //libreria de lcd
//Variables globales que se utilizan en la interrupción y en el programa principal
int dato;
int EjeX=0,EjeY=0,EjeZ=0;
#int_rda //Vector interrupción puerto serie.
rda_isr() //Interrupción
{
dato=getc(); //Lee el dato recibido
if(dato=='X') EjeX=getc(); //Si el dato que se recibe es una X leemos lo siguiente que será el dato del Eje X
else if(dato=='Y') EjeY=getc(); //igual
else if(dato=='Z') EjeZ=getc(); //igual
}
main()
{
float xgs=0,ygs=0,zgs=0;
enable_interrupts(global); //Habilita interrupciones
enable_interrupts(INT_RDA); //Activa interrupción en la recepción
SETUP_ADC_PORTS(NO_ANALOGS); //Puerta A Digital
//set_tris_a(0x01); //RA0-RA5 se autoconfiguran
//set_tris_b(0x00); //RB0-RB7 salidas
set_tris_c(0x01); //RC0 como entrada-RC1-RC7 se autoconfiguran
//Inicializaciones
//inicializa lcd
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("Proyecto\nAcelerometro"); //presentacion...
delay_ms(1000);
while(1){
//Conversión a g's
if(EjeX<32){ //Para valores inferiores a 32 basta con aplicar
xgs=EjeX*0.046875; //el factor de conversión
}
else{ //Para los valores superiores a 32 hay que restarle 64
xgs=(EjeX-64)*0.046875; //para obtener el valor negativo real y multiplicar por
} //el factor de conversión. Así se obtiene el valor en gs
if(EjeY<32){
ygs=EjeY*0.046875;
}
else{
ygs=(EjeY-64)*0.046875;
}
if(EjeZ<32){
zgs=EjeZ*0.046875;
}
else{
zgs=(EjeZ-64)*0.046875;
}
//LCD
printf(lcd_putc,"\fX:%.2f Y:%.2f \n Z:%.2f",xgs,ygs,zgs); //mostramos la lectura en g's
delay_ms(200);
}
}
Uploaded with ImageShack.us
Debo decir que al tener un emisor y un receptor (Es inalámbrico) sólo dispongo de TX en el pic1 y RX en el pic2, por tanto no puedo hacer una comunicación en la que se establece esta y se envían las cosas como se debería, tiene que ser enviar todo el rato y el otro que recoja todo el rato.
Muchas gracias. seguir así