Escribo un código (para Atmega168P) para recibir datos de la interrupción USART como se muestra a continuación:
ISR (USART_RX_vect)
{
unsigned char count=0;
unsigned char coder[13];
int over_uart=0;
for (count=0;count<13;count++)
{
while (!recive_485)
{
over_uart++;
wdt;
if (over_uart>=20000) {
coder[0]=0;
count=14;
over_uart=0;
break; }
}
coder[count]=UDR0;
}
}
Cada vez que recibo 13 bytes de datos y los coloco en coder
array.
Utilizo una variable over_uart
para calcular el tiempo entre cada byte recibido. Si over_uart>=20000
significa que:
El progreso de la recepción es el inicio, pero tenemos un problema en las líneas que no obtienen el siguiente byte en 20000ms. Y finalice el último comando y busque el nuevo 13byte que recibirá de la línea.
¿Cualquier organismo conoce una forma optimizada de encontrar el retraso entre recibir datos de USART (sin la ayuda de over_uart
variable)?
EDIT :
Corrijo el problema en mi código y elimino la demora de colocación en ISI como un golpe:
ISR (USART_RX_vect)
{
coder[count]=UDR0;
if (coder[count] == 20)
UartFlag=True;
else
count++;
}
Y en la función Main
:
while (1)
{
if (UartFlag)
{
DoSomthing();
count=0;
UartFlag=Fulse;
}
}