problemas con rs232 puerto c con pic16f877a en ccs

buenas noches a todos necesito ayuda para comunicarme serialmente del pic 16f877a hacia la pc que sea por el puerto c pin_c6 pin_c7 que son los nativos del pic para estas funciones he intentado de todo y no logro hacer que funcione no se si hay que deshabilitar algunas funciones de la usuart, con los otros puertos funciona de maravilla pero con este en especial tengo problemas, el programa es mas complejo, pero me esta volviendo loco :confused: este problema y lo he simplificado para enviar el estado de un pin del puerto b, yo se que es un tema muy difundido, pero no logro solucinarlo, si no es mucha molestia talvez tambien me podrian ayudar a usar la #int_rda del pic, de antemano muchas gracias a todos

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay (clock=20,000,000)
#use fast_io(c)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#bit v1= 0x06.4 //pin del puerto b a visualizar
#bit v15 = 0x06.3 // pin del puerto b del que se testea su estado
void main()
{
set_tris_c(0b10000000);
set_tris_b(0b00001000);
setup_psp(PSP_DISABLED);
do
{
if (V15==1) // si pinb3 = 1
{
putc ('a'); //visualizar a
v1 = 1;
}
if (V15==0) // si pinb3 = 0
{
fputc ('b'); // visualizar b
v1 = 0;
}
} while (true);
}

he usado pic simulator ide para ver en detalle los procesos del pic
 
hola!! lo unico que se me ocurre es que pongas los pines en minuscula, xmit=pin_c6 ,rcv=pin_c7. Y si es para simular de momento elimina todos los fuses a ver si el problema estuviera ahi.
La interrupcion INT_RDA funciona como cualquier otra interrupcion, el valor que llega al puerto se recoge con la instruccion getc (valor=getc()), antes tienes que habilitar las instrucciones globales y la de la interrupcion:
Código:
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
Un saludo
 
he solucionado el problema ahora! estoy intentando utilizar el buffer del puerto serial interno del pic, si alguien tiene alguna idea de como usarlo y puede compartirlo con nosotros se le sera agradecido, abajo dejo el codigo

PHP:
#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 
#use delay (clock=20,000,000)
#use fast_io(b)
#use fast_io(c)
#use rs232(baud=9600,rcv=pin_c7,xmit=pin_c6) 
int estado;
#int_rda
void isr_rs232()
{
   estado=getc();
}
void main()
{
   set_tris_b(0b00000000);
   set_tris_c(0b10000000);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
 do
 { 
   if (estado=='a')
   {
      printf ("texto recibido \n\f");
      delay_ms(1000);
   }

  if (estado=='b')
  {
      printf ("texto enviado \n\f");
      delay_ms(1000);
  }
 } while (true);
}
como ven la diferencia esta en el fuse jajaj upss!!:LOL: era un error simple el cristal xt (debe ser hs, porque trabaja a 20mhz)
 
Última edición por un moderador:
Atrás
Arriba