ajout commentaire

This commit is contained in:
Revol Eliot 2023-06-02 14:59:59 +02:00
parent f71754fe69
commit 8c94e3b2c1
21 changed files with 8975 additions and 3094 deletions

View file

@ -28,44 +28,65 @@
; r0 = tableau dft (tab_dft)
; r1 = indice k (fréquence calculée)
; int DFT_ModuleAuCarre(short* tab_dft, int k)
DFT_ModuleAuCarre proc
push{lr,r4-r9}
push{lr,r4,r5,r6,r7,r8,r9}
;int i = 0
mov r2,#0
;int partie_relle= 0
mov r3,#0
;int partie_imaginaire = 0
mov r9,#0
;for(i=0;i<64;i++) {
boucle cmp r2,#63
bgt fin_boucle
lsl r5,r2,#1
;ldr r0,=LeSignal
ldrsh r4,[r0,r5]
ldr r6, =TabCos
ldr r7, =TabSin
;mul r5, r5, r1
;mul r8, r1, r2
;int j = i*2
lsl r5,r2,#1 ;indice utilisé pour le tableau de la dft (décallé de 1 car short)
;int dft_val = tab_dft[j]
ldrsh r4,[r0,r5] ;lecture dans le tableau de dft
ldr r6, =TabCos ; adresse de tabcos
ldr r7, =TabSin ; adresse de tabsin
;j = (j*k)%64 (on calcul l'indice correspondant dans le tableau tabcos et tabsin pour le calcul de la dft
mul r5, r1
and r5, #127
; int icos = TabCos[j]
ldrsh r6,[r6,r5]
; int isin = TabSin[j]
ldrsh r7,[r7,r5]
; int res_cos = icos*dft_val
mul r5, r6, r4
; int res_sin = isin*dft_val
mul r8, r7, r4
;partie_relle += res cos
add r3, r5
;partie_imaginaire += res_sin
add r9, r8
add r2, #1
b boucle
;}
;//A la fin de la boucle, r3 contient Re(X(k) et r9 contient Im(X(k)
fin_boucle
mov r0,r3 ;correspond à Re(X(k))
mov r1,r9 ;correspond à Im(X(k))
; int re_carre = (partie_relle)^2
smull r2,r3,r0, r0
; int im_carre = (partie_imaginaire)^2
smull r4,r5,r1, r1
adds r0,r2,r4
adc r1, r3, r5
; int resultat_final = re_carre+im_carre
adds r0,r2,r4 ; partie basse (moins intéressante)
adc r1, r3, r5 ; partie haute du la somme finale (intéressante car contient chiffre avant virgule
mov r0,r1
pop{pc,r4-r9}
pop{pc,r4,r5,r6,r7,r8,r9}
endp
;Section ROM code (read only) :
AREA Trigo, DATA, READONLY
; codage fractionnaire 1.15

View file

@ -1,7 +1,7 @@
PRESERVE8
THUMB
include DriverJeuLaser.inc
include .\Driver\DriverJeuLaser.inc
; ====================== zone de réservation de données, ======================================
;Section RAM (read only) :
@ -63,43 +63,41 @@ StartSon proc
pop {pc}
endp
;CallbackSon mov r0,=Son
CallbackSon proc
; On récupère l'adresse du tableau Son et de l'index
push {lr}
ldr r0,=Son
ldr r0,=Son ;contient l'adresse du tableau Son
ldr r2,=Index
ldr r3,[r2]
ldr r3,[r2] ;contient la valeur de Index
; if(index < LongueurSon)
push {r0}
ldr r0,=LongueurSon
cmp r0, r2
bge exit
bge exit ; on quitte dans le cas contraire
pop{r0}
; sortieSon = (Son[index] +decalage)*echelle
; On lit Son[index]
ldrsh r1, [r0,r3,lsl #1]
ldr r0,=SortieSon
ldrsh r1, [r0,r3,lsl #1] ;r1 contient Son[Index]
ldr r0,=SortieSon ;r0 contient l'adresse de la variable SortieSon où on lira le son
;mise à echelle
push {r0,r2,r3}
; Variable décalage
mov r3,#1
lsl r0,r3,#15
add r1,r1,r0
add r1,r1,r0 ;ajout de decalage à Son[index]
;Calcul mise à l'échelle (719/2^16)
ldr r2,=Res
ldrh r2,[r2]
mul r1,r1,r2
lsr r1,r1,#16
ldr r2,=Res ; Res contient 719
ldrh r2,[r2] ; on met 719 dans r2
mul r1,r1,r2 ; on multiplie 719 par (Son[Index]+decalage) dans r1
lsr r1,r1,#16 ; on divise par 2^16 dans r1
pop {r0,r2,r3}
;fin mise à échelle
strh r1,[r0] ; On écrit cette valeur dans SortieSon
mov r0,r1
mov r0,r1 ; r0 contient la valeur de SortieSon (donnée en argument de la fonction suivante)
bl PWM_Set_Value_TIM3_Ch3
; index += 1;
add r3,r3,#1
@ -110,4 +108,5 @@ exit pop {pc}
endp
END

View file

@ -0,0 +1,78 @@
/* Fichier devant contenir l'ensemble de fichiers utiles pour le projet LaserQuest
et qui concenent l'affichage sur la valise */
/* mais non disponible en version source pour les étudiants. */
#ifndef _AFFICHAGE_VALISE_H__
#define _AFFICHAGE_VALISE_H__
#include "stm32f10x.h"
/**
* @brief Initialise les périphériques nécessaires à l'affichage sur la Mallette
* et gère la cible active. S'utilise aussi avec les ùmodules affichages simple (pas de mallette)
* @note Utilise TIM1, PA5, PA6 pour les cibles, PC7 à PC9 pour SPI émulé
* utilise aussi une interruption sut TIM1, prio 8.
* @param none
* @retval None
*/
void Init_Affichage(void);
/**
* @brief Prépare l'affichage 2 digit sur l'afficheur demandé
* @note Exemple : Prepare_Afficheur(2, 99);
* prépare l'affichage de la valeur 99 sur l'afficheur n°2
* L'action est différée à l'exécution de Mise_A_Jour_Afficheurs_LED()
* @param char Aff : de 1 à 4 ; char Valeur de 0 à 99
* @retval None
*/
void Prepare_Afficheur(char Aff, char Valeur);
void Prepare_Set_Point_Unite(char Aff);
void Prepare_Clear_Point_Unite(char Aff);
/**
* @brief Prépare l'allumage de la LED demandée
* @note Exemple : Prepare_Set_LED(LED_Cible_2);
* prépare l'allumage de la LED correspondant à la cible n°2
* L'action est différée à l'exécution de Mise_A_Jour_Afficheurs_LED()
* @param voir #define ci-dessous
* @retval None
*/
void Prepare_Set_LED(char LED);
void Prepare_Clear_LED(char LED);
/**
* @brief Effectue l'action d'écriture dans le module d'affichage
* à partir de tout ce qui a é préparé auparavant.
* @note
* @param None
* @retval None
*/
void Mise_A_Jour_Afficheurs_LED(void);
/**
* @brief Spécifie le capteut actif, à savoir celui effectivement relié
* aux sorties disponibles sur la malette
* @note Exemple : Choix_Capteur(1)
* @param 1 à 4
* @retval None
*/
void Choix_Capteur(char Capteur);
// define utile pour la fonction Prepare_Set_LED et Prepare_Clear_LED
#define LED_LCD_R 5
#define LED_LCD_V 4
#define LED_Cible_4 3
#define LED_Cible_3 2
#define LED_Cible_2 1
#define LED_Cible_1 0
#endif

View file

@ -27,37 +27,57 @@
; r0 = tableau dft (tab_dft)
; r1 = indice k (fréquence calculée)
; int DFT_ModuleAuCarre(short* tab_dft, int k)
DFT_ModuleAuCarre proc
push{lr,r4,r5,r6,r7,r8,r9}
;int i = 0
mov r2,#0
;int partie_relle= 0
mov r3,#0
;int partie_imaginaire = 0
mov r9,#0
;for(i=0;i<64;i++) {
boucle cmp r2,#63
bgt fin_boucle
lsl r5,r2,#1
;ldr r0,=LeSignal
ldrsh r4,[r0,r5]
ldr r6, =TabCos
ldr r7, =TabSin
;mul r5, r5, r1
;int j = i*2
lsl r5,r2,#1 ;indice utilisé pour le tableau de la dft (décallé de 1 car short)
;int dft_val = tab_dft[j]
ldrsh r4,[r0,r5] ;lecture dans le tableau de dft
ldr r6, =TabCos ; adresse de tabcos
ldr r7, =TabSin ; adresse de tabsin
;j = (j*k)%64 (on calcul l'indice correspondant dans le tableau tabcos et tabsin pour le calcul de la dft
mul r5, r1
and r5, #127
; int icos = TabCos[j]
ldrsh r6,[r6,r5]
; int isin = TabSin[j]
ldrsh r7,[r7,r5]
; int res_cos = icos*dft_val
mul r5, r6, r4
; int res_sin = isin*dft_val
mul r8, r7, r4
;partie_relle += res cos
add r3, r5
;partie_imaginaire += res_sin
add r9, r8
add r2, #1
b boucle
;}
;//A la fin de la boucle, r3 contient Re(X(k) et r9 contient Im(X(k)
fin_boucle
mov r0,r3 ;correspond ŕ Re(X(k))
mov r1,r9 ;correspond ŕ Im(X(k))
; int re_carre = (partie_relle)^2
smull r2,r3,r0, r0
; int im_carre = (partie_imaginaire)^2
smull r4,r5,r1, r1
adds r0,r2,r4
adc r1, r3, r5
; int resultat_final = re_carre+im_carre
adds r0,r2,r4 ; partie basse (moins intéressante)
adc r1, r3, r5 ; partie haute du la somme finale (intéressante car contient chiffre avant virgule
mov r0,r1

View file

@ -0,0 +1,112 @@
PRESERVE8
THUMB
include .\Driver\DriverJeuLaser.inc
; ====================== zone de réservation de données, ======================================
;Section RAM (read only) :
area mesdata,data,readonly
;Section RAM (read write):
area maram,data,readwrite
SortieSon dcw 0
Index dcd 0
Res dcw 719
export CallbackSon
export StartSon
extern Son
extern LongueurSon
extern TIM4
EXPORT SortieSon
EXPORT Index
; ===============================================================================================
;Section ROM code (read only) :
area moncode,code,readonly
; écrire le code ici
;int tab Son
;int index
;short sortieSon
;int callBack
; int decalage = 1<<15;
; double echelle = 719/(1<<16) //decalage*2
; if(index < LongueurSon) {
; sortieSon = (Son[index] +decalage)*echelle
;
; index += 1;
; }
; return sortieSon
;
StartSon proc
push {lr}
ldr r0,=Index
mov r1,#0
str r1,[r0]
pop {pc}
endp
;CallbackSon mov r0,=Son
CallbackSon proc
; On récupère l'adresse du tableau Son et de l'index
push {lr}
ldr r0,=Son ;contient l'adresse du tableau Son
ldr r2,=Index
ldr r3,[r2] ;contient la valeur de Index
; if(index < LongueurSon)
push {r0}
ldr r0,=LongueurSon
cmp r0, r2
bge exit ; on quitte dans le cas contraire
pop{r0}
; sortieSon = (Son[index] +decalage)*echelle
ldrsh r1, [r0,r3,lsl #1] ;r1 contient Son[Index]
ldr r0,=SortieSon ;r0 contient l'adresse de la variable SortieSon où on lira le son
;mise à echelle
push {r0,r2,r3}
; Variable décalage
mov r3,#1
lsl r0,r3,#15
add r1,r1,r0 ;ajout de decalage à Son[index]
;Calcul mise à l'échelle (719/2^16)
ldr r2,=Res ; Res contient 719
ldrh r2,[r2] ; on met 719 dans r2
mul r1,r1,r2 ; on multiplie 719 par (Son[Index]+decalage) dans r1
lsr r1,r1,#16 ; on divise par 2^16 dans r1
pop {r0,r2,r3}
;fin mise à échelle
strh r1,[r0] ; On écrit cette valeur dans SortieSon
mov r0,r1 ; r0 contient la valeur de SortieSon (donnée en argument de la fonction suivante)
bl PWM_Set_Value_TIM3_Ch3
; index += 1;
add r3,r3,#1
str r3,[r2] ; On ajoute 2 à l'index
exit pop {pc}
endp
END

File diff suppressed because it is too large Load diff

View file

@ -2,13 +2,21 @@
#include "DriverJeuLaser.h"
#include <stdio.h>
#include "Affichage_Valise.h"
extern int DFT_ModuleAuCarre(short int* Signal64ech, char k);
extern short int LeSignal[];
extern void CallbackSon(void);
extern void StartSon(void);
#define MAX_PIC 100000
//int result;
int dft[64];
short int dma_buf[64];
int tab_score[6] = {0};
int tab_norm[6] = {17,18,19,20,23,24}; //fréquences qui nous intéressent
int ancienne_cible = 3; //ancienne cible activée
int cible = 0; //cible actuelle
void callback() {
Start_DMA1(64);
@ -19,10 +27,33 @@ void callback() {
dft[i] = DFT_ModuleAuCarre(&(dma_buf[0]),i);
//somme+=dft[i];
}
//Prepare_Afficheur(1, 15);
Stop_DMA1;
//Lecture des raies pour trouver la fréquence lue
for(int i=0;i<6;i++) {
if(dft[tab_norm[i]] > MAX_PIC) {
//if (player_count < 4 && tab_score[i] == 0)
tab_score[i] += 1;
if (tab_score[i] >= 100) {
tab_score[i] =0; // remise à zéro lorsque le score dépasse 100
}
if(tab_score[i]%20 == 0) {
StartSon(); //On active le son si une cible est touchée
Prepare_Clear_LED(cible); // On éteint l'ancienne cible
cible = (cible+1)%3; // On change la cible
Prepare_Set_LED(cible);
Choix_Capteur(cible+1);
//On change le score
if(i < 4) {
Prepare_Afficheur((i+1), tab_score[i]);
Mise_A_Jour_Afficheurs_LED();
}
}
}
}
}
int main(void)
@ -33,34 +64,52 @@ int main(void)
// ===========================================================================
//int result = DFT_ModuleAuCarre(&(LeSignal[0]),1);
//Initialisation
//printf("le résultat : %d \n", result);
// Après exécution : le coeur CPU est clocké à 72MHz ainsi que tous les timers
CLOCK_Configure();
Init_Affichage();
//Réinitialisation de tous les afficheurs
for(int p = 0;p<4;p++) {
Prepare_Afficheur(p+1,0);
Prepare_Clear_LED(p);
}
Prepare_Set_LED(1);
Choix_Capteur(2);
//Systick pour la DFT
GPIO_Configure(GPIOB, 0, OUTPUT, ALT_PPULL);
PWM_Init_ff(TIM2,3,720);
Init_TimingADC_ActiveADC_ff(ADC1,72);
Single_Channel_ADC( ADC1, 2 );
Init_Conversion_On_Trig_Timer_ff( ADC1, TIM2_CC2, 225 );
Init_ADC1_DMA1( 0, &(dma_buf[0]) );
//Création loop DFT
Systick_Period_ff(5*72*1000);
Systick_Prio_IT(0,callback);
Systick_Prio_IT(9,callback);
SysTick_Enable_IT;
SysTick_On;
//Systick pour le Son
GPIO_Configure(GPIOB, 1, OUTPUT, OUTPUT_PPULL);
PWM_Init_ff(TIM3,3,720);
PWM_Set_Value_TIM3_Ch3( 360);
Timer_1234_Init_ff( TIM4, 6552 );
Active_IT_Debordement_Timer( TIM4, 10, CallbackSon );
Mise_A_Jour_Afficheurs_LED();
//============================================================================

View file

@ -388,6 +388,16 @@
<FileType>1</FileType>
<FilePath>.\Src\principal.c</FilePath>
</File>
<File>
<FileName>Affichage_Valise.h</FileName>
<FileType>5</FileType>
<FilePath>.\Driver\Affichage_Valise.h</FilePath>
</File>
<File>
<FileName>affichage_valise.o</FileName>
<FileType>3</FileType>
<FilePath>.\Driver\affichage_valise.o</FilePath>
</File>
</Files>
</Group>
<Group>
@ -477,6 +487,11 @@
<FileType>4</FileType>
<FilePath>.\Driver\DriverJeuLaser.lib</FilePath>
</File>
<File>
<FileName>DriverJeuLaser.inc</FileName>
<FileType>5</FileType>
<FilePath>.\Driver\DriverJeuLaser.inc</FilePath>
</File>
</Files>
</Group>
<Group>
@ -492,6 +507,16 @@
<FileType>2</FileType>
<FilePath>.\Src\Signal.asm</FilePath>
</File>
<File>
<FileName>bruitverre.asm</FileName>
<FileType>2</FileType>
<FilePath>.\Src\bruitverre.asm</FilePath>
</File>
<File>
<FileName>GestionSon.s</FileName>
<FileType>2</FileType>
<FilePath>.\Src\GestionSon.s</FilePath>
</File>
</Files>
</Group>
<Group>
@ -881,6 +906,16 @@
<FileType>1</FileType>
<FilePath>.\Src\principal.c</FilePath>
</File>
<File>
<FileName>Affichage_Valise.h</FileName>
<FileType>5</FileType>
<FilePath>.\Driver\Affichage_Valise.h</FilePath>
</File>
<File>
<FileName>affichage_valise.o</FileName>
<FileType>3</FileType>
<FilePath>.\Driver\affichage_valise.o</FilePath>
</File>
</Files>
</Group>
<Group>
@ -901,6 +936,11 @@
<FileType>4</FileType>
<FilePath>.\Driver\DriverJeuLaser.lib</FilePath>
</File>
<File>
<FileName>DriverJeuLaser.inc</FileName>
<FileType>5</FileType>
<FilePath>.\Driver\DriverJeuLaser.inc</FilePath>
</File>
</Files>
</Group>
<Group>
@ -916,6 +956,16 @@
<FileType>2</FileType>
<FilePath>.\Src\Signal.asm</FilePath>
</File>
<File>
<FileName>bruitverre.asm</FileName>
<FileType>2</FileType>
<FilePath>.\Src\bruitverre.asm</FilePath>
</File>
<File>
<FileName>GestionSon.s</FileName>
<FileType>2</FileType>
<FilePath>.\Src\GestionSon.s</FilePath>
</File>
</Files>
</Group>
<Group>
@ -1374,6 +1424,16 @@
<FileType>1</FileType>
<FilePath>.\Src\principal.c</FilePath>
</File>
<File>
<FileName>Affichage_Valise.h</FileName>
<FileType>5</FileType>
<FilePath>.\Driver\Affichage_Valise.h</FilePath>
</File>
<File>
<FileName>affichage_valise.o</FileName>
<FileType>3</FileType>
<FilePath>.\Driver\affichage_valise.o</FilePath>
</File>
</Files>
</Group>
<Group>
@ -1394,6 +1454,11 @@
<FileType>4</FileType>
<FilePath>.\Driver\DriverJeuLaser.lib</FilePath>
</File>
<File>
<FileName>DriverJeuLaser.inc</FileName>
<FileType>5</FileType>
<FilePath>.\Driver\DriverJeuLaser.inc</FilePath>
</File>
</Files>
</Group>
<Group>
@ -1409,6 +1474,16 @@
<FileType>2</FileType>
<FilePath>.\Src\Signal.asm</FilePath>
</File>
<File>
<FileName>bruitverre.asm</FileName>
<FileType>2</FileType>
<FilePath>.\Src\bruitverre.asm</FilePath>
</File>
<File>
<FileName>GestionSon.s</FileName>
<FileType>2</FileType>
<FilePath>.\Src\GestionSon.s</FilePath>
</File>
</Files>
</Group>
<Group>