chti23/soft/PjtKEIL_StepSon/Src/GestionSon.s

79 lines
No EOL
1.5 KiB
ArmAsm

PRESERVE8
THUMB
extern Son
extern LongueurSon
export CallbackSon
export SortieSon
export Index
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 dcd 0x0000
Index dcd 0x0000
; ===============================================================================================
;Si Indice<LongueurSon
;{
;R0<-Son[Index]
;R0=R0+32768
;R0=R0/92
;Sortir la valeur PWM en fonction de R0
;Indice++
;}
;On place l'adresse de Son dans un registre
;On place la valeur à cette adresse dans un deuxième registre
;On lui ajoute 32768 pour se placer dans l'intervalle [0,65535]
;On divise par 92 pour se placer dans l'intervalle [0,712]
;On place le résultat dans SortieSon
;On incrémente l'indice du tableau Son de 16 bits
;Section ROM code (read only) :
area moncode,code,readonly
; écrire le code ici
CallbackSon proc
;
;Si Indice<LongueurSon
;{
push {lr}
ldr r0, =LongueurSon
ldr r1, [r0]
ldr r3,=Index
ldr r4,[r3]
cmp r4,r1
bge Depassement
;R1<-Son[Index]
ldr r2,=Son ;on place l'adresse de Son dans un registre
ldrsh r1, [r2,r4,lsl #1]
;R1=R1+32768
add r1, #32768
;R0=R0/92
mov r0, #92
udiv r1, r0
;Sortir la valeur PWM en fonction de R0
ldr r5, =SortieSon
str r1, [r5]
mov r0, r1
bl PWM_Set_Value_TIM3_Ch3
;Indice++
add r4, #1
str r4,[r3]
;}
Depassement
pop {pc}
endp
END