Problema comunicación pic y pc vía serial

Estoy tratando de comunicar el pic16f877a con la pc, ya tengo el programa hecho en ccs y simplemente mando un mensaje de "hola mundo", el circuito ya lo tengo hecho y utilizo un max232, el max232 lo conecte de acuerdo a muchos diagramas que vi en internet y aseguran que es correcto.

Mi problema es que si manda los datos pero los manda invertidos, en la simulacion que ize en proteus simplemente en el virtual terminal le puse invertir y listo me los mostro pero fisicamente no puedo hacer eso de invertir, ya que voy a recoger los datos con un visual basic 6, e ize la prueba con el putty para recoger los datos y me da caracteres extraños. No se si en visual basic pueda "invertir los datos" o a lo mejor halla algo mal en mi circuito, probe con ponerle el valor "INVERT" en la configuracion de rs232 en ccs pero no me marcaba error.

Aqui les dejo el codigo que utilizo en ccs y les adjunto una imagen de mi simulacion en proteus ademas del archivo .dsn en .rar

Si alguien me pudiera ayudar le estare muy agradecido en serio¡¡¡¡




#include <16f877a.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT
#USE DELAY (CLOCK = 4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8, PARITY = N, stream = COM3)





void main(){

do
{
/* Mientras habilitar sea verdadero */
while(1)
{
output_high(pin_B0);
output_high(pin_B1);
output_high(pin_B2);

fprintf(COM3,"hola mundo");
delay_ms(500);
}


}
while(true); /* Todo de nuevo */
}
 

Adjuntos

  • pic+max232.jpg
    pic+max232.jpg
    326.8 KB · Visitas: 50
  • simulacion en proteus.rar
    18.1 KB · Visitas: 44
Estoy tratando de comunicar el pic16f877a con la pc, ya tengo el programa hecho en ccs y simplemente mando un mensaje de "hola mundo", el circuito ya lo tengo hecho y utilizo un max232, el max232 lo conecte de acuerdo a muchos diagramas que vi en internet y aseguran que es correcto.

Mi problema es que si manda los datos pero los manda invertidos, en la simulacion que ize en proteus simplemente en el virtual terminal le puse invertir y listo me los mostro pero fisicamente no puedo hacer eso de invertir, ya que voy a recoger los datos con un visual basic 6, e ize la prueba con el putty para recoger los datos y me da caracteres extraños. No se si en visual basic pueda "invertir los datos" o a lo mejor halla algo mal en mi circuito, probe con ponerle el valor "INVERT" en la configuracion de rs232 en ccs pero no me marcaba error.

Aqui les dejo el codigo que utilizo en ccs y les adjunto una imagen de mi simulacion en proteus ademas del archivo .dsn en .rar

Si alguien me pudiera ayudar le estare muy agradecido en serio¡¡¡¡




#include <16f877a.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT
#USE DELAY (CLOCK = 4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8, PARITY = N, stream = COM3)





void main(){

do
{
/* Mientras habilitar sea verdadero */
while(1)
{
output_high(pin_B0);
output_high(pin_B1);
output_high(pin_B2);

fprintf(COM3,"hola mundo");
delay_ms(500);
}


}
while(true); /* Todo de nuevo */
}

Buenas noches.
Lo primero que tienes que hacer es asegurarte de que estás enviando los datos correctamente.
En el PC abre el "Hiperterminal" y podrás monitorizar lo que envias por el RS232.
Tendrás que configurarl los parámetros... Velocidad, Paridad, Nº de bits, Protocolo, etc.
Cuando recibas los datos correctamente podrás seguir con tu proyecto.

Saludos.
 
EB4GBF todo eso lo tengo bien configurado en ambos lados tanto en el programa del pic como en el hyperterminal pero como te digo me salen "simbolos", en la simulacion al ponerle "invertir" al virtual terminal se arregla el problema a lo que yo entiendo esque envia los datos invertidos, pero no se como resolver fisicamente eso ya que el hyperterminal no tiene esa opcion y mas bien quiero procesar los datos con visual basic 6
 
