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