⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsp中利用ccs5000程序.txt

📁 DSP中利用ccs5000编程 包括sinx计算FIR滤波正弦波发生器等
💻 TXT
字号:
一,sin(x)的计算
算法

; 计算sin(x)利用泰勒级数展开为
;sin(x)=x-x3/3!+x5/5!-x7/7!+x9/9!=x(1-(x2/6)(1-(x2/20)(1-(x2/42)(1-x2/72))))
;cos(x)=1-x2/2!+x4/4!-x6/6!+x8/8!=1-x2/2(1-x2/12(1-x2/30(1-x2/56)))
;c1=32768/72     c2=32768/42    c3=32768/20   c4=32768/6
	 sin(x)*32768=x(32768-(x2/6)(32768-(x2/20)(32768-(x2/42)(32768- x2*32768/72))))
y=32768*x      y2=(32768*x)2=32768*(32768*x2)
d_x=32768*x2= (2*y2)/65536
;kx1=32768-x2*32768/72= 32768-x2*c1
	=(32768*65536-32768*x2*2*c1)/65536
	=(32768*65536-d_x*c1*2)/65536
		
kx2=32768-x2/42(32768- x2/72*32768)
   =32768-(x2/42)*kx1
   =(32768*65536-32768*x2*2*kx1/42)/65536
   =(32768*65536-d_x*kx1*2/42)/65536
   =(32768*65536-((d_x*kx1*2)/65536)*32768*2/42)/65536
   =(32768*65536-((d_x*kx1*2)/65536)*c2*2)/65536
 
kx3=32768-x2/20(32768-x2/42(32768- x2/72*32768))
   =32768-(x2/20)*kx2
   =(32768*65536-32768*x2*2*kx2/20)/65536
   =(32768*65536-d_x*kx2*2/20)/65536
   =(32768*65536-(d_x*kx2*2/65536)*c3*2)/65536

kx4=32768-x2/6(32768-x2/20(32768-x2/42(32768- x2/72*32768)))
	=32768-x2/6*k3
	=(32768*65536-(d_x*k3*2/65536)*c4*2)/65536
	
sin(x)*32768=x*kx4=(32768*x*kx4)/32768=y*kx4*2/65536
例:
             .title "sinx.asm"
             .mmregs
             .def _c_int00
STACK        .usect "STACK",10
y            .usect "sin_vars",1
d_x          .usect "sin_vars",1
d_temp       .usect "sin_vars",1
d_sinx       .usect "sin_vars",1
s            .usect "sin_vars",1
d_coeff      .usect "coeff",4
             .data
table:       .word 01c7H,030bH,0666H,1556H ;系数表
             .sect ".vectors"
_c_int00:    B start   
			 .text
start:       STM #STACK+10,SP
             LD #y,DP
             ssbx frct ;置frct位,执行乘法时左移一位,相当于乘2
             stm #d_coeff,ar5
             rpt #3
             mvpd #table,*ar5+ ;把系数c1,c2,c3,c4传送到数据存储区
             stm #d_coeff,ar3  ;AR3指向c1
	stm #y,ar2
	st #6487H,*ar2  ;输入一个角度值 y=x*32768
             stm #s,ar4 
             st #7fffh,*ar4  ;(*AR4)=32768
             squr *ar2+,a    ;A=2*y2,AR2指向d_x
             st a,*ar2       ;d_x=2*y2/65536
	||ld *ar4,b    ;B=32768*65536
	masr *ar2+,*ar3+,b,a  ;A=(32768*65536-d_x*c1*2), T=d_x
	                      ;AR2指向d_temp ,AR3指向c2
             mpya a                ;A=T*A(32--16)= d_x*kx1*2
             sth a,*ar2            ;d_temp=(d_x*kx1*2)/65536
	masr *ar2-,*ar3+,b,a 
	;A=32768*65536-((d_x*kx1*2)/65536)*c2*2 
	;AR2指向d_x ,AR3指向c3
	mpya *ar2+    ;B=(*AR2)*A(32—16)= d_x*kx2*2
					  ; AR2指向d_temp
             st b,*ar2    ; d_temp=(d_x*kx2*2)/65536
             ||ld *ar4,b  ; B=32768*65536
	masr *ar2-,*ar3+,b,a  
	            ;A=32768*65536-((d_x*kx2*2)/65536)*c2*2
	            ; AR2指向d_x ,AR3指向c4
	   mpya *ar2+     ; B=(*AR2)*A(32—16)= d_x*kx3*2
                            ; AR2指向d_temp
             st b,*ar2     ; d_temp=(d_x*kx3*2)/65536
             ||ld *ar4,b   ; B=32768*65536
	masr *ar2,*ar3,b,a
	            ;A=32768*65536-((d_x*kx3*2)/65536)*c2*2
	   mpya y   ;B=y*A(32—16)= y*kx4*2
             sth b,d_sinx  ;d_sinx=B(31—16)=y*kx4*2/65536