Estoy tratando de comunicar el pic16f877a con la pc, ya tengo el programa hecho en ccs y simplemente mando un mensaje de "hola mundo", el circuito ya lo tengo hecho y utilizo un max232, el max232 lo conecte de acuerdo a muchos diagramas que vi en internet y aseguran que es correcto.

Mi problema es que si manda los datos pero los manda invertidos, en la simulacion que ize en proteus simplemente en el virtual terminal le puse invertir y listo me los mostro pero fisicamente no puedo hacer eso de invertir, ya que voy a recoger los datos con un visual basic 6, e ize la prueba con el putty para recoger los datos y me da caracteres extraños. No se si en visual basic pueda "invertir los datos" o a lo mejor halla algo mal en mi circuito, probe con ponerle el valor "INVERT" en la configuracion de rs232 en ccs pero no me marcaba error.

Aqui les dejo el codigo que utilizo en ccs y les adjunto una imagen de mi simulacion en proteus ademas del archivo .dsn en .rar

Si alguien me pudiera ayudar le estare muy agradecido en serio¡¡¡¡




#include <16f877a.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT
#USE DELAY (CLOCK = 4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BITS=8, PARITY = N, stream = COM3)





void main(){

do
{
/* Mientras habilitar sea verdadero */
while(1)
{
output_high(pin_B0);
output_high(pin_B1);
output_high(pin_B2);

fprintf(COM3,"hola mundo");
delay_ms(500);
}


}
while(true); /* Todo de nuevo */
}



No conozco el C y si permite invertir pero el MAX232 te esta invirtiendo la señal seguro así que prueba con esto que te adjunto en la imagen que funciona con cualquier transistor tipo BC548/BC558.
Saludos.

Ric.
 

Adjuntos

  • RS232sinMAX.jpg
    RS232sinMAX.jpg
    16.9 KB · Visitas: 78
ricbevi gracias por el diagrama, ya lo probé pero me sigue haciendo lo mismo, me lo sigue invirtiendo

Gracias a los dos que respondieron, en la simulación no se que haya pasado y no lo pude resolver, pero físicamente que es lo que me interesaba si, lo que pasó fue que un cable no estaba bien conectado en el proto, era el que daba la salida del max232 al conector db9 pero ya lo puse bien y problema resuelto.
 
Última edición por un moderador:
hola que tal ,yo estuve peleandome bastante tiempo con el visual basic porque me recibia caracteres estraños ,te comento porque no se como lo haces ,pero por la red hay funciones para el visual basic que convierten el codigo que se recibe por el puerto ,tal vez el pic mande los datos bien ,pero el visual te los muestre como ascii y debes poner una funcion para convertirlos a char,decimal o binarios
http://www.i-micro.com/pdf/articulos/rs-232.pdf
http://www.electronicaestudio.com/docs/disp2_4.pdf
http://www.todoexpertos.com/categor...c/respuestas/861997/leer-de-buffer-con-mscomm
http://www.forosdelweb.com/f69/mscomm-input-291798/
espero te sirva algo de estas webs
un saludo
 
Antes que nada, un saludo. Bueno, mi problema es el siguiente.
Me encuentro trabajando con el PIC16F628A, el cual deseo comunicarlo al puerto RS-232 mediante el MAX232.
He construido el circuito del MAX232 y he comprobado si se realiza la comunicación con el puerto COM.
Sin embargo, deseo mandar texto a un monitor serial, y es ahí donde el PIC hace su trabajo, o al menos debería hacerlo.
Pues no me manda el PIC el texto que deseo mostrar en pantalla.
Checo con el osciloscopio la terminal del PIC encargada de mandar los pulsos al MAX232 y ésta sólo se queda en estado alto, en otras palabras, no manda pulsos de 0 y 1
¿Cómo se supone debería hacer para que estos pulsos sean interpretados en caracteres ANSI por la PC?

