¿Por que usarias un UART por sotfware cuando tenes un modulo en hardware?
Es insensato.
Y no pongas nunca un printf en una interrupcion, creo haber visto otros codigos tuyos con el mismo tema, y si no mal recuerdo te lo dije que no debes ponerlo ( a no ser que me confunda de persona). Imagino que lo haces para "comprobar" que llega alli, pero todavia no tenes seguro que funcione lo de la UART entonces evitemoslo.
Si queres ver si recibio desde la UART hace un toggle de alguna salida. Que mejor que un led para indicarte si llego algo, es simple, no depende de nada y solo lleva una resistencia + led
El main seria un while(1); o... un toggle de otro pin con un delay solo para saber si esta funcionando el micro. Nuevamente, un LED.
Debo imaginar que estas usando algun conversor TTL-USB entre medio de esto.
¿Por que un LED y no un printf en el main?
Todavia ni siquiera sabemos si es un problema de la UART, entonces con esto al menos probamos la recepcion del mismo.
Si cambia el estado del led de recepcion indica que llego algo y que entro a la interrupcion (sea lo que sea que llego), sino es un problema con la UART, si envias un valor y no cambia el estado del LED entonces es un problema de recepcion. Luego podes complejizarlo mas, pero primero desde lo basico.
Si no funciona el led del main, entonces seguro que es un problema de conexion o de FUSES.
Y cambia los pines para que concuerden con los de la UART, ya que CCS te crea un UART por software al hacerle eso.
Estas usando set_tris cuando no usas #USE FAST_IO, lo cual no tiene sentido por que el compilador te lo va a cambiar como el quiere. Para eso lo dejamos que lo haga el, por eso lo quite.
no tiene sentido usar kbhit en la interrupcion, por que si entro es por que llego algo, asi que kbhit siempre va a ser true, tampoco tiene sentido ponerlo a 0 si luego se le asigna otro valor a rcvchar.
El programa quedaria:
#include <16F88.h>
#FUSES NOWDT // No Watch Dog Timer
#FUSES INTRC_IO // >>> Oscilador interno, no CLKOUT
#FUSES PUT // Power Up Timer
#FUSES NOMCLR // Master Clear pin used for I/O
#FUSES BROWNOUT // Reset when brownout detected
#FUSES PROTECT // Code protected from reading
#FUSES NOCPD // No EE protection
#use delay(int=4000000) // Especifica al compilador que hace uso del OSC interno
#use rs232(baud=9600, xmit=PIN_B5,rcv=PIN_B2,bits=8, parity=N)
char rcvchar;
#int_rda
void serial_isr(void)
{
if(rcvchar=='0') output_low(PIN_A0);
else if(rcvchar=='1') output_high(PIN_A0);
output_toggle(PIN_B0);
}
void main(void)
{
setup_comparator(NC_NC_NC_NC); // Todo digital
output_low(PIN_A0);
enable_interrupts(int_rda);
enable_interrupts(global);
while(TRUE)
{
output_toggle(PIN_B1);
delay_ms(500);
}
}
y tal ves le tengas que poner un ERRORS en la definicion de RS232, pero por ahora proba asi.