ends         b ends
	.end
命令文件:
MEMORY
    {
      PAGE 0: EPROM: org=1000H len=1000h 
      		  VECS:  org=0xff80 len=0x80
      PAGE 1: SPRAM: org=0080H len=0020H
              DARAM: org=0100H len=0010H
            }
SECTIONS
     {
       .text: > EPROM PAGE 0 
       .vectors: >VECS PAGE 0
       .data: > EPROM PAGE 0
       STACK: > SPRAM PAGE 1
       sin_vars: > DARAM PAGE 1
       coeff: > DARAM PAGE 1
          }  
二,定时器使用
源程序:
    .version 5410
     .title "timer"
     .mmregs
     .def _c_int00
k_tcr_soft .set 0b<<11
k_tcr_free .set 0b<<10
k_tcr_psc .set 0000b<<6
k_tcr_trb .set 1b<<5
k_tcr_tss .set 0b<<4
k_tcr_tddr .set 1001b<<0
k_tcr  .set  k_tcr_soft|k_tcr_free|k_tcr_psc|k_tcr_trb|k_tcr_tss|k_tcr_tddr  
     .sect ".vectors"
reset:
		b _c_int00
		
		.text
_c_int00:
		ld #0,dp
		stm#0,imr
		stm #200h,sp		     
		orm #010h,tcr;停止定时器
		stm #0b,clkmd;
tsstatus:ldm clkmd,a;
		 and #1b,a;
		 bc tsstatus,aneq;
		stm #07007h,clkmd;0111 0000 0000 0111		
	 	stm #00fffh,bscr;0111 1111 1111 1111,clkout=dsp_clk/4
	    stm #10h,prd;设置定时器周期寄存器
		stm #k_tcr,tcr;设置定时器控制寄存器
		stm #08h,imr
		rsbx intm
end:
		nop
		bd end
	nop
	nop
		.end


命令文件:
	MEMORY
	{
	   PAGE 0: VECS: org=0ff80h,len=80h
	           ROM : org=6000h,len=1000h
	           DATA: org=7000h,len=1000h
	   PAGE 1: RAM: org =200h,len=100h
	   }
	 SECTIONS
	 {
	  		.vecorts:> VECS PAGE 0
	  		.text:>ROM PAGE 0
	  		.data :>DATA PAGE 0
	  		.bss:> RAM PAGE 1
	  		}
三,FIR滤波器设计
例:
            .title "FIR.asm"
           .mmregs
           .def _c_int00
x          .usect "x",46    ;循环寻址的基地址的低N位必须是0
h          .usect "h",46    
y          .usect "y",256
           .data
fir_coff_table:
           .word -26,   -91,    -61,    77,    181,   85,     -173
           .word -309,  -88,    338,    483,   48,    -613,   -720
           .word 78,    1094,   1082,   -406,  -2129, -1870,  1569
           .word 6889,  10892,  10892,  6889,  1569,  -1870,  -2129
           .word -406,  1082,   1094,   78,    -720,  -613,   48
           .word 483,   338,    -88,    -309,  -173,  85,     181
           .word 77,    -61,    -91,    -26
           
           .sect “.vectors”
