Buenas, estoy liado con un proyecto y necesito utilizar 2 USART en un 16F877, una la propia por HW y otra por SW aprovechando la interrupción externa.
Con la propia por HW comunico con un PC, y con la otra por SW comunico con otro PIC 16F877.
Envío tramas de datos de distintas longitudes, y introduzco el carácter 'Z' como final de trama, de forma que hasta que no se detecta que el carácter recibido es una 'Z', no se activa el flag correspondiente de que el string está completo...
Os comento lo que me pasa:
Este es el código que se ejecuta cuando llega un string por el puerto serie por HW... y funciona correctamente
#int_RDA // Recepción de datos del PC
void RDA_isr()
{
dato_rx=fgetc(PUERTO_PC); //Leo el dato recibido
if(dato_rx=='Z') //miro si el dato recibido es una 'Z' de final de trama
{
cadena_rx[incremento_cadena]=dato_rx; //Almaceno el dato en un string
flag_pc=1; //Activo flag indicando que la trama está completa
incremento_cadena=0;
}
else
{
cadena_rx[incremento_cadena]=dato_rx; //Almaceno el dato en el string
incremento_cadena++; //Incremento el indice del string
}
}
y este es el que se ejecuta cuando llega un string por el puerto serie por SW... NO FUNCIONA CORRECTAMENTE!!!
no detecta el final de trama...
#int_EXT //recepción de datos del PIC
void ext_isr()
{
if (kbhit(PUERTO_RF))
{
dato_rx=fgetc(PUERTO_RF);
if(dato_rx=='Z') //mira si el dato recibido es una 'Z' de final de trama
{
cadena_rx[incremento_cadena]=dato_rx;
flag_rf=1;
incremento_cadena=0;
}
else
{
cadena_rx[incremento_cadena]=dato_rx;
incremento_cadena++;
}
}
}
como podéis ver, los dos códigos son casi iguales, pero el de la USART por software no funciona, y el otro si...
He probado a recibir con este código en el que le fijo el número de datos que quiero recibir, y si que funciona...
#int_EXT //Recepción de datos del PIC
void ext_isr()
{
if (kbhit(PUERTO_RF))
{
dato_rx=fgetc(PUERTO_RF);
cadena_rx[incremento_cadena]=dato_rx;
incremento_cadena++;
if(incremento_cadena==6)
{
flag_rf=1;
incremento_cadena=0;
}
}
}
pero no me interesa tener que fijar el número de datos que espero recibir.
Mi duda es la siguiente: una vez configuradas las dos USART, no tendrían que funcionar igual?!?!?!?! la lectura no se hace igual?!?!?!
esta es la configuración de los puertos RS-232 que tengo...
#use fast_io(B)
#use fast_io(C)
#use RS232 (baud=9600, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7,STREAM=PUERTO_PC)
#use RS232 (baud=9600, xmit=PIN_B1, rcv=PIN_B0,STREAM=PUERTO_RF )
a ver si me podéis echar una mano y me aclaro con esto...
Gracias y un saludo...