AVR USART espera la respuesta de AVR para continuar con el flujo de texto

AVR USART espera la respuesta de AVR para continuar con el protocolo

Estoy haciendo un proyecto de último año y necesito enviar un archivo de texto grande línea por línea a un AVR (atmega32) que controlará un piano usando ~36 solenoides y registros de desplazamiento. Esto debe hacerse automáticamente y muy rápido. No puedo ingresar manualmente el texto en la terminal. Necesito enviar 3 cadenas, línea por línea a un AVR y esperar entre cada línea una confirmación para continuar desde el AVR.

  • El archivo de texto es un archivo midi convertido que contiene 3 información útil (la hora del evento, la nota y el estado (presionar nota o no presionar). El archivo de texto se ve así:

    213, 25, ON
    321, 25, OFF
    521, 36, ON --> que representa tocar la nota C en tiempo = 521 ms

Donde la primera cadena es la hora del evento, la segunda es la nota y la tercera es el estado de la nota

El protocolo tendría que verse así:

  • La PC envía 3 cuerdas al AVR. Así que un total de 3 transferencias USART.
  • La PC espera a que AVR envíe un acuse de recibo para continuar transfiriendo la siguiente línea de texto
  • El AVR reproduce el "evento" en el piano y al final envía una confirmación a la PC para enviar las siguientes líneas de texto

¿Cómo se puede lograr esto?

¿Por qué estoy haciendo esto?

El problema es que no puedo almacenar todo el archivo de texto en una matriz porque el AVR es demasiado pequeño (el atmega más grande es de 512 Kb si no recuerdo mal) Necesito transmitir el archivo de texto usando la terminal (Hyperterminal) línea por línea . PERO, ¿cómo enviar una línea usando la terminal, esperar hasta que el atmega termine el proceso -> enviar una confirmación a la PC para transmitir la siguiente línea?

¿Está esperando hasta recibir una línea completa antes de procesarla? Y si es así, ¿por qué?
¿Por qué estás convirtiendo el MIDI a texto? ¿Por qué no hacer que el AVR interprete los datos MIDI directamente, lo que podría decirse que sería mucho más simple? ¡Después de todo, enviar música a través de un puerto serie es exactamente para lo que se diseñó MIDI!
Sí, porque 1 línea me dará suficiente información para transmitir bits a un registro de desplazamiento. por ejemplo, la nota C representará 000000100 en la configuración de solenoides mapeados.
@DaveTweed Porque no estoy enviando MIDI DESDE el AVR. El AVR controla los SOLENOIDES
@DaveTweed ¿Estás diciendo que puedo hacer MIDI -> USART -> AVR -> SOLENOIDES?
¿Cuál es la diferencia entre MIDI→texto→USART→AVR→solenoides y MIDI→USART→AVR→solenoides aparte del paso de conversión adicional? Y no necesita una línea completa antes de comenzar a procesarla; hazlo byte por byte en su lugar.
Sí, si usa un programa secuenciador para enviar la música al puerto MIDI de la computadora host, puede recibir estos datos usando el USART del AVR. Solo necesita establecer la velocidad de datos USART en 31.250 kbps y construir una interfaz de hardware simple . (Sé que no está usando Arduino específicamente, pero puede obtener el esquema de la parte que necesita aquí). Además, la computadora manejará automáticamente el tiempo de la nota (control de flujo) por usted. Además, también podrá usar cualquier otro dispositivo habilitado para MIDI para controlar su piano.
Si desea usar hipterminal, deberá implementar algo que admita, como XON/XOFF (software) o posiblemente RTS/CTS (hardware). Tenga en cuenta que si utiliza un convertidor serie USB, un protocolo de respuesta requerida lo ralentizará sustancialmente. Sin embargo, otra opción es usar USB nativo (en lugar de USB serie), en cuyo caso puede negarse a reconocer un paquete USB hasta que lo haya consumido y esté listo para otro. Si implementa un protocolo serie USB conocido, puede usar HyperTerminal como su remitente. Pero considere abandonar el hiperterminal y escribir su propio programa emisor.
O podría implementar un dispositivo MIDI USB y dejar que un secuenciador de software lo maneje.
@IgnacioVazquez-Abrams No tengo ningún dispositivo MIDI para controlar. Los solenoides son caseros para el proyecto, por eso necesito convertir MIDI a texto. Luego use este texto para controlar los registros de desplazamiento
Es por eso que convierte la MCU en un dispositivo MIDI.
@IgnacioVazquez-Abrams pero nuestra entrada no es una señal MIDI. Es un archivo midi. ¿Cómo hago eso?
Utiliza un secuenciador MIDI para convertir el archivo MIDI en una señal MIDI.
@IgnacioVazquez-Abrams, OK, entonces, ¿cómo usé esta señal para controlar los solenoides?
Haga que el AVR interprete la señal MIDI y los active según corresponda.
@IgnacioVazquez-Abrams ese es el problema, no encuentro ningún intérprete MIDI. Sólo lo contrario es popular.
Luego, debe agregar el esfuerzo de escribirlo en su presupuesto.
@DaveTweed, Ok, pero entonces, ¿cómo puedo interpretar el MIDI ingresado? No quiero dar salida a MIDI, estoy dando salida a bits.
Lo que dijo @IgnacioVazquez-Abrams. Y lo que dije para empezar, hace 2 horas. Escribes un intérprete MIDI, que es mucho más simple que escribir un intérprete de texto. No necesita implementar toda la especificación MIDI , solo mensajes de "nota activada" y "nota desactivada".

Respuestas (1)

Lo que necesita es "control de flujo" o "apretón de manos".

Para USART, puede usar el control de flujo de hardware con RTS/CTS , pero muchas implementaciones de USART en la actualidad los omiten. Si ha terminado su hardware y sin estos pines conectados, puede intentar " control de flujo de software " con "XON/XOFF", porque estos dos códigos no aparecerán en su archivo de texto (son caracteres no imprimibles). Así que utilícelos como control de flujo es posible. Pero en comparación con el control de flujo de hardware, este último puede ser un poco más lento.

La principal limitación con usted es que su MCU no es lo suficientemente fuerte como para manejar todo el archivo, por lo que analizar el archivo en el extremo de la PC es razonable.

Si no quiere sumergirse en un complicado programa USART en la PC, puede probar Tera Term , un asesino "Hyperterminal" de código abierto, programable y práctico.

¿Tera Term proporciona una funcionalidad para leer un archivo de texto? Porque si mal no recuerdo, las terminales requieren una entrada manual para la transferencia de caracteres, ¿verdad? ¡Por cierto, gracias por la información!
Sí, puede realizar una programación sencilla en Tera Term y es compatible con la lectura de archivos. ¿Hyperterminal necesita entrada manual?