Hola:
·Estoy trabajando en una aplicación que requiere recibir data en forma serial, procesarla (operaciones XOR), y luego reenviarla. El problema es que en lo posible no debo perder bytes, pero además debo enviar una secuencia de sincronía en forma periódica. El siguiente código es mi intento para hacer lo que necesito:
#include <18F252.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, parity=N, bits=8, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//DEFINICIONES
#define nop delay_cycles(1) // nop;
//VARIABLES GLOBALES
int1 CTS_MDM = 0;
int sync = 0, fullb = 0;
int data = 0;
int i = 0, j = 0, k = 0;
int inbuff[4],outbuff[4];
int32 ctr = 0;
#INT_RDA
void serial_isr()
{
i++;
if(i==4)
{
i = 0;
outbuff[0] = inbuff[0];
outbuff[1] = inbuff[1];
outbuff[2] = inbuff[2];
outbuff[3] = inbuff[3];
fullb = 1;
}
}
//LAZO PRINCIPAL
void main(void)
{
//Habilitar interrupciones necesarias
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
enable_interrupts(INT_RDA);
for(i=0;i<4;i++)
{
inbuff[i] = 0;
outbuff[i] = 0;
}
i = 0;
while(1)
{
if(sync == 1)
{
k++;
sync = 0;
}
if(fullb == 1)
{
ctr++;
j++;
if(j==4)
{
j = 0;
fullb = 0;
}
if(!(ctr%16))
sync = 1;
}
}
}
·En el fondo, lo que busco es que si yo envío una cadena de bytes, ej.
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
el micro reenvíe lo siguiente:
a b c d e f g h i j k l m n o p (0xFF) (0xFF) (ctr1) (ctr2) q r s t u v w x y z a b c d e f (0xFF) (0xFF) (ctr1) (ctr2)
*Los últimos 2 bytes (G,H) se almacenan hasta que se llene el buffer de entrada (2 bytes más).
·De momento tengo 2 problemas:
*Cuando trato de simular en MPLAB, el programa corre bien al principio, pero luego deja de transmitir sin motivo aparente (TXREG deja de actualizarse).
*Al armar el circuito, la lógica del buffer de 4 bytes funciona correctamente, pero al enviar la trama de sincronía (cuando recibo 16 bytes), pierdo justamente 4 bytes. Pensé que la USART siendo full dúplex no tendría este problema...
·Si alguien puede ayudarme a resolver el cómo evitar la pérdida de datos a pesar de añadir una trama de sincronía entre medio, le estaré muy agradecido.
Atte.
THX1138
PD: Tengo las versiones 3.249 y 4.038 del compilador CCS.