El código que creé fue este:
Código:
#include <16F628A.h>
#include <stdio.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=4000000)
#use RS232(uart1,BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B2,RCV=PIN_B1)


#byte porta = 0x05        // Asignamos PortA.
#byte portb = 0x06        // Asignamos PortB.

// ---------- Programa Principial ----------

void main()
{
   int8   x;    // Declaramos el valor de X como byte, se corresponderá con los 8 LEDs de salida.
   int8   enc;  // Se almacenará el valor actual de RA0 y RA1, hasta la siguiente comparación.
   int8   aux;  // Se almacenará el valor anterior de RA0 y RA1, hasta la siguiente comparación.

   set_tris_a(0b11111111);     // Puerto A como entradas. Sólo usamos RA0 y RA1.
   set_tris_b(0b00000000);  // Puerto B como salidas, para los 8 LEDs.
   
   portb=0;   // Inicialmente ponemos a cero el puerto B.
   x=0;       // Inicialmente ponemos a cero la variable que se usa para contar.
   enc=0;     // Inicialmente ponemos a cero la variable que tomará los valores de RA0 y RA1.
   
   While (true)
   {
          aux=enc;               // Igualamos 'AUX' y 'ENC' para luego comparar cuando cambie 'ENC'.
          enc=porta &3;         // Aislamos RA0 y RA1 como un número de 2 bits y se carga en la variable 'ENC'.
          
          If ((aux==2)&&(enc==3))// Si en la comparación hay flanco de subida,
          {  
              x++;               // entonces incrementar una unidad el valor de X.
          }
          
          If ((aux==3)&&(enc==2))// Si en la comparación hay flanco de bajada,
          {  
              x--;               // entonces decrementar una unidad el valor de X.
          }
          
         printf("la posicion es:%d",x);           // El valor de salida de X.
   }
              
}
PD: En proteus me funciona muy bien.
Uso un oscilador de 4MHz, tengo activada mi entrada MCLR, y ocupo el pin 8(tx) para enviar los pulsos al MAX232, sólo ocupo transmitir, no ocupo recibir.
Si me pudieran decir por qué no funciona en el protoboard, lo agradecería mucho.
 
En proteus me funciona muy bien.
Uso un oscilador de 4MHz, tengo activada mi entrada MCLR, y ocupo el pin 8(tx) para enviar los pulsos al MAX232, sólo ocupo transmitir, no ocupo recibir.
Si me pudieran decir por qué no funciona en el protoboard, lo agradecería mucho.
Físicamente también funciona.

Esto es lo que está enviando el PIC por el puerto serial COM1: Recepción RS-232 - 16F628A.jpg

Esta prueba fue realizada en protoboard, así que revisa bien tus conexiones.
 
Buenas,

llevo ya un buen tiempo programando y en estos momentos intento hacer una comunicación alambrada y otra inalambrica en este esquema en picc

PC <-> PIC18f4550 esta se hace por puerto serial sin problemas

PIC18F4550 <-> PIC16f877 se realiza por medios inalambricos

como ven el PIC18F4550 es el centro de la comunicacion

buscando y buscando encontre que se pueden utilizar varios puertos RS232 utilizando el parametro STREAM dentro de

#use RS232(baud=9600, xmit=RS_TX, rcv=RS_RX,bits=8,parity=N,STREAM=SENSOR)

cuando utilizo esto en la simulacion de proteus todo funciona correctamente, pero cuando voy al hardware fisico, el comunicación PIC<->PC no funciona....

Voy a anexar el codigo que tengo funcionando en simulacion a ver si alguien me puede ayudar, muchas gracias de antemano

Código:
//Interfaz PC Sensor PC<->PIC18F4550

#include <18F4550.h>
//#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
#fuses XT, NOWDT,NOPUT,PLL1,CPUDIV1,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD
#use delay (clock=4000000)

