MBedder, терминатор (27.11.2008 13:04, просмотров: 233) ответил Alex B. на неа, не получится. sin() - ~2000 тактов.
Бугага :)) dsPIC = 8(!) тактов на 16-битный отсчет синуса (разумеется, не табличного). На PIC32 наверняка тоже уложится тактов в 6..10, но уже для 32 бит (т.е. шаг синуса можно будет иметь мелкий, типа 16К-32К сэмплов на период)
; IIR based 16-bit sinewave sample generator (256 samples per sine period)
; Output: w5
; 8 clocks per sample (5 MHz sinewawe can be generated with dsPIC33F @40 MIPS)
sin1 = 806 ; 2^15*sin(2*pi/256)
cos1 = 32758 ; 2^15*cos(2*pi/256)
dacport = LATB ; External DAC connected to this port
clr w12 ; sin 0
mov #sin1,w5 ; 2^15*sin(2*pi/256)
mov w5,w13 ; 2-tap 16-bit delay 1st stage
mov #cos1,w4 ; 2^15*cos(2*pi/256)
1: 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,w12,w5 ; w5 = 2*sin(2*pi*N/256)-sin(2*pi*(N-2)/256)
mov w13,w12 ; w12 = sin(2*pi*(N-1)/256) (previous sample)
mov w5,w13 ; w13 = w5 (current sample)
mov w5,dacport ; Write a next sinewave sample to a DAC port
bra 1b ; Loop forever