Especificación de Diseño Materia Técnicas Digitales III – 2009 Alumno Leandro Arcusin Docentes Prof.: Ing. Sebastián Viviani JTP.: Ing. Gustavo Nudelman Especificación de Diseño 2009 Indice Diagramas............................................................................................................................................ 2 Descripción del Sistema ...................................................................................................................... 4 Esquemáticos ...................................................................................................................................... 5 Microcontrolador ............................................................................................................................ 5 Acondicionador de audio ................................................................................................................ 6 Circuitos impresos ............................................................................................................................... 8 Microcontrolador ............................................................................................................................ 8 Acondicionador de audio ................................................................................................................ 8 Firmware ........................................................................................................................................... 10 Introducción .................................................................................................................................. 10 Implementación del Dispositivo Clase Audio ................................................................................ 10 Comentarios sobre el código......................................................................................................... 13 Funciones principales ................................................................................................................ 14 USB callback functions .............................................................................................................. 17 Diagramas Diagrama 1: Diagrama de bloques ...................................................................................................... 4 Diagrama 2: Esquemático del microcontrolador ................................................................................ 5 Diagrama 3: Esquemático del acondicionador de audio..................................................................... 6 Diagrama 4: Esquemático del acondicionador de audio..................................................................... 7 Diagrama 5: Impreso del microcontrolador ........................................................................................ 8 Diagrama 6: Impreso del acondicionador de audio ............................................................................ 9 Diagrama 7: Estructura del micrófono .............................................................................................. 11 Diagrama 8: Jerarquía de los descriptores para un micrófono ......................................................... 12 - | Leandro Arcusin 2 Especificación de Diseño 2009 - | Leandro Arcusin 3 Especificación de Diseño 2009 Descripción del Sistema El sistema consiste en 3 partes principales que se observan en el siguiente diagrama de bloques Esteto USB Sonda fonocaptora Acondicionador de audio Conexión USB Microcontrolador Diagrama 1: Diagrama de bloques El objetivo de esta cadena es la de obtener sonidos de la capsula de un estetoscopio y transferirlas a una computadora, ya sea para su almacenamiento o procesamiento. Sonda fonocaptora Se trata de una capsula electret debidamente acoplada a la campana de un estetoscopio. Debe dejarse entre la campana y la posición en la que se encuentra la sonda un pequeño pedazo de manguera de forma tal de generar una columna de aire que aumente la sensibilidad de la capsula electret a los sub-sonidos que se pretenden captar. Acondicionado de audio Esta etapa acondiciona la señal proveniente de la capsula electret a través de una serie de filtros y amplificadores de forma tal de obtener una señal “limpia”, con información únicamente de las frecuencias de interese (de 10 a 500 Hz aproximadamente) y con los niveles óptimos para ingresar a conversor analógico digital del microcontrolador. Microcontrolador Cumple con dos funciones básicas: manejar la comunicación USB con la computadora y digitalizar las señales provenientes de la etapa previa. - | Leandro Arcusin 4 Especificación de Diseño 2009 Esquemáticos Microcontrolador El circuito del microcontrolador contiene los siguientes componentes a destacar: Conector USB tipo B Circuito de reset Circuito de ingreso en modo bootloader 4 leds indicadores Capacitor para regulador interno de 3,3 V Se trata de un PIC18F4550, este fue elegido por dos motivos principales: la familiaridad del alumnos con dicho dispositivo y su lenguaje de programación y el hecho de tener incorporado un SIE (serial interface engine) USB compatible. Es decir que trae incorporado el hardware necesario para conectarlo a un BUS usb y provee los recursos (hard y soft) para el desarrollo de distintas aplicaciones. Diagrama 2: Esquemático del microcontrolador - | Leandro Arcusin 5 Especificación de Diseño 2009 Acondicionador de audio El circuito desarrollado para esta etapa fue basado en el siguiente circuito: Diagrama 3: Esquemático del acondicionador de audio Este circuito presenta el inconveniente de utilizar una fuente partida de ± 9 V, y en nuestro caso se quiere que el circuito sea alimentado enteramente a través de la conexión USB que es de solo 5 V. Por otra parte se retiró el indicador de pulsos compuesto por el operacinal U4 y el led D1 y se modificó la ultima etapa para obtener una señal de 0-5 V con un valor medio de 2,5 V para aprovechar el rango dinámico del ADC incorporado en el microcontrolador. El circuito resultante fue el siguiente: - | Leandro Arcusin 6 Especificación de Diseño 2009 Diagrama 4: Esquemático del acondicionador de audio - | Leandro Arcusin 7 Especificación de Diseño 2009 Circuitos impresos Microcontrolador Diagrama 5: Impreso del microcontrolador Acondicionador de audio - | Leandro Arcusin 8 Especificación de Diseño 2009 Diagrama 6: Impreso del acondicionador de audio - | Leandro Arcusin 9 Especificación de Diseño 2009 Firmware Introducción El firmware es el programa cargado en el microcontrolador PIC18F4550. Está programado en lenguaje C y compilado con la versión C18 Student Version que ofrece el fabricante Microchip. El objetivo del programa es controlar las funciones del microcontrolador de forma tal que realice las tareas necesarias para establecer la comunicación con la computadora y la adquisición de las señales del estetoscopio. El entorno de desarrollo (o IDE) fue el MPLAB v8.30, software que también proporciona el fabricante del chip de forma gratuita. Utilizamos para realizar nuestra aplicación una serie de ejemplos que provee Microchip, mostrando la utilización del USB en sus microcontroladores y donde ofrece un framework que implementa el stack USB facilitando el desarrollo de las aplicaciones sobre esta tecnología. En cuanto a herramientas de debugging no disponíamos de ninguna al momento de desarrollar el proyecto, con lo cual acudimos al rustico, pero siempre presente, debugging a LED. Esto es, encender o apagar LEDs auxiliares para detectar en qué puntos del programa se detenía la ejecución del firmware. Para la comunicación USB utilizamos una versión de prueba del USBlyzer (v 1.5). Implementación del Dispositivo Clase Audio Para el funcionamiento del estetoscopio USB decidimos implementar un dispositivo clase audio. Esta es una de las clases que define la norma USB. Hacerlo de esta forma permite utilizar para la comunicación del mismo con la PC drivers genéricos que tanto Windows®, Mac® y GNU/Linux contienen en forma nativa. Esto hace que el dispositivo sea reconocido inmediatamente por el S.O. sin necesidad de instalar drivers externos y, claro, tener que desarrollarlos. Como nuestro dispositivo entrega envía audio a la PC, y siguiendo con la lógica de utilizar un dispositivo de la clase ya existente, decidimos implementar un micrófono. Afortunadamente en la documentación de la clase audio (que se encuentra adjunta) hay un ejemplo de cómo implementar este tipo de dispositivos. Por otra parte Microchip ofrece un framework sobre el cual trabajar para implementar Audio Class devices . - | Leandro Arcusin 10 Especificación de Diseño 2009 Todas estas definiciones se ponen de manifiesto en los descriptores que se encuentran en el archivo usb_descriptors.c Según la norma, debemos implementar una serie de descriptores que permitan representar la siguiente estructura: Diagrama 7: Estructura del micrófono IT (Input Terminal) representa a la cápsula electret y al conversor analógico digital. OT (Output Terminal) representa el endpoint de entrada para la función de audio. Por otra parte se observa que hay dos interfaces definidas. La primera de ellas, AudioControl, es obligatoria. Todos los dispositivos de audio deben definir esta interfase. En esta se encuentran (si los tuviera) los controles del dispositivo como el volumen, tono, frecuencia de muestreo, etc. La segunda interfase es la AudioStreaming y esta presenta 2 alternate settings. La primera (alt. setting 0) no define ningún endpoint y por lo tanto tiene un ancho de banda asociado nulo. Este setting lo elige el host cuando desea liberar ancho de banda, por ejemplo cuando el micrófono no está en un porque no hay ningún programa que pueda procesar audio abierto. Al abrir algún programa dónde se requiera la entrada de audio, el host envía un SET_INTERFACE que es un standard request, y está definido en el capítulo 9 de la norma USB. Este altérnate setting 1, define un endpoint isochronous de entrada, por donde envía el audio. En todos los descriptores (salvo en el de device), se utilizan además de los descriptores estándar, descriptores del tipo class especific, que son aquellos que define en particular la clase audio para dispositivos de este tipo. Es de gran ayuda para comprender como están articulados los descriptores un gráfico que se encuentra en el documento Device Class Definition for Audio Devices (rev 1.0), apéndice B. - | Leandro Arcusin 11 Especificación de Diseño 2009 Diagrama 8: Jerarquía de los descriptores para un micrófono A nivel del firmware estos descriptores y los string descriptors están implementados como look up tables alojadas en la ROM del micro. Estos se manejan a través de un conjunto de arrays que son apuntados por unos arrays de punteros a descriptores y su utilización está implementada en el framework que ofrece Microchip. - | Leandro Arcusin 12 Especificación de Diseño 2009 Comentarios sobre el código El firmware está compuesto por 3 archivos principales: main.c: contiene las rutinas de lectura de señales del estetoscopio, actualización del estado de los LEDs que indican el funcionamiento y la implementación de rutinas de atención a eventos particulares del USB . usb_device.c: es un archivo provisto como parte del framework que ofrece microchip, contiene funciones y definiciones que hacen al uso del dispositivo USB y el manejo de los datos asociados. usb_descriptors.c: es un archivo donde se encuentran los descriptores del dispositivo USB. También encontramos otros archivos que hacen de soporte a los primeros: HardwareProfile.h: contiene definiciones respecto del hardware utilizado usb_ch9.h: contiene definiciones y estructuras de datos que se pueden usar en un dispositivo USB, especificadas en el capítulo 9 de la norma. usb_common.h: contiene definiciones y estructuras de datos que se utilizaran con el SIE (Serial Interface Engine), que es el periférico USB incorporado en el chip. usb_device.h: son las definiciones, prototipos y estructuras de datos que se necesitan para trabajar con el archivo usb_device.c usb_function_audio.c: contiene todas las funciones, macros, definiciones, variables y estructuras de datos que se necesitan para trabajar con un Audio class device. usb_hal.h y usb_hal_pic18.h: como el framework que provee Microchip es genérico y sirve para trabajar con micros de distintas familias, estos archivos se ocupan de adaptar las definiciones al periférico especifico que contiene la familia PIC18, que es con el que estamos trabajando. - | Leandro Arcusin 13 Especificación de Diseño 2009 Funciones principales Función principal (main) La función llama a una función de configuración (InitializeSystem) y luego queda en un bucle infinito en el que se ejecutan 2 funciones. Una que se ocupa de las tareas del dispositivo USB y otra que se ocupa de procesar las entradas y salidas. Debe notarse que se usa el método de polling para atender la comunicación USB. Sin embargo, se deja toda una estructura de #defines e #ifdef para pasar de polling a interrupciones. InitializeSystem Llama a 2 funciones, MyInit() y USBDeviceInit(). La primera es la función de inicialización nuestra, que es explicada más abajo, la otra es una función parte del framework que inicializa el SIE (periférico USB) y será explicada en detalle más adelante. El modificador static en la función indica que la función no es implícitamente extern como lo son el resto de las funciones. USBDeviceInit Inicializa todos los registros, flags, variables y buffers que se utilizan para el manejo de la comunicación USB. MyInit Inicializa entradas y salidas, configura el timer 0 y el ADC. - | Leandro Arcusin 14 Especificación de Diseño 2009 ProcessIO Llama a BlinkUSBStatus y en caso de que se encuentre configurada la interface 0, alternativa 1 (la que tiene ancho de banda asociado), chequea si pasó el tiempo de muestreo (8 kHz) y agrega una muestra al buffer de audio luego de hacerla pasar por un filtro de media móvil. En caso de acumular 8 nuevas muestras (16 bytes) setea un flag que le indica a la función Microphone (ver abajo) que envie esas muestras por el endpoint de entrada. BlinkUSBStatus Función que genera un patrón de parpadeos en los LEDs de la placa según el estado del dispositivo USB. Estado DETTACHED ATTACHED POWERED DEFAULT ADDRESS CONFIGURED Código Ambos LEDs apagados Ambos encendidos Sólo el LED1 encendido Sólo el LED2 encendido LED1 parpadeando, LED2 apagado Ambos LEDs parpadeando alternativamente Este es el estado deseable de ver cuando el dispositivo ha sido conectado USBDeviceTasks Esta función es la máquina de estados principal que atiende a la comunicación USB. Es recomendado llamarla, según el framework, cada 100 µs al menos o a la velocidad que es esperan los data out desde el host. Dada la envergadura de esta función se adjunta una tabla de los estados posibles y acciones que ejecuta la función en cada uno de ellos. Estado Desconectado (físicamente) DETACHED_STATE ATTACHED_STATE Acción Deshabilita el SIE y pasa a DETACHED_STATE y retorna. Inicializa los registros del SIE y configura el módulo llamando a la macro SetConfigurationOptions (habilita pull ups, lo pone en full speed, habilita los ping pong buffers y habilita el internal receiver; además habilita algunas fuentes de interrupción). Pasa a ATTACHED_STATE. Si no hay una condición de SE0 (está reseteado o terminando de resetearse) borra las interrupciones, enmascara todas las interrupciones salvo la de Reset y la de Idle. Pasa a - | Leandro Arcusin 15 Especificación de Diseño 2009 POWERED_STATE DEFAULT_STATE POWERED_STATE. Si llega un Reset del bus, llama a USBDeviceInit() y luego apunta los Buffer Descriptor Tables (BDT) del endpoint 0 out a la look up table de configuración y se pone en DEFAULT_STATE. Si llega una interrupción de Transaction Completei lee el USTAT y analiza desde que endpoint llegó la comunicación. Si se trata del endpoint 0 llama a USBCtrlEPService() sino utiliza un handler para el evento pasándole una copia de USTAT como parámetro. Esto lo hace 4 veces pues USTAT es en realidad una FIFO de 4 bytes. USBCtrlEPService Si la transacción fue EP0 OUT apunta al BDT del endpoint correspondiente y prepara el puntero a la próxima transferencia de este tipo. Si EP0 Out era un SETUP PACKET entonces copia la trama entrante al buffer que ha sido definido para este tipo de paquetes: SetupPkt. Luego llama a USBCtrlTrfSetupHandler(). Si no era del tipo SETUP PACKET entonces llama a la función USBCtrlTrfOutHandler(). Si se trataba de un EP0 IN llama a USBCtrlTrfInHandler(). Microphone Si no hay una transmisión en progreso y el buffer de entrada ya tiene 16 nuevos bytes para enviar, entonces calcula cual es el primero de estos bytes a enviar y copia la trama de 16 bytes al buffer de salida. Una vez hecho esto llama la función USBTxOnePacket() pasándole como parámetros el endpoint de salida (EP1_Out), un puntero a los datos y la cantidad de bytes a transmitir. USBTxOnePacket Carga el BDT del endpoint que recibió como parámetro con el puntero que recibió, la cantidad de datos a enviar y las mascaras correspondientes según sea DATA0 o DATA1, y si esta trabajando con ping pong buffers (es decir, uno para los datos EVEN y otro para los ODD) también setea el próximo buffer. Devuelve un USB_HANDLE, que es un puntero, a la BDT que utilizó para luego poder conocer el estado de la comunicación. - | Leandro Arcusin 16 Especificación de Diseño 2009 USB callback functions Se trata de un conjunto de funciones previstas por el framework. Estas son invocadas ante determinados eventos del stack USB, como el SOF, errores, la instrucción del host de wake from suspend, etc. También implementan la atención a requests que no sean obligatorios como la orden de SETUP: SET_DESCRIPTOR. Comentaremos a continuación las funciones más importantes de esta serie, pues no todas ellas fueron implementadas. void USBCBInitEP(void) Inicializa el endpoint por el que se va a realizar el envio de audio. Esto ocurre luego de que el host envía un pedido de SET_CONFIGURATION. i Esta interrupción va a llegar cada vez que se termine una trama, para mayor claridad ver figura 17-9 del documento DS39632D de Microchip “Pic 18F4550 Datasheet” - | Leandro Arcusin 17