_c_int00:  b start
           .text
start:     stm #x,ar3
           rptz a, #45
           stl a,*ar3+  ;初始化x缓冲区-->全部填0
           stm #h,ar3
           rpt #45
           mvpd fir_coff_table,*ar3+ ;把h(n)装载到数据缓冲区
           stm #2000h,ar2;数据存储器的2000h为256个采样值的起始地址
           stm #x,ar3  ;ar3为x(n)的指针
           stm #h,ar4  ;ar4为h(n)的指针
           stm #y,ar5  ;ar5为y(n)的指针 y(n)=x(n)*h(n)
           stm #x+45,ar6  ;ar6为LTD指令的间接寻址指针
           ssbx frct
           stm #46,bk       ;Fir缓冲区大小
           stm #255,brc    ;y(n)256点输出
           rptb fir_loop-1
           stm #1,ar0
           ld *ar2+,a    ;装载输入数据
           stl a,*ar3
fir_filter:
           rptz a,#45
           mac *ar3+0%,*ar4+0%,a
           sth a,*ar5+
           stm #x+45,ar6  ;ar6为LTD指令的间接寻址指针
           rpt #45
           ltd *ar6-
fir_loop:  b fir_loop
           .end


命令文件:
-o fir.out
-m fir.map

MEMORY  {
         PAGE 0: EPROM: org=1000H len=1000H
         PAGE 1: RAM:   org=200H len=1000H
           }
SECTIONS
       {
        .text: > EPROM PAGE 0
        .data: > EPROM PAGE 0
        .bss:  > RAM PAGE 1
        x: align(64) { } > RAM PAGE 1
        h: align(64) { } > RAM PAGE 1
        y: align(256) { } > RAM PAGE 1        
          }
四,仿真FIR滤波器数据生成
在ti\c5400\cgtools\lib目录下,把rts.lib加入工程;
例:
    #include "stdio.h"
    #include "math.h"
    main()
    {
     int i;
     float f[256];
     FILE *fp;
     if((fp=fopen("d:\\firdinput.dat","w+"))==NULL)
	  {
	  	printf("can't open file!\n");
	  	exit(0);
	  	}
	 for (i=0;i<=255;i++)
	  	{
	  	  f[i]=(cos(2*3.14159265*i*1000/10000)+cos(2*3.14159265*i*3000/10000))/4;
	  	  fprintf(fp,"%ld\n",(long)(f[i]*32767));
	  	  }
	 fclose(fp);
 } 	
五,正弦信号发生器
 例       .title "sin_wave.asm"
          .mmregs
          .def _c_int00
		
drr20 .set	20h;McBSP0
drr10 .set 21h
dxr20 .set 22h
dxr10 .set 023h
spsa0 .set 38h
mcbspc0 .set 39h
spcr10 .set 00h
spcr20 .set 01h
rcr10 .set 02h
rcr20 .set 03h
xcr10 .set 04h
xcr20 .set 05h
srgr10 .set 06h
srgr20 .set 07h
mcr10 .set 08h
mcr20 .set 09h
rcera0 .set 0ah
rcerb0 .set 0bh
xcera0 .set 0ch
xcerb0 .set 0dh
pcr0 .set 0eh          
          ;.def d_xs,d_sinx,d_xc,d_cosx,sinx,cosx
sin_x     .usect "sin_x",360

d_xs      .usect "sin_vars",1
d_squr_xs .usect "sin_vars",1
d_temp_s  .usect "sin_vars",1
d_sinx    .usect "sin_vars",1
d_l_s     .usect "sin_vars",1
d_coef_s  .usect "coefs",4

d_xc      .usect "cos_vars",1
d_squr_xc .usect "cos_vars",1
d_temp_c  .usect "cos_vars",1
d_cosx    .usect "cos_vars",1
d_l_c     .usect "cos_vars",1
d_coef_c  .usect "coefc",4

STACK     .usect "STACK",10H

