PRESERVE8 THUMB include 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 ldr r2,=Index ldr r3,[r2] ; if(index < LongueurSon) push {r0} ldr r0,=LongueurSon cmp r0, r2 bge exit pop{r0} ; sortieSon = (Son[index] +decalage)*echelle ; On lit Son[index] ldrsh r1, [r0,r3,lsl #1] ldr r0,=SortieSon ;mise à echelle push {r0,r2,r3} ; Variable décalage mov r3,#1 lsl r0,r3,#15 add r1,r1,r0 ;Calcul mise à l'échelle (719/2^16) ldr r2,=Res ldrh r2,[r2] mul r1,r1,r2 lsr r1,r1,#16 pop {r0,r2,r3} ;fin mise à échelle strh r1,[r0] ; On écrit cette valeur dans SortieSon mov r0,r1 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