From beb2eb3cdd310025345a766e93328e51b07663fd Mon Sep 17 00:00:00 2001 From: elouali403 Date: Fri, 21 Apr 2023 20:40:09 +0200 Subject: [PATCH] StepSon & StepDFT done --- soft/PjtKEIL_StepDFT/Src/DFT.s | 59 ++++++++++++++++++++++++++- soft/PjtKEIL_StepDFT/Src/principal.c | 15 ++++++- soft/PjtKEIL_StepDFT/StepDFT.uvoptx | 60 ++++++++++++++++++++++++++-- soft/PjtKEIL_StepDFT/StepDFT.uvprojx | 32 ++++++++++++++- 4 files changed, 157 insertions(+), 9 deletions(-) diff --git a/soft/PjtKEIL_StepDFT/Src/DFT.s b/soft/PjtKEIL_StepDFT/Src/DFT.s index 3f6b5d4..490b004 100644 --- a/soft/PjtKEIL_StepDFT/Src/DFT.s +++ b/soft/PjtKEIL_StepDFT/Src/DFT.s @@ -1,7 +1,9 @@ PRESERVE8 THUMB - - + + export DFT_ModuleAuCarre + export TabCos + ; ====================== zone de réservation de données, ====================================== ;Section RAM (read only) : area mesdata,data,readonly @@ -20,10 +22,63 @@ ;Section ROM code (read only) : area moncode,code,readonly ; écrire le code ici +;r0 : signal d'entrée +;r1 : k +;r2 : n (compteur de boucle) +;r3 : TabCos ou TabSin selon le moment +;r4 : 64 = taille du tableau +;r5 : somme incrémentée à chaque itération de la boucle (partie imaginaire ou réelle selon l'itération +;r6 : LeSignal(i) = la bonne case du tableau de signal +;r7 : cos(2*pi*k*n/M) = la bonne case du tableau de cos ou sin +;r8 : signal entrée sécurisé (pour être sur su'il ne soit pas écrasé) +;r9 : k sécurisé (pour être sur qu'il ne soit pas écrasé) +DFT_ModuleAuCarre + push {LR, r9, r8} + ;sécuriser r0 r1 + mov r8, r0 ; stocker l'adresse du signal passée en argument + ldr r3, =TabCos + bl DFT_PartieRouI ; calcul de la partie réelle + mov r9, r0 ; stocker le résultat = partie réelle au format 12.20 dans un registre + mov r0, r8 ; renvoyer l'adresse du signal dans r0 pour qu'elle soit passée en argument du calcul de la partie imaginaire + ldr r3, =TabSin + bl DFT_PartieRouI ; résultat = partie imaginaire au format 12.20 + ;Calcul du module + asr r0, r0, #16 ;décalage de 16 vers la droite (on enlève de la précision) pour avoir la place de stocker le résultat du carré - format 12.4 + lsr r1, r9, #16 ;décalage de 16 vers la droite (on enlève de la précision) pour avoir la place de stocker le résultat du carré - format 12.4 + mul r0, r0 ; partie imaginaire au carré au format 26.6 + mul r1, r1 ; partie réelle au carré au format 26.6 + add r0, r9 ;résultat au format 26.6 + pop {r8, r9, LR} + bx lr +DFT_PartieRouI ;DFT_UnePartie + ;Etape 1 : partie réelle + push {LR, r4, r5, r6, r7} + mov r2, #0 ;initialisation de n à 0 + ;ldr r3, =TabCos ;récupération de l'adresse de TabCos -- à enlever pour faire le sinus + mov r4, #64 + mov r5, #0 ; initialisation de la somme à 0 + +CalculTerme + cmp r4, r2 + ble fin + mul r6, r1, r2 ; k*n stocké dans r7 + modulo + and r6, #63 ; modulo 64 + ldrsh r7, [r3, r6, lsl #1] ; récupération de TabCos(2*pi*k*n/M) au format 1.15 + ldrsh r6, [r0, r2, lsl #1] ; récupération de LeSignal(n) au format 4.12 + mul r7, r6 ; multiplication de x(n)*cos(2*pi*k*n/M) au format 5.27 + asr r7, r7, #7 ;décalage de 7 vers la droite (on enlève de la précision) pour avoir la place de stocker les retenues si besoin (64 retenues max, stockées sur 6 bits, mais 7 pour être sur) ; asr pour conserver le bit de signe + add r5, r7 ; ajout de ce terme à la somme totale au format 12.20 + add r2, #1 ;incrémentation de n + b CalculTerme + +fin + mov r0, r5 + pop {r7, r6, r5, r4, LR} + bx lr ;Section ROM code (read only) : AREA Trigo, DATA, READONLY diff --git a/soft/PjtKEIL_StepDFT/Src/principal.c b/soft/PjtKEIL_StepDFT/Src/principal.c index d09be75..0d34ef4 100644 --- a/soft/PjtKEIL_StepDFT/Src/principal.c +++ b/soft/PjtKEIL_StepDFT/Src/principal.c @@ -1,9 +1,11 @@ - +#include #include "DriverJeuLaser.h" +extern short LeSignal ; +extern int DFT_ModuleAuCarre(short int * Signal64ech, char k); //à changer quand la fonction moduleaaucarré sera créée - +int T[64]; int main(void) { @@ -19,6 +21,15 @@ CLOCK_Configure(); //============================================================================ + +//int vf = DFT_ModuleAuCarre(&LeSignal,1); + +for (int i=0;i<64;i++){ + + T[i]=DFT_ModuleAuCarre(&LeSignal,i); + +} + while (1) diff --git a/soft/PjtKEIL_StepDFT/StepDFT.uvoptx b/soft/PjtKEIL_StepDFT/StepDFT.uvoptx index 0d72cfc..e98fbbb 100644 --- a/soft/PjtKEIL_StepDFT/StepDFT.uvoptx +++ b/soft/PjtKEIL_StepDFT/StepDFT.uvoptx @@ -75,7 +75,7 @@ 1 0 - 0 + 1 18 @@ -154,6 +154,34 @@ + + + 0 + 1 + vf + + + 1 + 1 + T + + + + + 1 + 0 + 0x080004D4 + 0 + + + + + 2 + 0 + &TabCos + 0 + + 0 @@ -267,7 +295,7 @@ 1 0 - 1 + 0 18 @@ -624,6 +652,30 @@ 0 0 + + 1 + 2 + 2 + 0 + 0 + 0 + .\Src\DFT.s + DFT.s + 0 + 0 + + + 1 + 3 + 2 + 0 + 0 + 0 + .\Src\Signal.asm + Signal.asm + 0 + 0 + @@ -634,7 +686,7 @@ 0 2 - 2 + 4 2 0 0 @@ -654,7 +706,7 @@ 0 3 - 3 + 5 4 0 0 diff --git a/soft/PjtKEIL_StepDFT/StepDFT.uvprojx b/soft/PjtKEIL_StepDFT/StepDFT.uvprojx index 9031782..cec1044 100644 --- a/soft/PjtKEIL_StepDFT/StepDFT.uvprojx +++ b/soft/PjtKEIL_StepDFT/StepDFT.uvprojx @@ -388,6 +388,16 @@ 1 .\Src\principal.c + + DFT.s + 2 + .\Src\DFT.s + + + Signal.asm + 2 + .\Src\Signal.asm + @@ -797,6 +807,16 @@ 1 .\Src\principal.c + + DFT.s + 2 + .\Src\DFT.s + + + Signal.asm + 2 + .\Src\Signal.asm + @@ -1275,6 +1295,16 @@ 1 .\Src\principal.c + + DFT.s + 2 + .\Src\DFT.s + + + Signal.asm + 2 + .\Src\Signal.asm + @@ -1322,7 +1352,7 @@ - <Project Info> + StepDFT 0 1