//#define TXPIN         // ->
//#define RXPIN    PIN_B0     // <-
#define ON_TX    PIN_D3     // ->
#define ON_RX    PIN_D2    // ->
#USE RS232(BAUD = 3600, XMIT = PIN_D0, RCV = PIN_B0, bits=8, parity=N, STREAM = RBase)
#USE RS232(BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7, bits=8, parity=N, STREAM = PC)


#define SENSE        PIN_D4      //<-
#define LED_SENSE    PIN_D5      //<-
#define ROB1         PIN_C0      //->
#define ROB2         PIN_C1      //->

#DEFINE Disp_ID   0x04

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

int8 ptr_prog=0;           // puntero del programa, indica al firmware que secion de programa ejecutar
int8 valor=0;              // variable para capturar la seleccion del usuario
//int8 valor_RBase=0;
int8 cable=0;              // indicador de cable de conexion RS232 (1) cable conectado (2) cable desconectado


int8 recep=0;
int8 esp_recep=0;
int8 cont_recep=150;
int8 kbh=0;


#int_RDA
void recibe(void)
{
   valor = fgetc(PC);
   kbh=1;
}

/*#int_EXT
void respuesta()
{
   valor_RBase=fgetc(RBase);
   if(valor_RBase==0xFF)
      recep=1;
   else
      recep=0;
}
*/

void Transmite(int8 REC, int16 info)
{

   int8 dat1=0x00,dat2=0x00;
   int8 usu=0x00;
   
   output_high(ON_TX);
   output_low(ON_RX);
   delay_ms(3);
   
   dat1=(info&0x00FF);
   dat2=(info>>8)&0x00FF;
   usu=(Disp_ID&0x0f)<<4;
   usu=usu|(REC&0x0f);
   
   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);
   
   output_high(ON_RX);
   output_low(ON_TX);
   
}


void main( void ) // Funcion principal
{
   set_tris_b(0xFF); // Se configuran los pines de los leds como salidas
   set_tris_c(0x80);
   set_tris_d(0xf0);
   set_tris_e(0x00);
   port_b_pullups(TRUE);
   output_c(0x00);
   output_d(0x00);
   
   // se habilitan las interrupciones
   enable_interrupts(INT_ext);
   enable_interrupts(INT_RDA);
   enable_interrupts(global);
   
   output_high(ON_RX);
   output_low(ON_TX);
   delay_ms(3);
   delay_ms(300);
   
   for(;;)
   {      
      if(input_state(SENSE)==0)
      {
         output_high(LED_SENSE);
         cable=1;
         
         switch(ptr_prog)
         {
            case 0:     //  Inicio del programa de la radio base
            {
               // se muestra el menu de opciones para configuracion verificacion
               // y control del sistema
               fprintf(PC,"\f\n ");
               fprintf(PC,"\n\r  Programa de control de radio base para robots");
               fprintf(PC,"\n\r PRUEBA DE COMUNICACION Y CONTROL DE RECEPCION");
               fprintf(PC,"\n\r --------------------------------------------------");
               fprintf(PC,"\n\r ");
               fprintf(PC,"\n\r    seleccione el led 1 2 o 3");
               fprintf(PC,"\n\r ");
               fprintf(PC,"\n\r Seleccione una opcion: ");
               
               ptr_prog=1;
               break;
            }
            case 1:     //  Espera seleccion
            {
               //  Se espera a que se seleccione una opcion y se dirige el 
               // puntero a la opcion respectiva
               
               if(kbh!=0)
               {
                  kbh=0;
                  fprintf(PC,"\f");
                  if(valor == '1' && esp_recep == 0)
                  {
                     Transmite(0x06,0x0A01);
                     output_high(ROB1);
                     output_low(ROB2);
                     esp_recep=1;
                     kbh=0;
                  }
                  else
                  {
                     if(valor == '2')
                     {
                        Transmite(0x06,0x0B02);
                        output_low(ROB1);
                        output_high(ROB2);
                        esp_recep=1;
                        kbh=0;
                     }
                     else
                     {
                        if(valor == '3')
                        {
                           Transmite(0x06,0x0C03);
                           output_high(ROB1);
                           output_high(ROB2);
                           esp_recep=1;
                           kbh=0;
                        }
                     }
                  }
               }
               if(esp_recep == 1)
               {
                  
                  if(recep == 1)
                  {
                     fprintf(PC,"\n\t\t RECIBIDO");
                     cont_recep=250;
                     esp_recep=0;
                     recep=0;
                     ptr_prog=0;
                     delay_ms(1000);
                     break;
                  }
                  if(cont_recep == 0)
                  {
                     fprintf(PC,"\n\t\t ** NO RECIBIDO **");
                     cont_recep=250;
                     esp_recep=0;
                     recep=0;
                     ptr_prog=0;
                     delay_ms(1000);
                     break;
                  }
                  cont_recep -= 1;
                  delay_us(368);
               }
               break;
            }
         }
      }
      else
      {
         output_low(LED_SENSE);
         if(cable==1)
         {
            cable=2;
            ptr_prog=0;
            fprintf(PC,"\f\n\n\n\n ");
            fprintf(PC,"\n\r --------------------------------------------------");
            fprintf(PC,"\n\r         CONEXION CON RADIO BASE PERDIDA...");
            fprintf(PC,"\n\r --------------------------------------------------"); 
         }
      }  
   }
}


