introducciÓn al code composer studio y al …elo314/archivos/intro_ccs_dsk_tms320c6713.pdf ·...
Post on 29-May-2018
217 Views
Preview:
TRANSCRIPT
UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA
Departamento de Electrónica
INTRODUCCIÓN AL CODE COMPOSER STUDIO Y AL DSK TMS320C6713
CURSO
LABORATORIO DE PROCESAMIENTO
DIGITAL DE SEÑALES
SIGLA
ELO - 314
PROFESOR
DR. MATÍAS ZAÑARTU
Valparaíso, Noviembre de 2013
Introducción
En este documento se han resumido las herramientas básicas que se usarán en este laboratorio para realizar
procesamiento digital de señales (DSP) en tiempo real sobre la plataforma DSK TMS320C6713. Esta introducción le
permitirá familiarizarse con el hardware, el ambiente de trabajo y las herramientas de software para programar, depurar y
verificar el código será cargado en el hardware. El contenido se ha sintetizado lo suficiente para otorgar una guía
introductoria al estudiante, sin saturarlo con exceso de información. Aquellos interesados en profundizar los temas
presentado podrán encontrar el material de referencia completo en la página web del la asignatura ELO385.
Sobre el Hardware
Durante el desarrollo del laboratorio se utilizará una tarjeta TMS320C6713 DSK (C6713 DSK) de Texas Intruments
(TI). La sigla DSK corresponde a Digital Starter Kit, lo cual se refiere a que el procesador de señales (TMS320C6713)
viene en una tarjeta con de una serie de componentes adicionales (por ejemplo, códec audio, distintos tipos de memoria,
control de periféricos, etc.), lo que transforma a la tarjeta DSK en una plataforma de iniciación y experimentación para el
desarrollo de aplicaciones de procesamiento de señales.
La tarjeta C6713 DSK, está conectada al puerto USB del PC corriendo en Windows. Instalado en el PC se encuentra el
software que permite compilar, ensamblar, depurar y cargar las aplicaciones de la tarjeta DSK. En la Fig. 1, se muestra
una vista superior de la tarjeta, con sus principales componentes. Para las entradas y salidas de señales análogas, el DSK
posee un CODEC STEREO AIC23, con una frecuencia de muestreo de hasta 96 kHz y una resolución de hasta 32
bits. Para fines prácticos, en este laboratorio el CODEC de audio será generalmente manipulado con un muestreo de 16
kHz por canal y con una resolución de 16 bits.
Para cada laboratorio los grupos de trabajo necesitarán estar equipados con un generador de señales y un osciloscopio,
tanto para verificar el procesamiento de sus algoritmos como para visualizar el procesamiento de las formas de onda.
Para algunos laboratorios se aconseja utilizar en lo posible un osciloscopio con analizador de espectro.
La Tarjeta C6713 DSK es controlada por el PC mediante el programa Code Composer Studio (CCS). Ésta es una
herramienta diseñada para agilizar y enriquecer el proceso de desarrollo para programadores que crean y prueban
aplicaciones de procesamiento digital de señales en tiempo real proveyendo herramientas para configuración,
construcción, depuración y análisis de programas. En las siguientes secciones se detalla el uso de este programa.
(a)
(b)
Fig. 1. (a) Vista superior tarjeta C6713 DSK; (b) Diagrama de bloques con los periféricos de la DSK y su interconexión.
Especificaciones técnicas generales
El DSP TMS320C6713 opera a 225 MHz otorgando hasta 1800 millones de instrucciones por segundo
(MIPs) y 1350 MFLOPS. Esta generación de DSP está diseñada para aplicaciones que requieren alta
precisión para aplicaciones tales como audio profesional, aplicaciones médicas y métodos de monitoreo y
diagnóstico. La tarjeta C6713 DSK está basada en la plataforma TMS320C6000 DSP e incluye las siguientes
características:
DSP TMS320C6713 de punto flotante y 32 bits
Soporte JTAG incorporado via USB.
Códec de audio estéreo (AIC23) de alta fidelidad de hasta 32 bits y 96 kHz.
Cuatro entradas de audio de 3.5mm para micrófono, entradas y salidas de línea estéreo, y audífonos.
4 LEDs e interruptores accesibles para el usuario.
Memoria Flash de 512KB y DRAM de 16MB.
Configuración de la tarjeta a través de un CPLD.
Puerto de expansión para módulos plug-in.
Interfaz estándar IEEE JTAG incorporada.
Puerto universal de alimentación de +5V
Code Composer Studio
El Code Composer Studio es el entorno de desarrollo integrado (IDE) para los DSP de Texas Instruments que permite
trabajar con lenguaje de programación ANSI C, además de incorporar herramientas de depuración y herramientas de
emulación e intercambio de datos con aplicaciones externas.
1. Conexión entre DSK y PC Antes de iniciar CCS se debe comprobar la correcta conexión de la tarjeta C6713 DSK y la comunicación con el
programa CCS. Para ello conecte la tarjeta DSK al PC, energícela y luego abra la aplicación CCS. Siempre
manipule con cuidado la tarjeta C6713 DSK. Si todo sale bien se debería abrir el ambiente de trabajo, si no, un mensaje
de error aparecerá. En ese caso verifique los pasos anteriores e intente nuevamente. El CCS y sus drivers deben estar
correctamente instalados en el PC. Una vez en el ambiente de trabajo de CCS, debe establecer la conexión con la tarjeta
mediante el menú DebugConnect. Si la conexión ha sido exitosa un mensaje de confirmación aparecerá en la esquina
inferior izquierda del ambiente de trabajo.
2. Creando y configurando un proyecto Para ejemplificar esta sección, descargue la carpeta de códigos pertenecientes al laboratorio 1 desde la página web del
curso. En el programa CCS seleccione el menú de ítems ProjectNew (ver Fig. 2). En Project Name escribir un
nombre al proyecto (por ejemplo Proy1), en Location seleccionar la carpeta de trabajo recién creada, en Project Type
seleccionar que la salida será un ejecutable (.out), en Target seleccionar la familia de DSP que se va a utilizar (en este
caso, TMS320C67XX) y presionar finalizar. Notará que CCS creó un archivo de proyecto “.pjt” donde se guardan la
configuración y referencias de los archivos usados en el proyecto. Es importante no modificar el contenido de este
archivo ya que ello seguramente hará que el proyecto no funcione adecuadamente.
En la barra de herramientas del proyecto (ver Fig. 3), se puede ver que el proyecto tiene por defecto dos modos de
compilación: Debug y Release. El primer modo sirve para depurar el código línea por línea, visualizando el valor de las
variables en distintas etapas del código. El segundo modo optimiza el código en tamaño y/o velocidad para su uso
directo como versión final.
Cada uno de estos modos de compilación se puede configurar seleccionando ProjectBuild Options, donde aparece
la ventana de la Fig. 4.
Fig. 2. Ventana de creación del Proyecto.
Fig. 3. Barra de herramientas de proyectos.
Lo principal aquí es seleccionar el tipo de DSP a compilar, seleccionando en el campo Target Version el DSP c671X.
Los encabezados y librerías propias de la DSK no son archivos de sistema incluidos en el Code Composer, por lo que
hay que indicarle al proyecto dónde está la ruta con las librerías correspondientes para los periféricos del DSK. Para
hacer esto, es necesario seleccionar ProjectBuild Options e ir a la categoría Preprocessor, y en el campo llamado
Include Search Path (-i) colocar
$(Install_dir)\c6000\dsk6713\include
que es la carpeta donde se encuentran los encabezados del DSK. Además, los encabezados incluidos necesitan definir el
tipo de DSP específico que se está usando, por lo que es necesario seleccionar ProjectBuild Options e ir a la
categoría Preprocessor, y en el campo llamado Pre-define Symbol (-d) colocar
DEBUG; CHIP_6713
Ahora se comenzará a agregar archivos al proyecto, para esto, desde el menú de ítems seleccionar ProjectAdd Files
to Project. Los programas necesarios para cada proyecto son:
Lab_XX.c : Contiene el código C para las actividades iniciales de cada laboratorio junto con las
funciones de inicialización de registros para el DSP. Este archivo será otorgado para
cada sesión de laboratorio y deberá ser modificado para realizar las actividades
requeridas.
Fig. 4. Ventana de “Build Options”.
lnk.cmd : Indica al compilador la configuración de la memoria del DSP, es decir, cantidad de
memoria interna y externa, para programa y datos, además de definir en qué secciones
se almacenarán ciertos tipos de variables, y vincula librerías externas al proyecto.
En el código fuente Lab_XX.c vienen incluidos algunos encabezados (“header files”) necesarios para que el código
compile:
dsk6713.h : Contiene las declaraciones en general para la configuración y control de los elementos
externos de la DSK.
dsk6713_aic23.h : Contiene las declaraciones para la configuración y control del códec de audio AIC23
dsk6713_led.h : Contiene las declaraciones para el manejo de los LED externos.
dsk6713_dip.h : Contiene las declaraciones para el manejo de los DIP switchs.
fastmath67x.h : Contiene las declaraciones para el uso de funciones matemáticas optimizadas para el
DSP.
Una vez cargados los archivos, se debe compilar y correr el programa mediante los siguientes pasos:
Desde el menú de ítems seleccionar ProjectRebuild All (o el ícono ), con esto, el programa CCS recompila,
reensambla y reenlaza todos los archivos del proyecto. Mensajes acerca del avance, advertencias, y errores en este
proceso se observan en la ventana inferior en el CCS.
Para cargar el programa en la tarjeta, seleccionar desde el menú de ítems FileLoad Program. Buscar el Archivo
Proy1.out en la carpeta Proy1\Debug y apretar el botón aceptar para cargar en la tarjeta. Esto abre automáticamente
una ventana con el código Assembler del programa seleccionado.
Para ejecutar el programa en el DSP seleccione DebugRun o presionando en el ícono . Ya que en la mayoría de
los casos el programa corre en un loop infinito, es necesario detenerlo utilizando DebugHalt o presionando en el
ícono . Es posible que al detener su programa se produzca un ruido audible que es producto de la interrupción
forzada del programa sin cerrar la comunicación con el códec dentro del loop infinito. En este caso, corra y detenga su
programa nuevamente.
En el caso de trabajar en un proyecto con múltiples archivos, no es necesario compilarlos todos cada vez que se ha
modificado alguno. El programa CCS ofrece la posibilidad de realizar una compilación incremental, es decir compila sólo
aquellos archivos que han sido modificados desde la última compilación, para esto haga click en el icono . Si el
archivo .out, ha sido cargado al menos una vez en la tarjeta, es posible usar la opción de File→Reload Program para
cargar el último programa compilado.
Al terminar su sesión de trabajo, asegúrese de que su programa esté detenido mediante DebugHalt. Termine la
conexión DebugDisconnect y cierre CCS. Una vez realizados estos pasos, desconecte el puerto USB del PC y
remueva la fuente de alimentación de la tarjeta DSK. Siempre manipule con cuidado la tarjeta C6713 DSK.
3. Visualización de variables
Watch Windows
Cuando se desarrollan o prueban programas es común tratar de verificar el valor de una variable durante la ejecución de
un programa, para esto el programa CCS cuenta con Breakpoints y Watch Window para observar dichos valores. Los
Breakpoints son ‘banderas’ que indican al DSP detener la ejecución del programa en el punto indicado. Esto permite,
por ejemplo, conocer el valor de una variable justo después de la ejecución de algún algoritmo, de modo que se pueda
revisar el correcto funcionamiento de la función o procedimiento que implementa dicho algoritmo, o verificar el
correcto llamado a alguna rutina de interrupción. Para agregar un Breakpoint basta con hacer doble click en la línea del
programa en C o en Assembler, otra forma, es ubicar el cursor en la posición deseada y seleccionar el icono de la
barra de herramientas. Un punto rojo indicará la presencia del Breakpoint. Para quitar un Breakpoint se repite el
procedimiento descrito anteriormente.
Las Watch Window ( ) son ventanas que permiten visualizar el valor de las diferentes variables utilizadas en el
programa (recuerde que las variables locales existen sólo dentro de las funciones que las crean). La Fig. 5 muestra una
Watch Window típica.
La primera columna indica el nombre (o dirección) de la variable a visualizar. La segunda muestra el valor de la variable
(en rojo si ha cambiado su valor recientemente). La tercera indica el tipo de variable visualizada (int, long, unsigned,
float, etc.). Finalmente la cuarta columna permite seleccionar el formato de la visualización de la variable (decimal,
hexadecimal, char, etc.). Para agregar una variable en la lista, basta con hacer doble click al final de ella y escribir el
nombre de la variable. Recuerde que en C una variable existe sólo dentro de la función donde es definida, salvo en el
caso de las variables globales (es decir, cree variables globales para visualizar datos y gráficos). Para ejecutar el programa
en el DSP seleccione DebugRun o presionando en el ícono , el programa se ejecutará hasta encontrar un
breakpoint o llegar al final de la ejecución. Otra opción es seleccionar DebugAnimate ( ), al igual que Run al
Fig. 5. Watch Window.
llegar a un Breakpoint el programa se detendrá, pero continuará automáticamente pasada una cantidad de tiempo
indicada en OptionCustomizeAnimate Speed. En caso que los datos no se actualicen, verifique que
ProyectBuild optionsCompilerGenerate debug info esté configurada como Full Symbolic Debug.
Gráficos
Si bien las Watch Windows son muy útiles ya que permiten visualizar y modificar variables internas del DSP, cuando se
trabaja con variables de tipo arreglo con un alto número de elementos, la visualización en forma de tabla puede no ser la
más recomendable, siendo preferible un formato gráfico. Esto se logra a través de ViewGraphTime/Frequency,
apareciendo la ventana indicada en la Fig. 6:
Las opciones más importantes de configuración de gráficos son:
Display Type : Gráfico simple, doble, transformada de Fourier, entre otras.
Start Address : Dirección del primer dato (Puede usar el nombre de la variable asociada al
arreglo ya que en C el nombre del arreglo coincide con la dirección inicial
del mismo).
Acquisition Buffer Size : Cantidad de datos a ser tomados a partir de la dirección base.
Index Increment : Separación entre los datos a tomar.
Display Data Size : Cantidad de datos a mostrar en el gráfico.
DSP Data Type : Formato de los datos a ser representados: int, long, float.
Sampling Rate (Hz) : Tasa de muestreo en frecuencia del arreglo de datos para representar datos
en función del tiempo (en vez del número de muestras)
Fig. 6.a) Panel de propiedades para un gráfico; b) Gráfico
4. Uso del Códec de Audio y Generación de Señales
La DSK TMS320C6713 utiliza el códec estéreo de altas prestaciones de Texas Instruments AIC23 (chip TLV320AIC23),
el cual permite muestrear señales de audio análogas provenientes de una línea de entrada o micrófono y convertirlas en
datos digitales para ser procesados por el DSP, y permite convertir datos digitales desde el DSP en señales de audio
análogas que salen por la línea de salida y de audífonos para poder medir y escuchar esas señales, además de poseer un
canal de comunicación digital exclusivamente para configurar el códec, según los requerimientos del usuario.
Entre las características del códec, se encuentra el funcionamiento a tasas de muestro de señales de entre 8 kHz y 96 kHz
con altas razones de señal-ruido (SNR>90 dB) gracias al uso de ADCs y DACs de tipo sigma-delta, trabajando con
tensiones alternas de 1.41 V de amplitud (1 VRMS), y se puede configurar el códec para controlar el volumen de los
canales, intercambiar la lectura entre el canal de micrófono y la línea de entrada, cambiar el sobremuestreo de los
conversores, etc. Además, posee un preamplificador polarizado para micrófonos electret y una salida de audífonos para
manejar impedancias de 16 Ω y 32 Ω.
El códec se comunica con la DSP a través del puerto buffer serial multicanal (McBSP) utilizando dos canales, uno para
cambiar los registros de configuración del códec, y otro para enviar y recibir los datos digitales de audio entre el DSP y el
códec, tal como se aprecia en la Fig. 7
Los conectores de audio para el códec son los conocidos jacks stereo de 2.5mm, y la señal de audio tiene acoplamiento
alterno (AC), además de poseer polarizador para la entrada de micrófono y filtros pasabajos pasivos entre el códec y los
jacks de audio.
Fig. 7: Diagrama de bloques del códec AIC23
Manejo del códec de audio a través del CCS
La finalidad del laboratorio de DSP es poder leer y escribir señales de audio utilizando el código C generado y cambiado
para cada experiencia. Para ello, es necesario poder controlar los registros de configuración del códec y poder enviar y
recibir datos digitales para manipularlos con el DSP. Para ello, se utilizará una interfaz de programación de aplicaciones
(API) entregada por el fabricante para simplificar al máximo la inicialización, configuración y manejo en tiempo real del
códec, utilizando funciones y procedimientos debidamente soportados y documentados.
La “Board Support Library” (BSL) es la biblioteca encargada de proveer el código C necesario para manejar todos los
dispositivos externos de la DSK, incluyendo el códec de audio. La biblioteca específica para este DSK se llama
dsk6713bsl.lib, mientras que los encabezados necesarios para manejar específico para el códec se llaman
dsk6713.h y dsk6713_aic23.h, y todos ellos se encuentran en la ruta $(TI_DIR)\C6000\dsk6713, la
cual no corresponde a una ruta de sistema original, por lo que se deben tomar las medidas correspondientes para poder
incluir la biblioteca y los encabezados en el proyecto.
Las funciones de manejo del códec contenidas en la biblioteca son las siguientes:
DSK6713_AIC23_CodecHandle DSK6713_AIC23_openCodec(int id, DSK6713_AIC23_Config *Config);
Inicializa y configura el códec simbolizado por la variable id (0 en este caso), y utilizando la configuración contenida en
el puntero *Config, retorna una variable de identificación del códec del tipo DSK6713_AIC23_CodecHandle que
permitirá manipular el resto de las funciones.
void DSK6713_AIC23_rset(DSK6713_AIC23_CodecHandle hCodec, Uint16 regnum, Uint16 regval);
Permite cambiar un registro de configuración regnum específico del códec identificado como hCodec (variable
inicializada utilizando la función anterior) al valor especificado en regval.
Uint16 DSK6713_AIC23_rget(DSK6713_AIC23_CodecHandle hCodec, Uint16 regnum);
Adquiere el valor del registro regnum del códec identificado como hCodec.
void DSK6713_AIC23_config(DSK6713_AIC23_CodecHandle hCodec, DSK6713_AIC23_Config *Config);
Permite configurar de una vez todos los registros del códec identificado como hCodec.
void DSK6713_AIC23_setFreq(DSK6713_AIC23_CodecHandle hCodec, Uint32 freq);
Permite ajustar la frecuencia de muestreo del códec identificado como hCodec a un valor determinado, dentro de
ciertos valores permitidos.
Int16 DSK6713_AIC23_write(DSK6713_AIC23_CodecHandle hCodec, Uint32 val);
Escribe una palabra entera en la salida del códec hCodec, entregando un 1 como resultado si se termina de escribir
satisfactoriamente en el códec.
Int16 DSK6713_AIC23_read(DSK6713_AIC23_CodecHandle hCodec, Uint32 *val);
Lee la señal de entrada del códec hCodec y la deja en la dirección *val, entregando un 1 como resultado si se termina
de escribir satisfactoriamente en el códec.
void DSK6713_AIC23_outGain(DSK6713_AIC23_CodecHandle hCodec, Uint16 outGain);
Ajusta la ganancia de los canales de salida del códec hCodec.
void DSK6713_AIC23_loopback(DSK6713_AIC23_CodecHandle hCodec, Int16 mode);
Habilita el modo “loopback” (transferir lo leído en el canal de entrada del códec directamente en el canal de salida) si
mode es TRUE.
void DSK6713_AIC23_mute(DSK6713_AIC23_CodecHandle hCodec, Int16 mode);
Deshabilita las líneas de entrada del códec si mode es TRUE.
void DSK6713_AIC23_powerDown(DSK6713_AIC23_CodecHandle hCodec, Uint16 sect);
Apaga las distintas secciones del códec (ADC, DAC, reloj, etc.) desde la variable sect.
void DSK6713_AIC23_closeCodec(DSK6713_AIC23_CodecHandle hCodec);
Libera al códec y finaliza su configuración y manejo.
Como se mencionó anteriormente, el códec puede ser configurado mediante un canal de comunicaciones digital
exclusivamente habilitado para ello, a través de 11 registros de 9 bits con distintos valores según las diferentes
configuraciones que dispone el códec. Los registros son los listados en la Tabla I, y están detallados en el manual del
códec disponible en la página web del ramo.
Entre los registros importantes, está el Analog audio path control (registro 0000101 → regnum = 0x0004), que
permite configurar el manejo de datos análogo entre los distintos canales de entrada y salida del códec. Por defecto este
registro tiene un valor 000010010 → regval= 0x0012 el cual habilita la entrada de línea. Asignando a este registro el
nuevo valor 000010101 → regval= 0x0015 se selecciona y activa el micrófono con una ganancia de 20 dB. Para
mayores detalles consulte el manual del codel AIC23
Por defecto, existe una configuración definida en una constante del encabezado dsk6713_aic23.h llamada
DSK6713_AIC23_DEFAULTCONFIG que permite la utilización de las líneas de entrada y salida a máxima ganancia, con
una tasa de muestreo de 48 kHz, etc. Para cambiar la configuración se puede inicializar el códec con otra constante
distinta a la antes mencionada, o cambiar solo el registro que uno desea cambiar utilizando la función
DSK6713_AIC23_rset.
Las frecuencias de muestreo disponibles están en constantes definidas en el encabezado dsk6713_aic23.h, y son las
siguientes:
DSK6713_AIC23_FREQ_8KHZ DSK6713_AIC23_FREQ_16KHZ DSK6713_AIC23_FREQ_24KHZ DSK6713_AIC23_FREQ_32KHZ DSK6713_AIC23_FREQ_44KHZ DSK6713_AIC23_FREQ_48KHZ DSK6713_AIC23_FREQ_96KHZ
Por defecto, el códec debe escribir/leer los dos canales para mantener la tasa de muestreo, desde un buffer serial de
datos de 32 bits, donde los primeros 16 bits corresponden al canal izquierdo y los siguientes 16 bits para el canal
derecho. (ver Fig. 8).
Tabla I: Registros de configuración disponibles en el códecN° Dirección Descripción del Registro
1 0000000 Left line input channel volume control
2 0000001 Right line input channel volume control
3 0000010 Left channel headphone volume control
4 0000011 Right channel headphone volume control
5 0000100 Analog audio path control
6 0000101 Digital audio path control
7 0000110 Power down control
8 0000111 Digital audio interface format
9 0001000 Sample rate control
10 0001001 Digital interface activation
11 0001111 Reset Register
Fig. 8: Modo de lectura/escritura por defecto del códec
Lo anterior significa que las funciones DSK6713_AIC23_read y DSK6713_AIC23_write deben escribirse dos veces
contiguamente en cada ciclo del DSP con el fin de trabajar a la frecuencia de muestreo configurada, en donde la primera
función lee/escribe en el canal izquierdo y la segunda función lee/escribe el canal derecho.
Como se debe leer/escribir variables enteras de 16 bits (incluyendo el signo en el bit más significativo, i.e.., short),
pero la DSP manipula comúnmente variables de punto flotante (i.e., float), es necesario hacer una conversión de tipo
(typecasting) de manera de poder manejar adecuadamente las variables entre el DSP y el códec. Por ejemplo, si se trabaja
con variables de punto flotante normalizadas (de amplitud unitaria como máximo), la ganancia entre la variable interna
de punto flotante y la variable de lectura/escritura del códec debe tener un valor de 0x7FFF (32767 en decimal o 15 bits
en 1), de manera de utilizar el máximo rango del códec considerando el bit más significativo como signo. Tenga cuidado
también de mantener la estructura float en sus operaciones aritméticas dentro del código (e.g., si tiene que dividir X
por dos utilice X/2.0 en vez de X/2).
Ejemplo simple
El siguiente código fuente de ejemplo (.c) permite adquirir las señales de los dos canales de la línea de entrada, sumarlas y
restarlas, y entregar la diferencia de las señales de entrada por el canal izquierdo, mientras que por el canal derecho se
obtiene la suma entre esas dos señales, todo lo anterior utilizando la configuración por defecto del códec, pero a una
frecuencia de muestreo de 24 kHz.
El código muestra primero las lecturas de los canales izquierdo y derecho con la función correspondiente dentro de una
sentencia condicional while, para asegurarse que la siguiente línea de código se efectúe solo cuando el canal se haya
leído satisfactoriamente. Después, se acondicionan las señales leídas desde el códec a un valor flotante unitario, por lo
que se divide el entero adquirido por 32767 (15 bits o 0x7FFF en hexadecimal) y se hace un “typecasting” primero a
short (entero de 16 bits) y después a flotante. Con las variables flotantes acondicionadas, se procede a la operatoria,
para después reacondicionar las variables a entero, multiplicando el flotante por 32767 y efectuando un “typecasting” a
short. Cabe destacar que es necesario asegurar de alguna manera de que los flotantes no sobrepasen el valor unitario
para que no ocurran saturaciones u “overflows”. Finalmente, se procede a escribir la variable acondicionada en el códec,
usando la misma técnica de la sentencia while para asegurar que se efectué efectivamente la escritura en el códec antes
de pasar a la siguiente instrucción.
#include <dsk6713.h> #include <dsk6713_aic23.h> DSK6713_AIC23_Config el_config = DSK6713_AIC23_DEFAULTCONFIG; DSK6713_AIC23_CodecHandle el_handle0; unsigned int int_in_r,int_in_l,int_out_r,int_out_l; float float_in_r,float_in_l,float_out_r,float_out_l; void main()
// Initialize Board Support Library DSK6713_init(); //open the <id> codec in el_handle0 el_handle0 = DSK6713_AIC23_openCodec(0, &el_config); //Set Freq of AIC23 Codec DSK6713_AIC23_setFreq(el_handle0, DSK6713_AIC23_FREQ_24KHZ); while(1) //Left channel read while(!DSK6713_AIC23_read(el_handle0, &int_in_l)); //Right channel read while(!DSK6713_AIC23_read(el_handle0, &int_in_r)); //typecasting - unitary float variable float_in_l=((float)(short)(int_in_l))/32767.0; float_in_r=((float)(short)(int_in_r))/32767.0;
//signal manipulation float_out_l=float_in_r-float_in_l; float_out_r=float_in_r+float_in_l; //typecasting – full range 16-bit signed integer int_out_l=(short)(32767*float_out_l); int_out_r=(short)(32767*float_out_r);
//Left channel write
while(!DSK6713_AIC23_write(el_handle0, int_out_l)); //Right channel write while(!DSK6713_AIC23_write(el_handle0, int_out_r));
Efectos de los ADC/DAC
En la Fig. 9 se puede apreciar el gráfico de respuesta al colocar una señal sinusoidal de 6 Vp-p y 500 Hz de frecuencia
solo en el canal izquierdo, apreciando que en la salida, tanto el canal izquierdo como el derecho, muestran la misma
sinusoidal pero con una amplitud de 2.8 Vp-p (la máxima) y desfasada respecto de la entrada. El desfase es debido a que
el códec posee tanto en la entrada como en la salida filtros digitales antialiasing que desfasan la señal linealmente con la
frecuencia; mientras que la diferencia de amplitud es debido al acondicionador análogo que le da el offset a la señal de
entrada para que su rango de entrada sea de 0 a 3V.
En la Fig. 10 se pueden ver las señales que entran y salen directamente del códec, apreciando que aquí si conservan la
amplitud entre la entrada y la salida, pero conservándose la diferencia en la fase. Los acondicionadores análogos entre el
códec y los jacks estéreo no provocan una distorsión significativa en la fase.
Fig. 9: señales de E/S del jack estéreo, usando el código de ejemplo
Lout, Rout
Lin
Finalmente, en la Fig. 11 se puede apreciar el efecto del cambio de fase en función de la frecuencia al utilizar una
sinusoidal de 1 kHz de frecuencia, pues la señal de entrada al chip no tiene la misma fase que la mostrada en la figura
anterior.
Fig. 10: señales de salida del jack estéreo y de E/S directamente del códec AIC23, usando el código de ejemplo
Fig. 11: señales de salida del jack estéreo y de E/S directamente del códec AIC23, usando el código de ejemplo
Lout, Rout
Chip_Lin
Chip_Lout
Lout, Rout
Chip_Lin
Chip_Lout
5. Configuración del “linker”
El “linker” es un archivo .cmd que debe ser incluido en cada proyecto de CCS y que se utiliza para unir el código
assembler creado en la compilación y usado como un Common Object File Format (COFF) con otros archivos de
librería, además de configurar el manejo y mapeo de las secciones de memoria de las distintas variables e instrucciones
del código; todo ello para crear el ejecutable a grabarse en el DSP. Por lo general no tendrán que hacer cambios al
archivo que se les dará por defecto para los proyectos de las distintas experiencias, pero de todas formas se da cuenta
aquí una breve descripción de las componentes que conforman el linker. A continuación se presenta el código por
defecto del linker usado en esta asignatura.
-heap 0x400
-stack 0x400
-IC:\CCStudio_v3.1\c6000\dsk6713\lib
-ldsk6713bsl.lib
-lcsl6713.lib
-lfastmath67x.lib
-lrts6700.lib
MEMORY
/* 64 Kbytes of internal RAM, equivalent to 16K of 32bit instructions */
vecs: o= 00000000h l= 00000200h /* The first 512 bytes (128 instr.) */
/* are reserved for the vector table */
IRAM: o= 00000200h l= 0000FFE0h /* The remaining IRAM is usable for program. 63.5K bytes */
SDRAM: o = 80000000h l = 01000000h /* DSP 6713 */
/*SDRAM: o = 80000000h l = 00400000h /* DSP 6711 */
SECTIONS
".vectors" > vecs
.cinit > IRAM
.text > IRAM
.stack > IRAM
.bss > IRAM
.const > IRAM
.data > IRAM
.far > SDRAM
.switch > IRAM
.sysmem > IRAM
.tables > IRAM
.cio > IRAM
En la etapa de configuración, los parámetros –heap y –stack definen respectivamente al espacio de memoria
dinámica (usando malloc()) y la reservada para variables internas. El parámetro con –I define el directorio
alternativo donde existen bibliotecas de sistema, el cual es el caso de las bibliotecas del fabricante para el DSK6713, y el
parámetro con -l define las bibliotecas adicionales que el código necesita para operar. En este caso, se deben agregar los
siguientes archivos de bibliotecas:
- dsk6713bsl.lib: Agrega las funciones definidas específicamente para los elementos del DSK (LEDs,
DIP switches, Codec AIC23, Memoria Flash).
- csl6713.lib: Agrega las funciones para el manejo de periféricos del DSP (necesario si se usa la
biblioteca anterior)
- fastmath67x.lib: Agrega las funciones correspondientes a las operaciones matemáticas optimizadas
para el DSP.
- rts6700.lib: Agrega las funciones básicas de ANSI C acondicionadas para el DSP.
En la etapa de memoria, se configura el mapeo de direcciones de memoria física en distintas partes, definiéndolas con
distintos nombres. En este caso, se tienen 3 secciones de memoria física:
- vecs: Espacio de memoria para vectores de interrupción y otras funciones predefinidas.
- IRAM: RAM interna del DSP (de mayor velocidad)
- SDRAM: RAM externa al DSP de 16MB.
Finalmente, en la etapa de “sections” se definen en qué espacio de memoria física serán mapeadas los diversos tipos de
datos (secciones) del programa
- .cinit: Tablas para inicializar variables y constantes
- .const: Constantes creadas con la macro “#define”
- .switch: Tablas con las expresiones que usan “switch-case”
- .bss: Espacio no inicializado reservado para variables globales y estáticas
- .stack: Espacio reservado para el “stack” de sistema (variables locales y argumentos de funciones)
- .data: Reserva espacio para datos no inicializados en general
- .far: Espacio reservado para tipos de datos que son declarados como “far”.
- .sysmem: Espacio reservado para memoria “heap” dinámica (usando “malloc()”)
- .cio: Espacio para funciones “stdio” (como “printf()”)
top related