k_theta   .set 286     ;theta=pi/360  (0.5 deg)

          .data
table_s:   .word 01c7h,030bh,0666h,1556h
table_c:  .word 0249h,0444h,0aabh,4000h

          .sect ".vectors"
_c_int00:       b start
               stm #STACK+10H,SP  
nmi:     rete
		nop
		nop
		nop         
         .space 18*4*16
brint0:
	      b receive
	      nop
	      nop
btint0:
	      b transmit
	      nop
	      nop  	  

          .text
          
start:    stm #STACK+10H,SP
          stm #0,imr	
          stm #d_coef_c,ar5
          rpt #3
          mvpd #table_c,*ar5+
          stm #d_coef_s,ar5
          rpt #3
          mvpd #table_s,*ar5+
          stm #k_theta,ar0   ;
          stm #0,ar1
          stm #sin_x,ar6
          stm #90,brc
          rptb loop1-1
          ldm ar1,a
          ld #d_xs,dp
          stl a,*(d_xs)
          stl a,*(d_xc)
          call sinx
          call cosx
          ld #d_sinx,dp
          stm #d_sinx,ar3
          stm #d_cosx,ar4
          ssbx frct
          mpy *ar3,*ar4,a
         
          stm #7fffh,t
          mpya a
          sth a,1,*ar6+
          mar *ar1+0
         
loop1:    stm #sin_x+89,ar7   ;sin91(deg)--sin179(deg)
          stm #88,brc
          rptb loop2-1
          ld *ar7-,a
          stl a,*ar6+
loop2:    stm #180,brc
          stm #sin_x,ar7
          rptb loop3-1
          ld *ar7+,a
          neg a
          stl a,*ar6+
loop3:            	    
		nop
       ld #00,dp
		STM #spcr10,spsa0 ;子地址寄存器指向串行口控制寄存器1
		stm #00h,mcbspc0 ;spcr10=00,接收复位
		
		stm #spcr20,spsa0 ; 子地址寄存器指向串行口控制寄存器2
		stm #200h,mcbspc0 ;spcr20=200h,free=1,发送复位
		
		stm #pcr0,spsa0  ; 子地址寄存器指向串行口引脚控制寄存器
		stm #0ch,mcbspc0  ;pcr0=0ch;xioena=0,fsxp=1,fsrp=1
		
		stm #spcr10,spsa0 ; 子地址寄存器指向串行控制口寄存器1
		stm #00h,mcbspc0 ;spcr10=00;接收复位
		
		stm #spcr20,spsa0 ;子地址寄存器指向串行控制口寄存器2
		stm #00h,mcbspc0 ;spcr20=00h,free=0,发送复位
		
		stm #rcr10,spsa0 ;子地址寄存器指向串行口接收控制寄存1
		stm #40h,mcbspc0 ;rcr10=40;rfrlen1=000000,1字每帧
		                ;rwdlen1=010,16位每字
		stm #rcr20,spsa0 ;子地址寄存器指向串行口接收控制寄存2
		stm #00h,mcbspc0 ;rphase=0,单相帧 ,rcompand=00,
					
		stm #xcr10,spsa0; 子地址寄存器指向串行口发送控制寄存1
		stm #40h,mcbspc0;xcr10=40;xfrlen1=000000,1字每帧
		                ;xwdlen1=010,16位每字
		stm #xcr20,spsa0; 子地址寄存器指向串行口发送控制寄存2
		stm #00h,mcbspc0;xphase=0,μ¥?à??,xcompand=00,	
		rpt #100;wait
		nop				
	   andm #0ff3fh,54h;interupt from serial
		stm #0,dxr10 ;	不请求二次通信				
	   stm #spcr10,spsa0;启动串行口
	   stm #01h,mcbspc0;
		stm #spcr20,spsa0;
		stm #201h,mcbspc0;
		stm #0ffffh,ifr  ;清除中断标志位
		call requst
		stm #0180h,dxr10;0000 0001 1000 0000 对contol1写
						;15位DAC,没有二次通行,软件复位AD50
		call wait1      ;
		call requst    ;调用请求二次通信子程序
		stm #0210h,dxr10;0000 0010 0001 0000 对contol 2写,
                       ;ADC为16位
		call wait1      ;
		call requst   ;调用二次通信子程序
		stm #0460h,dxr10;0000 0100 0110 0000 对contol 4写
						;采样率10.7k
		call wait1      ;
        
		stm #000h,dxr10;
		 ;stm #010h,imr
		 ;rsbx intm
		 
	    stm #360,bk
	    stm #60,ar0
	    stm #sin_x,ar4 
		nop
