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 [Link] 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/[Link] ;
- Pour effacer d’éventuels breakpoint. Debug/breakpoints/Delete all ;
- Menu File/load program/../[Link] ;
-
Ouvrir la fenêtre du « main » (dans l’arborescence du projet).
Pour modifier un exercice :
- Menu Project open/ c:/ti/myproject/[Link] ;
- 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/../[Link]..
Vous avez chargé sur la carte votre [Link] 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