Autor Tema: Cómo enviar una trama de 3 variables de un pic a otro por rs232 ccs  (Leído 3828 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado venerable13

  • PIC10
  • *
  • Mensajes: 45
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: [Seleccionar]
//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: [Seleccionar]
//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. sigan así ya que muchas veces si no llega a ser por ustedes...
« Última modificación: 22 de Marzo de 2011, 14:56:25 por venerable13 »

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Cómo enviar una trama de 3 variables de un pic a otro por rs232 ccs
« Respuesta #1 en: 23 de Marzo de 2011, 16:00:28 »
Tienes conectadas las resistencias de pullup para el i2c?

Desconectado venerable13

  • PIC10
  • *
  • Mensajes: 45
Re: Cómo enviar una trama de 3 variables de un pic a otro por rs232 ccs
« Respuesta #2 en: 23 de Marzo de 2011, 17:44:45 »
Si pocher, si alguien requiere del código solucionado que lo pida, funciona bastante bien

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Cómo enviar una trama de 3 variables de un pic a otro por rs232 ccs
« Respuesta #3 en: 24 de Marzo de 2011, 02:33:40 »
... y cual era el problema?

Desconectado venerable13

  • PIC10
  • *
  • Mensajes: 45
Re: Cómo enviar una trama de 3 variables de un pic a otro por rs232 ccs
« Respuesta #4 en: 25 de Marzo de 2011, 21:37:46 »
pues exactamente no lo se, pero lo hicimos de otra forma y sí funciona, alámbricamente, pero no inalámbricamente, si te animas de ayudarme me lo dices.


 

anything