Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

22/03/2011 #1

Avatar de venerable13

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);
   }
}


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í
23/03/2011 #2


Hola, has probado de conectarlo directamente (sin los inalambricos), que inalambricos estas usando?
31/12/2012 #3


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
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.