Código:
//SENSOr

#include <16f877a.h>
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
#fuses XT, NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD
#use delay (clock=4000000)
//#define TXPIN    PIN_C6     // ->
//#define RXPIN    PIN_B0     // <-
#define ON_TX    PIN_D1     // ->
#define ON_RX    PIN_D0    // ->
#USE RS232(BAUD = 3600, XMIT = PIN_C6, RCV = PIN_C7, bits=8, parity=N)
//#USE RS232 (BAUD = 2400, XMIT = PIN_B2, RCV = PIN_B3, STREAM = Telnet)
//#include <Comunicacion_BETA.c>

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)

#DEFINE Disp_ID   0x06

char nD=0;


// Declaración de variables de trabajo
char Trama[10]={0,1,2,3,4,5,6,7,8,9};
char n=0;
int16 DATA;
int8 REC;
int8 REM;
int8 kbh=0;


/*#INT_EXT
void interrupt_ext( void ) // Vector de interrupciones. 
{
     
}*/

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#int_RDA
void Recibe(void)
{
   int8 cant=0, I,J;
   // Se guardan los datos de entrada en el búfer de la trama.
   Trama[n]=fgetc();
   n=n+1;
   if(n>5)
   {
      for(I=0;(I<n&&cant<4);I++)
      {
         cant=1;
         for(J=(I+1);J<n;J++)
         {
            if(Trama[I]==Trama[J])
            {
               cant=cant+1;
               if(cant>3)
                  break;
            }
         }
         
      }
      if(cant>3)
      {
         switch (nD)
         {
            case 0:
            {
               REC=(Trama[I]&0x0F);
               REM=(Trama[I]>>4)&0x0F;
               DATA=0x0000;
               cant=1;
               nD=1;
               break;
            }
            case 1:
            {
               DATA=(DATA|Trama[I])<<8;
               cant=1;
               nD=2;
               break;
            }
            case 2:
            {
               DATA=DATA|(Trama[I]);
               nD=0;
               cant=1;
               kbh=1;
               break;
            }
         }
         for( n=0; n<8; n++ )
            Trama[n]=n;
         n=0;
      }
   }
   else
   {
      if(n==8)
      {
         n=0;
         for( n=0; n<8; n++ )
            Trama[n]=n;
         kbh=0;
      }
   }
}

