Configuración de pines para comunicacion serial 232 en CCS

No tengo mucho tiempo programando en ccs habia programado anteriormente en picbasic y me he encontrado con un problema al momento de querer cambiar los pines especificados por el pic16f877a para tx y rx que que serian el pin c6 y c7, he querido cambiarlos por otro por ejemplo para tx el pin d0 y rx el pin d1 pero como uso esta interrupción "enable_interrupts(int_rda)" creo que ese el problema que no me deja asignar otros pines para comunicación serial ya que si asigno otros pines difentes a los especificados por el pic el programa no funciona en el pic, no se si se pueda modificar o agregar algo en el código para poder utilizar cualquier pin como entrada o salida de datos por puerto serial no se si me pudieran ayudar de favor para saber que tengo que corregir en el código. El programa lo que hace es leer los números tecleados por el usuario y eso hace que el puerto b encienda diferentes led en código binario si por ejemplo se teclea 2 se prende el pin b1, dejo el código que estoy realizando:

Código:
#include <16F873A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOBROWNOUT,NOCPD,NODEBUG,NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_d0, rcv=pin_d1, bits=8, parity=N)
#use standard_io(B)


int valor;

#int_rda

void serial_isr() 
{
  valor=getc();
}

void main()
{  
  
   enable_interrupts(global);
   enable_interrupts(int_rda);
      
   for( ;; ) 
   {
     output_b(valor);
   }
}
 
Última edición:
Yo pasé muchas horas quebrándome la cabeza por lo mismo...
Te adelanto resultados; La interrupción RDA sólo funciona por hardware, es decir, utilizando los pines específicos del PIC reservados para el puerto serie.

Un abrazo
 
La interrupción RDA sólo funciona por hardware, es decir, utilizando los pines específicos del PIC reservados para el puerto serie.

En realidad hay otra opción (no la he probado personalmente), consiste en utilizar la interrupción por cambio de estado en el pin RB0. A través de este pin podemos detectar los cambios de flanco de la señal asincrónica RS232.

Tendrías que implementar un buffer circular y tomar datos para ver como reacciona. En la librería RS485.c de CCS lo implementa...tendrías que analizar como usarlo en tu aplicación.

Saludos !
 
hola que tal

gracias por sus comentarios arrivaellobo y Moyano Jonathan ya logré resolver el problema solo elimine las interrupciones y deje el programa de la siguiente manera y funciona bien:

#include <16F877A.h>
//#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOBROWNOUT,NOCPD,NODEBUG,NOWRT
#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_d4, RCV=PIN_d5)
#use standard_io(B)

void main()
{
int num;

for( ;; )
{
num= getc();
output_b(num);
}
}

por lo que me di cuenta no era necesario esas interrupciones para poder establecer la recepción de datos para el pic, pero de antemano gracias saludos.
 
El programa así como está funciona, pero no es todo lo correcto que podría ser, ya que el PIC se quedará "esperando" un dato por puerto serie, mientras no lo reciba quedará enclavado en la instrucción num= getc();. Puede que ahora no necesites nada más, pero al ir ampliando los programas te darás cuenta tu mismo de que no puedes permitirte que el PIC se quede haciendo "solo una cosa" :LOL:
 
Atrás
Arriba