Si no me equivoco, se supone que un ISR debe realizar un procesamiento mínimo cuando recibe datos en serie (a través de UART). Estoy planeando implementar dicho protocolo para la comunicación entre 2 sistemas a través de uart. Esta es una situación aproximada de cómo planeo codificar el ISR. Supongamos 2 sistemas A y B donde A está enviando un mensaje a B: la palabra clave se usa para indicar el inicio del mensaje (los datos/longitud establecidos no pueden ser la palabra clave). ChannelOK, Longitud de datos, RxLength, RxData, Indicador de paquete recibido en el proceso de B son 0 predeterminados. Longitud de datos = no. de (todos los datos) en bytes (por ejemplo, si todos los datos = 1, longitud de los datos = 1)
A's Process
Send Keyword
Send Length of data
Send all data
B's Process
Rx Interrupt
enter ISR
ISR: if(Received Byte == Keyword && !ChannelOK)
{
Set ChannelOK
}
if(ChannelOK && RxLength)
{
Set Length of data=received byte
ChannelOK=0
RxLength=0
}
if(Length of data != 0 && RxData)
{
Store Data
--Length of data
if(Length of data==0)
{
Set Packet received flag
RxData=0
}
}
if(ChannelOK)
{
Set RxLength
}
if(Length of data)
{
Set RxData
}
Reset to Interrupt Again
Mi duda es: B tiene tantas cosas que hacer en el ISR mientras que A está enviando continuamente. Suponiendo que A envía datos a 7,5 Mbps (11 bits por transferencia), el ISR tiene que restablecer la interrupción cada (11/7,5 M) segundos. Esto parece muy muy pequeño. ¿Se perderán los datos si no reinicio la interrupción a tiempo o se almacenarán en el FIFO de 16 bytes para que una interrupción pueda activarse inmediatamente en el segundo en que reinicie la interrupción o debo ralentizar un proceso de Tx esperando un ACK? por cada byte (se ralentiza mucho)???
Soy un novato en ISR. Por favor, ayúdeme. Cualquier diseño o protocolo de ISR para la comunicación de datos en serie sería útil.
Gracias
Propondré un método que puede resultarle útil con algunas modificaciones para adaptarlo a sus necesidades.
En este método, el ISR es tan pequeño que solo guarda datos en una matriz para su posterior decodificación en el programa principal, se utilizan dos contadores para detectar los datos recibidos y los datos decodificados. por supuesto, puede usar el puntero en lugar de los contadores.
ISR:
{
Receivedbytes[i++]= Rxbuffer;
dataReceived++;
}
main:
void UARTdecode{
if (dataDecoded<dataRecived)
{
Received byte = Receivedbytes[j++];
///// where routine
if(Received Byte == Keyword && !ChannelOK)
{
Set ChannelOK
}
..
..
..
//// end of routine
dataDecoded+=x; (where x is the amount of data decoded or message length)
}
}
PD:Es MUY IMPORTANTE que i y j se declaren como variables Estáticas
También puede verificar el código fuente de la biblioteca serial de hardware arduino, es de código abierto y usa ISR para recibir datos "HardwareSerial.h" en el directorio de instalación
B tiene tantas cosas que hacer en el ISR
No, al menos no si diseña correctamente el sistema. Mantendría cualquier lógica de decodificación fuera del ISR. Por lo general, mi controlador de interrupciones UART toma el byte del hardware, borra la condición de interrupción y mete el byte en un FIFO. El código de primer plano puede tomarlo desde allí. Haga que el FIFO sea lo suficientemente grande para que el código de primer plano pueda ejecutarse en ráfagas y el FIFO no se desborde entre ráfagas.
Si hay demasiado que hacer por byte, entonces tiene un problema fundamental que el firmware no puede solucionar. Necesita un procesador más rápido o una comunicación más lenta.
olin lathrop
AlfaGoku
Cuchara
AlfaGoku