Vous êtes sur la page 1sur 8

TP 1 : échantillonnage d’un signal d’entrée

Introduction :

Découverte de Code Composer Studio DSP TMS320C Objectifs du TP Le but de ces manipulations est de découvrir
l’environnement de programmation CCS (Code Composer Studio) et la carte de développement TMS320C5416. Un accent
sera mis sur la compréhension de l’organisation de la mémoire interne au DSP.

Pour démarrer les manipulations :


Les connexions et la mise sous tension doit se réaliser dans l’ordre suivant :
Mettre d’abord sous tension le bloc d’alimentation 5volts puis le brancher sur la carte DSK.Mettre la carte DSK sous
tension (non connectée au PC)
Votre PC Portable étant sous tension, brancher le câble USB et la carte DSK.
Dans le cas où le Codec de la carte est utilisé (prise jack). Ces prises doivent être branchées avant la mise sous tension de la carte.
- Nous vous conseillons de sauvegarder votre travail en fin du TP dans votre compte pour le TPSuivant ;
- Ouvrir l’environnement de travail, Code Composer Studio , en cliquant sur l’icône (agr
Pour tester le bon 2onctionnement de la carte DSP, vous pouvez lancer un programme dediagnostique qui est
installé en même temps que CCS.

Pour ouvrir un exercice :


(si vous utilisez l’environnement de travail prédéfini, ce chargement est automatique)
- Menu Project open/ c:/ti/myproject/e.n.mak ;
- Pour effacer d’éventuels breakpoint. Debug/breakpoints/Delete all ;
- Menu File/load program/../e.n.out ;
-
Ouvrir la fenêtre du « main » (dans l’arborescence du projet).
Pour modifier un exercice :

- Menu Project open/ c:/ti/myproject/e.n.mak ;


- Pour effacer d’éventuels breakpoint. Debug/breakpoints/delete all ;
- Ouvrir la fenêtre du « main » (dans l’arborescence du projet) ;
- Modifier les fichiers que vous souhaitez modifier ;
- Project/rebuild all (compilation+link) ;
- Menu File/load program/../e.n.out..

Vous avez chargé sur la carte votre e.ercice modifié et vous pouvez le tester.
Pour recréer l'environnement de travail et analyser l'exercice
Faire du Pas à pas en utilisant l’icône {}
Mettre un point d’arrêt et un probe point (click droit)sur l’instruction
BC…loop,AC1 !=0 .
Faire Debug /Animate

Vous pouvez visualiser le fonctionnement du programme en utilisant :


- Le mode Pas à Pas (icône flèche entrant entre 2 {} à gauche de l’écran). ;
L’affichage de fenêtres registres, program et data memory ou graphique dans le menu Vie
Les points d’arrêt :

Durant le développement ou le test des programmes, on doit souvent contrôler la valeur d'une variable pendant
l'exécution du programme. Ceci peut être réalisé en utilisant des points d'arrêt (BREAKPOINT) et des « Watch
Windows ».

Les fonctions :

Pour ajouter une simple fonction en C qui fait la somme des valeurs, nous pouvons simplement passer le
pointeur par l'alignement de valeur et avoir un retour de nombre entier. Pour l'instant, considérant que nous
n'utilisons pas l'assembleur, ce qui nous concerne n'est pas comment les variables sont additionnées, mais plutôt
combien de temps il faut pour exécuter l'opération.

#include "fir.h" // M is defined inside by #define M 100

#include <math.h>

La carte DSK :

#include "dsk6713_aic23.h" //codec-DSK support file

Uint32 fs=DSK6713_AIC23_FREQ_32KHZ; // set sampling rate : 8k, 16k, 32k, 44.1k, 48k, 96k

//Uint32 fs=DSK6713_AIC23_FREQ_16KHZ;

//Uint32 fs=DSK6713_AIC23_FREQ_32KHZ;

#define DSK6713_AIC23_INPUT_MIC 0x0015

#define DSK6713_AIC23_INPUT_LINE 0x0011

Uint16 inputsource=DSK6713_AIC23_INPUT_MIC; // select input

#define LEFT 0

#define RIGHT 1

union {Uint32 combo; short channel[2];} AIC23_data; // data for codec

#define PI 3.1415926

/* global variables */

float *p; // pointer for circular buffer

float e[M+1]; //taps delay input

float gain=1000.0; // for codec output level

float en,sn; // filter input and output

int FILT=0,CIRC=0;

short sample_data; // for codec input/output (mono)

// ... add variables if necessary

int n=1 ;

/* prototypes */

void comm_intr();
void output_sample(int);

void output_left_sample(short);

void output_right_sample(short);

Uint32 input_sample();

short input_left_sample();

short input_right_sample();

float filtrage_decal(float *h, float *e, float x);

float filtrage_circ(float *h, float *e, float **p, float x);

interrupt void c_int11() //interrupt service routine :

{ //branch to c_int11() at the sample rate

AIC23_data.combo = input_sample(); //input 32-bit sample (stereo)

sample_data=AIC23_data.channel[RIGHT];

en=0.0; // to remove

// en= ... => put sinus signal generation here

en=sin(2.0*PI*(float)n*1000.0/8000.0)+sin(2.0*PI*(float)n*1400.0/8000.0); // to remove

n++ ; // to remove

en=gain*en+(float)sample_data; // add input codec sample to en

//en=gain*en; // without adding input codec sample

if (FILT==1){

if (CIRC==1) { // circular buffer method

sn=filtrage_circ(h,e,&p,en);

else { // shift buffer method

sn=filtrage_decal(h,e,en);

else{

sn=en; // nothing to do !

sample_data=(short)sn;

output_right_sample(sample_data);

return;

}
// complete the "..." in the following function

float filtrage_circ(float *h, float *e, float **p, float x)

int i;

float y=0.0;

// read input sample x

**p=x;

// loop for scalar product by wrapping pointer *p if necessary

for (i=0; i<=M; i++) {

// scalar product

// pointer wrapping if necessary

// decrement by 1 the pointer

// pointer wrapping if necessary

return y;

// complete the "..." in the following function

float filtrage_decal(float *h, float *e, float x)

int i;

float *p;

float y=0.0;

// read input sample x

p=e; // or p=@e[0]

*p=x; // or e[0]=x

// loop for scalar product

for (i=0; i<=M; i++) {

return y;

void main()

int i;
for (i=0;i<=M;i++){ //init taps delay

e[i]=0.0;

p=e; // initialize pointer for filtrage_circ()

comm_intr(); //init DSK, codec, McBSP (bus between CAN/CNA and CPU)

while(1); //infinite loop

La carte SIM :

#include "fir.h" // M is defined inside by #define M 100

#include <math.h>

#include "dsk6713_aic23.h" //codec-DSK support file

Uint32 fs=DSK6713_AIC23_FREQ_32KHZ; // set sampling rate : 8k, 16k, 32k, 44.1k, 48k, 96k

//Uint32 fs=DSK6713_AIC23_FREQ_16KHZ;

//Uint32 fs=DSK6713_AIC23_FREQ_32KHZ;

#define DSK6713_AIC23_INPUT_MIC 0x0015

#define DSK6713_AIC23_INPUT_LINE 0x0011

Uint16 inputsource=DSK6713_AIC23_INPUT_MIC; // select input

#define LEFT 0

#define RIGHT 1

union {Uint32 combo; short channel[2];} AIC23_data; // data for codec

#define PI 3.1415926

/* global variables */

float *p; // pointer for circular buffer

float e[M+1]; //taps delay input

float gain=1000.0; // for codec output level

float en,sn; // filter input and output

int FILT=0,CIRC=0;

short sample_data; // for codec input/output (mono)

// ... add variables if necessary

int n=1 ;

/* prototypes */

void comm_intr();
void output_sample(int);

void output_left_sample(short);

void output_right_sample(short);

Uint32 input_sample();

short input_left_sample();

short input_right_sample();

float filtrage_decal(float *h, float *e, float x);

float filtrage_circ(float *h, float *e, float **p, float x);

interrupt void c_int11() //interrupt service routine :

{ //branch to c_int11() at the sample rate

AIC23_data.combo = input_sample(); //input 32-bit sample (stereo)

sample_data=AIC23_data.channel[RIGHT];

en=0.0; // to remove

// en= ... => put sinus signal generation here

en=sin(2.0*PI*(float)n*1000.0/8000.0)+sin(2.0*PI*(float)n*1400.0/8000.0); // to remove

n++ ; // to remove

en=gain*en+(float)sample_data; // add input codec sample to en

//en=gain*en; // without adding input codec sample

if (FILT==1){

if (CIRC==1) { // circular buffer method

sn=filtrage_circ(h,e,&p,en);

else { // shift buffer method

sn=filtrage_decal(h,e,en);

else{

sn=en; // nothing to do !

sample_data=(short)sn;

output_right_sample(sample_data);

return;

}
// complete the "..." in the following function

float filtrage_circ(float *h, float *e, float **p, float x)

int i;

float y=0.0;

// read input sample x

**p=x;

// loop for scalar product by wrapping pointer *p if necessary

for (i=0; i<=M; i++) {

// scalar product

// pointer wrapping if necessary

// decrement by 1 the pointer

// pointer wrapping if necessary

return y;

// complete the "..." in the following function

float filtrage_decal(float *h, float *e, float x)

int i;

float *p;

float y=0.0;

p=e; // or p=@e[0]

*p=x; // or e[0]=x

for (i=0; i<=M; i++) {

return y;

void main()

int i;
for (i=0;i<=M;i++){ //init taps delay

e[i]=0.0;

p=e; // initialize pointer for filtrage_circ()

comm_intr(); //init DSK, codec, McBSP (bus between CAN/CNA and CPU)

while(1); //infinite loop

Reponse impultionnel

Réponse fréquentielle

Vous aimerez peut-être aussi