Banner publicitario de PCBWay

Envío trama de 3 variables de un pic a otro por rs232 ccs

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.

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);
   }
}
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í
 
eit Ke tal, un poco tarde, para comentar, pero se que a alguien mas le puede servir, en el codigo del receptor se tiene qe cambiar el tipo de variable dato por la de caracter char dato

Saludos
 
Atrás
Arriba