
C. Conversiones
Cada valor convertido se empaqueta en palabras de 3 bytes
(figura 14). El bit 24 indica la validez de la conversión
(asegura que la medición se realizó durante el pico de la señal
de referencia).
El campo TIEMPO DE CONVERSIÓN lo completa la
ETHER TMIO y consiste en un contador en el cual cada
incremento representa 64 µs.
El bit P indica la polaridad del pico de la señal de
referencia, siendo 0 cuando es positivo y 1 cuando es
negativo. La computadora utiliza la polaridad del pico junto
con los valores del canal seno y coseno para determinar la
posición angular de un transductor sincrónico. Comparado
con el sistema original, como todas las conversiones se
realizan en un mismo pico todas tienen la misma polaridad.
Esto es transparente para la computadora naval.
El campo de conversión es de 12 bits y se representan los
valores de las señales de ±4V en complemento a 2.
Fig. 14 Estructura de conversión AD.
IX. DESARROLLO DEL FIRMWARE
El firmware de la interfaz desarrollada consiste en 3 tareas,
dos se ocupan de la transmisión y recepción de datagramas
UDP y la restante realiza las conversiones AD. Para el
detector de picos se utiliza una rutina de interrupción externa.
Se utiliza el sistema operativo en tiempo real FreeRTOS
[3]. Inicialmente se consideró programar las tareas en un
súper bucle debido a la simplicidad de las mismas; sin
embargo, como en un futuro se evalúa desarrollar otra
interfaz en la misma placa, el uso de un sistema operativo
facilita la escalabilidad de este desarrollo.
Para el manejo de la interfaz Ethernet se utiliza la librería
LwIP [4] junto con la API NETCONN. LwIP proporciona las
funciones correspondientes a los protocolos utilizados como
IPv4, ICMP, UDP, entre otros.
Siguiendo el formato usado en el sistema original, se
definió una estructura lcc_word conformada por 3 bytes para
almacenar las instrucciones recibidas y las conversiones a
transmitir. También se utilizan distintas funciones que, por
medio de máscaras y bit shifting, extraen los campos de bits
de las palabras vistas en la sección anterior.
A. Tarea UDPrx
La tarea UDPrx administra la recepción de datagramas
UDP provenientes del cliente (placa ETHER-TMIO), ya sean
mensajes de confirmación (ACK) o con carga útil (MSJ). Se
ejecuta en un bucle, inicialmente esperando recibir algún
datagrama a través del socket UDP.
Al recibir un datagrama, determina si cumple con el
tamaño mínimo para ser válido (3 bytes), sino se descarta y
vuelve a la espera de un nuevo datagrama.
Una vez recibido un datagrama válido, se extrae el
encabezado y se guarda en la estructura header.
Luego, determina si se trata de un mensaje o de un acuse
de recibo con lcc_readACK(), que lee el bit ACK/MSJ (bit
16) del encabezado.
Si se trata de un mensaje, la tarea envía el encabezado a la
tarea UDPtx mediante la cola rx2txQueue para construir el
datagrama de respuesta. La tarea entonces extrae del
encabezado la dirección de dispositivo con lcc_readDA(). Si
no coincide con la dirección del LCD AD, el datagrama se
descarta. A continuación, copia los segundos 3 bytes del
datagrama en la estructura external_function y la envía a la
tarea ADConverter mediante la cola rx2adcQueue.
Por otro lado, si es un ACK, se notifica a la tarea UDPtx y
queda a la espera de un nuevo datagrama.
Fig. 15 Diagrama de flujo de UDPrx.
B. Tarea UDPtx
Esta tarea administra la transmisión de datagramas desde
la interfaz a la ETHER-TMIO tanto para envío de
conversiones como para mensajes de confirmación.
Inicia esperando el encabezado proveniente de la tarea
UDPrx. El primer datagrama que llega a la interfaz es una
instrucción para realizar conversiones desde determinado
canal inicial. La interfaz debe confirmar la recepción de la
instrucción reenviando el mismo encabezado, pero con el bit
ACK/MSJ en 1, indicando ACK. Para esto, utiliza la función
lcc_setACK() en el encabezado.
Luego de enviar el ACK, espera a recibir 24 conversiones
de la tarea ADConverter a través de la cola adc2txQueue. En
los casos donde se realizan solo 16 conversiones, las 8
restantes se rellenan con 0.
Una vez recibidas, UDPtx empaqueta las conversiones,
aumenta el número de secuencia del mensaje con
lcc_incSeq() y las envía, quedando a la espera de la
confirmación de recepción del cliente (mediante una
notificación enviada por la tarea UDPrx).
Si la confirmación no se recibe antes de un tiempo
determinado, se reintenta el envío del datagrama. La tarea
vuelve al inicio cuando se supera el número máximo de
reintentos o si se recibe la confirmación.
Revista elektron, Vol. 9, No. 2, pp. 84-93 (2025)
http://elektron.fi.uba.ar