void main( void ) // Funcion principal.
{
   set_tris_b(0x01);// Se configuran los pines b como entrada y salida.
   port_b_pullups(TRUE);
   set_tris_c(0x80);
   set_tris_d(0x00);
   
   enable_interrupts(INT_RDA);
   enable_interrupts(global);       
   
   output_b(0x00); // Se apagan los pines del puerto b
   
   output_high(ON_RX);
   
   for( n=0; n<4; n++ )
      Trama[n]=n; 
   n=0;
         
   for(;;)
   {
      if(kbh==1)
      {
         if(REC==disp_ID)
         {
            if(DATA==0x0A01)
            {
               output_high(PIN_B1);
               output_low(PIN_B2);
               output_low(PIN_B3);
            }
            if(DATA==0x0B02)
            {
               output_low(PIN_B1);
               output_high(PIN_B2);
               output_low(PIN_B3);
            }
            if(DATA==0x0C03)
            {
               output_low(PIN_B1);
               output_low(PIN_B2);
               output_high(PIN_B3);
            }
         }
      }
   } // bucle infinito para la espera de interrupciones.
}
 
En el programa del PIC18F4550 sucede algo extraño.
Cuando el puerto B se encuentra en 0 es cuando funciona, pero si éste tiene otro valor <> 0, deja de funcionar. :unsure:

No sé cual sea el motivo porque no analicé a profundidad el código ni la causa.

Modifiqué algunas partes para poder enlazar comunicación con la PC y obtener mejores lecturas.
PHP:
//Interfaz PC Sensor PC<->PIC18F4550

#include <18F4550.h>
//#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
// Editado.
#fuses   NOFCMEN, NOVREGEN
#use     delay (crystal = 4MHz)

//#define TXPIN         // ->
//#define RXPIN    PIN_B0     // <-
#define ON_TX    PIN_D3     // ->
#define ON_RX    PIN_D2    // ->
#USE RS232(BAUD = 3600, XMIT = PIN_D0, RCV = PIN_D1, bits=8, parity=N, STREAM = RBase)
// Editado.
#USE RS232(UART1, STREAM = PC)   // 9600,N,8,1 (Módulo EUSART)


#define SENSE        PIN_D4      //<-
#define LED_SENSE    PIN_D5      //<-
#define ROB1         PIN_C0      //->
#define ROB2         PIN_C1      //->

#DEFINE Disp_ID   0x04

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

int8 ptr_prog=0;           // puntero del programa, indica al firmware que sesión de programa ejecutar
int8 valor=0;              // variable para capturar la seleccion del usuario
//int8 valor_RBase=0;
int8 cable=0;              // indicador de cable de conexión RS232 (1) cable conectado (2) cable desconectado


int8 recep=0;
int8 esp_recep=0;
int8 cont_recep=150;
int8 kbh=0;


#int_RDA
void recibe(void)
{
   valor = fgetc(PC);
   kbh=1;
}

/*#int_EXT
void respuesta()
{
   valor_RBase=fgetc(RBase);
   if(valor_RBase==0xFF)
      recep=1;
   else
      recep=0;
}
*/

void Transmite(int8 REC, int16 info)
{

   int8 dat1=0x00,dat2=0x00;
   int8 usu=0x00;
   
   output_high(ON_TX);
   output_low(ON_RX);
   delay_ms(3);
   
   dat1=(info&0x00FF);
   dat2=(info>>8)&0x00FF;
   usu=(Disp_ID&0x0f)<<4;
   usu=usu|(REC&0x0f);
   
   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   fputc(usu, Rbase);   //Identificador
   delay_ms(2);   
   
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   fputc(dat2, Rbase);   //Identificador
   delay_ms(2);
   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);   
   fputc(dat1, Rbase);   //Identificador
   delay_ms(2);
   
   output_high(ON_RX);
   output_low(ON_TX);
   
}


