MBedder, терминатор (20.07.2013 21:48, просмотров: 90) ответил Лeoнид Ивaнoвич на Вычислять синус на контроллере? Это же займет больше места, чем таблица.
На АСМ86 - 9 строчек, на АСМ30 - 15 ASM86:
; The cos table has 1024 values & ranges from -2^24 to 2^24
build_table: lea DI,cos_table
mov CX,1022
mov EBX,cos_table[4]
mov EAX,EBX
@@calc:
imul EBX
shrd EAX,EDX,23
sub EAX,[DI-8]
stosd
loop @@calc
cos_table dd 16777216 ; 2^24
dd 16776900 ; 2 ^24*cos(2у/1024)
dd 1022 dup (?)
ASM30 (dsPIC):
;----------------------------------------------------------------------------------------
; Sin(K)=2*Cos(2*pi/N)*Sin(K-1)-Sin(K-2)
; Cos(K)=2*Cos(2*pi/N)*Cos(K-1)-Cos(K-2)
sin1 = 100 ; 2^15*sin(2*pi/256)
cos1 = 32758 ; 2^15*cos(2*pi/256)
sin_gen:
mov #cos_table,w1 ; Byte sine table ptr
clr w2 ; sin 0
mov #sin1,w5 ; 2^15*sin(2*pi/256)
mov w5,w3 ; 2-tap 16-bit delay 1st stage
mov #cos1,w4 ; 2^15*cos(2*pi/256)
do #pwmper-1,1f ; Repeat PWMPER times
mpy w4*w5,A ; AH = 0.5*sin(2*pi*N/256)
sac.r A,#-2,w5 ; w5 ~= 2*sin(2*pi*N/256)
sub w5,w2,w5 ; w5 = 2*sin(2*pi*N/256)-sin(2*pi*(N-2)/256)
mov w3,w2 ; w2 = sin(2*pi*(N-1)/256) (previous sample)
mov w5,w3 ; w3 = w5 (current sample)
lsr w5,#8,w0 ; Make a byte sine value
btg w0,#7 ; Convert signed byte to unsigned
1: mov.b w0,[w1++] ; Store a byte sine value entry into a RAM table
return
;----------------------------------------------------------------------------------------