Professional Documents
Culture Documents
OBJETIVO: En esta práctica se presentarán los primeros pasos para trabajar con el DSP TSM320C6713
de Texas instruments mediante la utilidad de diagnóstico DSK para el testeo de la tarjeta completa
(diagnóstico del USB, herramienta de emulación, DSP, memoria externa, códecs, leds y dipswitches),
así como la generación de código e implementación de un algoritmo en C.
MATERIAL:
DESARROLLO:
En la figura 1.1 se muestran los estados de la rutina de prueba a la tarjeta, cada combinación
de LEDS encendidos representan una prueba distinta. La prueba puede durar varios segundos
en la segunda prueba (External SDRAM test). Puede tomar un rato en probar toda la memoria
SDRAM incluida en el DSK. Si toma más de 15-30 s, puede haber un problema.
1. Ejecutar Setup CCStudio v3.x para seleccionar la tarjeta (emulador o tarjeta física) a utilizar
para el desarrollo de las prácticas como se muestra en la figura 1.2
5. Una vez creado el nuevo proyecto, se deberá crear un nuevo archivo de configuración CDB
que incluirá las especificaciones de la tarjeta de desarrollo así como las configuraciones
necesarias que haya que implementar en dicha tarjeta, para ello se deberá seleccionar como
aparece en la figura 1.4
Una vez seleccionado, deberá guardar el archivo y añadirlo al proyecto para que éste tenga efecto
como se muestra en la figura 2.2 haciendo clic derecho sobre la carpeta DSP/BIOS Config.
6. Se deberá crear un nuevo archivo con extensión .c como se muestra en la figura 1.7 donde
se editará el codigo de nuestro primer programa.
7. Deberá añadir el archivo con extensión .c al proyecto posicionando el cursor sobre la carpeta
source del proyecto de nombre Source y presionar el botón derecho como aparece en la
figura 1.8
/*
* ========================= main.c Ver 1.0 =============================
*INSTITUTOPOLITÉCNICONACIONAL
* ======================================================================
* UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA CAMPUS ZACATECAS
* UNIDAD DE APRENDIZAJE: PROCESADOR DIGITAL DE SEÑALES
* PRACTICA 1: Primeros pasos con un DSP y CCS
* PROFESOR:
* ALUMNO: FULANITO DE TAL...
* DESCRIPCIÓN:
*/
/*
* ======== Include files ========
*/
/*
* ======== Declarations ========
*/
/*
* ======== Prototypes ========
*/
/*
* ======== Global Variables ========
*/
/*
* ======== main ========
*/
int main()
{
// Código...
*/
Código C a implementar
Se programarán un par de ejemplos para ilustrar algunas de las características de CCS y la tarjeta DSK.
El objetivo de estos ejemplos es familiarizarse con las herramientas de software y hardware que serán
usadas en esta asignatura.
Ejemplo1: Este ejemplo genera una forma de onda senoidal analoga usando un método de busqueda
de tablas. Ilustra algunas de las caracteristicas de CCS para editar archivos fuente, creación de
proyecto, acceso de las herramientas de generación de código, y ejecución de programa en el
procesador C6713.
En los Apendices de este documento se encontrarán los codigos C necesarios para esta practica.
Procedimiento:
En la rutina sine.c se tiene codificado un filtro IIR usando algunas condiciones iniciales que se
proporcionan con la llamada a SINE_init(). Pasamos el tono que queremos generar y la velocidad con
la que vamos a muestrear ese tono. También pasamos una estructura SINE_Obj que es usado por el
generador senoidal para mantener un seguimiento de la información que se necesite. Para realmente
generar valores senoidales, se llama a la función SINE_blockFill(). Cada vez que esta rutina es llamada,
llenará el búfer con 32 valores nuevos de datos senoidales. Más adelante se graficará este búfer para
ver si la onda se genera.
Usando los ajustes en estas cuatro pestañas, podrá controlar la compilación y vinculación de su
proyecto a cualquier grado que se deseé. Por ejemplo: puede escoger varios niveles de optimización
de código. Por el momento dejaremos esta opción en apagado (None).
Se observan reflejadas en el cuadro de dialogo de la figura 1.9, todas las opciones seleccionadas.
Ahora que todos los archivos han sido añadidos a nuestro proyecto, es tiempo de crear el programa
de salida ejecutable (el archivo .out). Este se auto nombrará audio_sine.out.
La ventana de salida de compilación se muestra en la parte baja de la ventana del CCS. Revise la
información del progreso de compilación. Si observa “0 Errors, 0 Warnings, 0 Remarks”, la
compilación se habrá realizado con éxito.
Si se encuentra ativa la opción Program Load After Build, el programa deberá descargarse al DSK por
el depurador del CCS. Si el programa no lo carga, seleccione: File ® Load Program y busque en la
carpeta Debug el archivo audio_sine.out
Ahora que hemos cargado el programa usaremos algunas herramientas para mirarlo más de cerca.
Seleccione y resalte la variable gBuf en la ventana main.c. De click derecho en gBuf y escoja Add to
Watch Window.
Otra manera de ver los valores de la memoria es usar una ventana de memoria. Seleccione View®
Memory y escriba lo siguiente:
Title = gBuf
Address = gBuf
Q-Value = 0
Dirección de gBuf:____________________________________________
• Dirección = gBuf
• Longitud = 16
• Fill pattern = 0
Click OK. El búfer fue 32 valores de 16-bit de longitud (fueron definidos como “shorts” en el código
C). La función de memoria Fill llena localidades de enteros o 32-bits. Así que solo necesitamos llenar
16 locaciones de 32-bits del arreglo de 32x16. Mantenga esto en mente cuando quiera inicializar un
area de memoria. Podria terminar llenando algo que no debería. Crearemos un archivo GEL que llena
esto automáticamente.
Establezca un punto de paro en el loop while main(). Los puntos de paro pueden colocarse en 3
formas distintas. Escoja el que más le guste.
Los valores en rojo son los valores que han cambiado en la última actualización, que ocurre cuando
el código llega al punto de paro.
Mientras una ventana no sea maximizada en CCS, puede ser movida a cualquier locación que prefiera.
Las ventanas pueden flotar o fijarse. Seleccione Watch Window, click derecho en la parte superior y
seleccione Float In Main Window. Después, muevala alrededor. Trate de fijarla nuevamente. Cuando
tenga las ventanas exactamente donde quiera, guarde su espacio de trabajo seleccionando: File®
Workspace® Save Workspace As, escoja un nombre y guardelo en cualquier ubicación que guste.
Para cargar un espacio de trabajo seleccione: File® Workspace® Load Workspace.
La ventana Watch Window es una gran manera de ver los datos en CCS. Pero, ¿puede decir si esto es
en realidad una señal senoidal? ¿No sería mejor ver los datos graficados?. Seleccione:
Podremos realizar diferentes graficas: tiempo frecuencia, magnitud FFT, tiempo dual, constelación,
etc. La señal senoidal que generamos fue una onda a 256Hz muestreada a 8KHz. Se revisará si es
posible graficar la magnitud FFT para ver la frecuencia fundamental de la onda senoidal.
Click derecho en el display gráfico de gBug y seleccione Properties. Cambie el tipo del display a FFT
Magnitude y seleccione OK. Desplegará algo como la figura siguiente:
Borre cualquier punto de paro que haya colocado, puede hacerlo de diferentes maneras:
/*
* ========================= main.c =============================
*INSTITUTOPOLITÉCNICONACIONAL
* ======================================================================
* UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERÍA CAMPUS ZACATECAS
* UNIDAD DE APRENDIZAJE: PROCESADOR DIGITAL DE SEÑALES
* PRACTICA 1: Primeros pasos con un DSP y CCS
* PROFESOR:
* ALUMNO:
* DESCRIPCIÓN: Genera una forma de onda senoidal análoga
*usando un método de búsqueda de tablas.
*/
/*
* ======== Include files ========
*/
#include "sine.h"
/*
* ======== Declarations ========
*/
#define BUFFSIZE 32
/*
* ======== Prototypes ========
*/
/*
* ======== Global Variables ========
*/
short gBuf[BUFFSIZE];
SINE_Obj sineObj;
/*
* ======== main ========
*/
void main()
{
SINE_init(&sineObj, 256, 8 * 1024);
/*
/*
* =============sine.h================
*Este archivo contiene los prototipos para todas las funciones
*contenidas en sine.c
*/
#ifndef SINE_Obj
typedef struct {
float freqTone;
float freqSampRate;
float a;
float b;
float y0;
float y1;
float y2;
float count;
float aInitVal;
float bInitVal;
float y0InitVal;
float y1InitVal;
float y2InitVal;
float countInitVal;
} SINE_Obj;
#endif
// ===============Prototypes ====================
void SINE_init(SINE_Obj *sineObj, float freqTone, float freqSampRate);
void SINE_blockFill(SINE_Obj *sineObj, short *buf, int len);
void SINE_addPacked(SINE_Obj *sineObj, short *inbuf, int length);
void SINE_add(SINE_Obj *sineObj, short *inbuf, int length);
static short sineGen(SINE_Obj *sineObj);
static short sineGen(SINE_Obj *sineObj);
static float degreesToRadiansF(float d);
void copyData (short *inbuf, short *outbuf ,int length);
if(freqTone == NULL)
sineObj->freqTone =200;
else
sineObj->freqTone =freqTone;
if(freqSampRate == NULL)
sineObj->freqSampRate =48 * 1024;
else
sineObj->freqSampRate =freqSampRate;
sineObj->a = 2 * cosf(rad);
sineObj->b = -1;
sineObj->y0 = 0;
sineObj->aInitVal = sineObj->a;
sineObj->bInitVal = sineObj->b;
sineObj->y0InitVal = sineObj->y0;
sineObj->y1InitVal = sineObj->y1;
sineObj->y2InitVal = sineObj->y2;
sineObj->countInitVal = sineObj->count;
}
for(i=0;i<len;i++) {
buf[i] = sineGen(sineObj);
}
}
return((short)result);
}