introducciÓn al code composer studio y al …elo314/archivos/intro_ccs_dsk_tms320c6713.pdf ·...

19
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

Upload: dinhkhanh

Post on 29-May-2018

214 views

Category:

Documents


0 download

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()”)