📄 qsin.asm
字号:
;***********************************************************************;
;* *;
;* File Name : qsin.asm *;
;* *;
;* Originator : Advanced Embeeded Control (AEC) *;
;* Texas Instruments Inc. *;
;* *;
;* Description : This file contain source code for fixed point SIN *;
;* function implemented using Tylor series *;
;* *;
;* Date : 21/1/2002 *;
;***********************************************************************;
;* Tylor Series Approximation in the first quardrant: *;
;* *;
;* sin(x) = 3.1406625*x+0.02026367*x^2-5.325196*x^3+0.5446778*x^4 *;
;* +1.800293*x^5, where 'x' is the normalized radians *;
;* *;
;***********************************************************************;
.def _qsin ;External ref
K5 .set 0x6480 ; Scaled to Q13
K4 .set 0x52FF ; Scaled to Q20
K3 .set 0xAACC ; Scaled to Q12
K2 .set 0x45B8 ; Scaled to Q15
K1 .set 0x7338 ; Scaled to Q14
_qsin:
SETC SXM,OVM ; ACC=x
MOV ACC,AL<<16 ; AH='x', AL=0
CLRC TC
ABSTC ACC ; TC= sign(x), AH=abs(x)
LSL ACC,#1 ; Convert to first quadrant (0 to pi/2)
ABS ACC
SFR ACC,#1
MOVL XT,ACC ; XT=x in Q31 and in first quardrant
; Comment Next 2-instructions, if this works
MPY ACC,T,#K1
; MOV AR5,#K1 ; AR5=K1
; MPY ACC,T,AR5 ; ACC=K1*x in Q29
ADD ACC,#K2<<14 ; ACC=K1*x+K2 in Q29
QMPYL ACC,XT,ACC ; ACC=(K1*x+K2)*x in Q28
ADD AH,#K3 ; ACC=(K1*x+K2)*x+K3 in Q28
QMPYL ACC,XT,ACC ; ACC=((K1*x+K2)*x+K3)*x in Q27
ADD ACC,#K4<<7 ; ACC=((K1*x+K2)*x+K3)*x+K4 in Q27
QMPYL ACC,XT,ACC ; ACC=(((K1*x+K2)*x+K3)*x+K4)*x in Q26
ADD ACC,#K5<<13 ; ACC=(((K1*x+K2)*x+K3)*x+K4)*x+K5 in Q26
QMPYL ACC,XT,ACC ; ACC=((((K1*x+K2)*x+K3)*x+K4)*x+K5)*x in Q25
LSL ACC,#6 ; in Q31
ABS ACC ; Saturate to 0x7fff
NEGTC ACC ; ACC=-sin(x), if TC=1
MOV AL,AH
CLRC OVM
LRETR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -