martes, 24 de abril de 2012

Interfaces serie: librerías e interrupciones

AtMega 2560 (4xUSART).
El entorno Arduino implementa la comunicación serie a través de la libreria integrada Serial. Esta se encarga de manejar las interupciones de las USART/UART de Arduino, configurar el hardware y gestionar el flujo de datos.
Particularmente, maneja las interrupciones de dato recibido y de dato transmitido, añadiendo o recogiendo los datos de sendos bufferes circulares, de forma que un sketch de Arduino pueda mandar datos a la UART sin preocuparse de si la unidad tiene trabajo en ese momento o no.
Esto trae el inconveniente de la recepción de datos, se ha de consultar periódicamente en el programa si se han recibido datos nuevos.
La referencia de la librería se encuentra aqui.


Con nuestro sistema, hemos experimentado pérdida de tramas, es decir, algunos bytes que deberían ser redirigidos desde el puerto MIDI al PC se pierden. Esto ocurre particularmente a velocidades altas de notas usando varios canales o instrumentos a la vez.
Al basarse la librería Serial en bufferes, nos lleva a pensar que se pierden las tramas al llenarse el buffer de recepción antes de que nuestro programa los procese.

Para solucionarlo, hemos estado leyendo acerca de manejar la UART directamente, sin la librería de Arduino, y procesar nosotros mismos las interrupciones. En concreto, la mayoría de información la hemos obtenido de este post del foro de Arduino: Interrupt-driven USART reception: I'm stumped.

Usando parte del código allí posteado, y cambiando algunos datos, como los vectores de interrupcion USART0_RX_vect y USART1_RX_vect, hemos hecho la librería de comunicaciones para nuestro sistema.

Se puede descargar aqui.

Contiene tanto los archivos ArdSynthComm.h, ArdSynthComm.cpp y keywords.txt (resaltado de sintaxis del entorno Arduino), como un par de ejemplos de uso: USBecho y MIDIreplicator. En sendos ejemplos se describe su función.


2 comentarios:

  1. Hola José
    El Dropbox donde adjuntaste los documentos no esta activo.
    Podrías volver a subirlo? Muchas gracias

    ResponderEliminar