wait2:	ldm ifr,a	;等待中断
		and #010h,a;
		bc wait2,aeq;
		stm #0ffffh,ifr;清中断标志位
	    call receive	 ; 调用接收服务子程序	
		b wait2    ;等待下一次接收
requst:   ;二次通信
		stm #01h,dxr10;请求二次通信
wait1:	ldm ifr,a	;
		and #010h,a ;判断是否发送完毕
		bc wait1,aeq;
		stm  #0ffffh,ifr;清中断标志位
		ld drr10,a; 读数据
		ret 		
receive:
       ld drr10,a
	   andm #0fffeh,*ar4
	   mvdk *ar4+0%,dxr10
       ret

transmit:
		rete				
	   
sinx:     
          ssbx frct    
          stm #d_coef_s,ar3
          stm #d_xs,ar2
          stm #d_l_s,ar4
          st #7fffh,*ar4
          squr *ar2+,a   ;A=x*x
          st a,*ar2      ;d_squr_x=x*x
          ||ld *ar4,b    ;B=1 B等于1乘以32768
          masr *ar2+,*ar3+,b,a  ;A=1-x*x/72  T=x*x
          mpya a               ;A=T*A(31--16)=x*x(1-x*x/72)
          sth a,*ar2           ;d_temp=x*x(1-x*x/72)
          masr *ar2-,*ar3+,b,a
          mpya *ar2+
          st b,*ar2
          ||ld *ar4,b
          masr *ar2-,*ar3+,b,a
          mpya *ar2+
          st b,*ar2
          ||ld *ar4,b
          masr *ar2-,*ar3+,b,a
          mpya d_xs
          sth b,d_sinx
          ret
          
cosx:     ssbx frct
          stm #d_coef_c,ar3
          stm #d_xc,ar2
          stm #d_l_c,ar4
          st #7fffh,*ar4
          squr *ar2+,a   ;A=x*x
          st a,*ar2      ;d_squr_x=x*x
          ||ld *ar4,b    ;B=1 B等于1乘以32768
          masr *ar2+,*ar3+,b,a  ;A=1-x*x/72  T=x*x
          mpya a               ;A=T*A(31--16)=x*x(1-x*x/72)
          sth a,*ar2           ;d_temp=x*x(1-x*x/72)
          masr *ar2-,*ar3+,b,a
          mpya *ar2+
          st b,*ar2
          ||ld *ar4,b
          masr *ar2-,*ar3+,b,a
          sfta a,-1,a
          neg a
          mpya *ar2+
          mar *ar2+
          add *ar4,16,b
          sth b,*ar2     
          ret   
          .end  


    
命令文件:
MEMORY
    {
      PAGE 0: EPROM: org=1000H len=1000h
              VECS:  org=0ff80H len=0080H
      PAGE 1: SPRAM: org=0080H len=0040H
              DARAM1: org=0120H len=0008H
              DARAM2: org=0128H len=0008H
              DARAM3: org=0200H len=0200H
            }
SECTIONS
     {
       .text: > EPROM PAGE 0
       .data: > EPROM PAGE 0
       STACK: > SPRAM PAGE 1
       sin_vars: > DARAM1 PAGE 1
       coef_s: > DARAM1 PAGE 1
       cos_vars: > DARAM2 PAGE 1
       coef_c: > DARAM2 PAGE 1
       sin_x: align (512) { } > DARAM3 PAGE 1
       .vectors: > VECS PAGE 0
}                        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -