ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 ноября
426173 Топик полностью
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 ;----------------------------------------------------------------------------------------