Hola a todos:
Tengo problemas en el envío por el puerto serie con CCS.
El objetivo es manejar tanto el envio como la recepción por interrupción. He simplificado el programa para poder encontrar el fallo. Por sondeo/polling todo guay pero eso, quiero que al enviar me genere la interrupción.
Veo que el problema está ahí, porque si tengo TXIE a '1' y transmite , él pone a '1' TXIF y debería lanzar la interrupción.
El código es el siguiente:
#DEVICE PIC16F876A
#include <PIC16F876A>
/*------- g0n -------*/
#fuses HS,NOWDT
int transmitido=1;
int recibido=0;
char dato=0;
#int_RDA // interrupción caracter_recibido
RDA_isr(){
//RCIF=0; // se borra automáticamente al leer
dato=RCREG;
recibido=1; // activa flag
}
#int_TBE
TBE_isr()
{
TXIE=0;
//TXIF=0; // se borra automaticamente al cargar un nuevo dato para enviar
transmitido=1;
}
void main()
{
// configuro comunicaciones serie
SPBRG = 0x81; //-- 9600 baudios (con cristal de 20MHz)
TXSTA = 0x24; //-- Configurar transmisor
RCSTA = 0x90; //-- Configurar receptor
// habilito int recepcion/transmision uart
//PIE1 |= 0x30; // habilito Int rx y tx
RCIE = 1;
TXIE = 0;
GIE = 1;
PEIE = 1;
while(1)
{
if(recibido)
{
recibido=0;
if(transmitido)
{
TXREG=dato;
TXIE=1;
transmitido=0;
}
}
}//while(1)
}
Ahora básicamente es un ECO. Me da que falla en #int_TBE porque la primera vez repite la letra pero luego ya no. Eso es que no me marca transmitido a 1. Puede que esté equivocado, lo de #int_TBE es lo más parecido a lo que necesito no?, una interrupción cuando se ha enviado el dato, al igual que #int_RDA que es cuando se recibe.
A ver qué me podéis contar.
En resumen es: ¿cómo se maneja la interrupción de recepción del puerto serie de la usart con CCS?
Gracias, gONzAO