void main( void ) // Función principal
{  // Editado. (Cuando PORTB = 0, es cuando funciona.)
   set_tris_b(0x00); // Se configuran los pines de los leds como salidas.
   set_tris_c(0x80);
   set_tris_d(0xDF);
   set_tris_e(0x00);
//   port_b_pullups(0xFF); // Editado. (Si PORTB son salidas, esto no tiene caso.)
   output_c(0x00);
   output_d(0x00);
   
   // Editado.
   delay_ms(100);
   fprintf(PC,"Inicializando sistema...\r\n\r\n");
   
   // se habilitan las interrupciones
   enable_interrupts(INT_ext);
   enable_interrupts(INT_RDA);
   enable_interrupts(global);
   
   output_high(ON_RX);
   output_low(ON_TX);
   
   for(;;)
   {
      if(input_state(SENSE)==0)
      {
         output_high(LED_SENSE);
         cable=1;
         
         switch(ptr_prog)
         {
            case 0:     //  Inicio del programa de la radio base
            {
               // se muestra el menú de opciones para configuración verificación
               // y control del sistema
               // Editado.
               fprintf(PC,"\r\n ");
               fprintf(PC,"\r\n Programa de control de radio base para robots.");
               fprintf(PC,"\r\n PRUEBA DE COMUNICACIÓN Y CONTROL DE RECEPCIÓN.");
               fprintf(PC,"\r\n --------------------------------------------------");
               fprintf(PC,"\r\n ");
               fprintf(PC,"\r\n Seleccione el LED 1 2 o 3");
               fprintf(PC,"\r\n ");
               fprintf(PC,"\r\n Seleccione una opción: ");
               
               ptr_prog=1;
               break;
            }
            case 1:     //  Espera selección
            {
               //  Se espera a que se seleccione una opción y se dirige el 
               // puntero a la opción respectiva
               
               if(kbh!=0)
               {
                  kbh=0;
                  // Editado.
                  fprintf(PC,"%c %c",32,valor);
                  if(valor == '1' && esp_recep == 0)
                  {
                     Transmite(0x06,0x0A01);
                     output_high(ROB1);
                     output_low(ROB2);
                     esp_recep=1;
                     kbh=0;
                  }
                  else
                  {
                     if(valor == '2')
                     {
                        Transmite(0x06,0x0B02);
                        output_low(ROB1);
                        output_high(ROB2);
                        esp_recep=1;
                        kbh=0;
                     }
                     else
                     {
                        if(valor == '3')
                        {
                           Transmite(0x06,0x0C03);
                           output_high(ROB1);
                           output_high(ROB2);
                           esp_recep=1;
                           kbh=0;
                        }
                     }
                  }
               }
               if(esp_recep == 1)
               {
                  
                  if(recep == 1)
                  {// Editado.
                     fprintf(PC,"\r\n\ RECIBIDO");
                     cont_recep=250;
                     esp_recep=0;
                     recep=0;
                     ptr_prog=0;
                     delay_ms(1000);
                     break;
                  }
                  if(cont_recep == 0)
                  {// Editado.
                     fprintf(PC,"\r\n\ ** NO RECIBIDO **");
                     cont_recep=250;
                     esp_recep=0;
                     recep=0;
                     ptr_prog=0;
                     delay_ms(1000);
                     break;
                  }
                  cont_recep -= 1;
                  delay_us(368);
               }
               break;
            }
         }
      }
      else
      {
         output_low(LED_SENSE);
         if(cable==1)
         {
            cable=2;
            ptr_prog=0;
            // Editado.
            fprintf(PC,"\r\n\r\n ");
            fprintf(PC,"\r\n --------------------------------------------------");
            fprintf(PC,"\r\n         CONEXIÓN CON RADIO BASE PERDÍDA...");
            fprintf(PC,"\r\n --------------------------------------------------"); 
         }
      }
      output_toggle(PIN_B7);
      delay_ms(500);
   }
}
Las partes que modifiqué dicen: "Editado." Y en esta imagen se muestra la recepción: Recepción de mensajes 18F4550.jpg
Pon atención sobre las partes de código que han cambiado para hacer que funcionara.
Por ejemplo: La palabra de configuración, el pin Rx de RBase y el TRIS para el puerto B.

De esta forma fue como logré comunicación.
Al menos con esto ya podrás avanzar y tal vez encontrar la causa de la falla por el puerto B.

Suerte.
 
Última edición:
Atrás
Arriba