📄 my.asm
字号:
************************************************************
***************************************************
********************** BPF.asm ***********************
************************************************************
.mmregs
.def jump
.def start
K_SAMPLE_NUM .set 256
;设置保存采样数据的点数
K_DATA_SIZE .set 256
;输入数据点数
K_BUFFER_SIZE .set 32
;缓冲大小,必须大于a向量和b向量的个数综合,并且必须是2的整数次幂
K_B .set 31 ;b向量的个数
K_CIR .set K_BUFFER_SIZE
DATA_DP .usect "filter_vars",0
out_data .usect "out_data",K_SAMPLE_NUM
;A/D读入的数据保存位置,大小为K_SAMPLE_NUM,用来保存一批数据,
;以便查看采样是否正确,可以提供需要分批处理数据的程序调用,例如FFT.
;可以用ARX来指定数据的首地址
filterdata .usect "filter_vars",K_DATA_SIZE
;滤波后的数据输出位置,大小为K_DATA_SIZE,用来查看滤波后的数据
bufferdatax .usect "filter_vars",K_BUFFER_SIZE*2 ;循环缓冲区Y
in_data .usect "in_vars",1
d_cr0_send .usect "cr_send",1
d_cr1_send .usect "cr_send",1
;定义2个状态字,此状态字就是需要开始写入A/D的初值
d_temp .usect "temp",1 ;存放临时数据
k_cr0_send .set 0080h ;初始化两个状态字的值
k_cr1_send .set 0100h
**************** 滤波器系数 *************************
a0 .set 4BH
a1 .set 1DH
a2 .set -0A4H
a3 .set 196H
a4 .set 34H
a5 .set -137H
a6 .set 0F2H
a7 .set -498H
a8 .set -144H
a9 .set 766H
a10 .set -45H
a11 .set 83BH
a12 .set 1DEH
a13 .set -2635H
a14 .set - 124H
a15 .set 361BH
a16 .set -124H
a17 .set -2635H
a18 .set 1DEH
a19 .set 83BH
a20 .set -45H
a21 .set 766H
a22 .set -144H
a23 .set -498H
a24 .set 0F2H
a25 .set -137H
a26 .set 34H
a27 .set 196H
a28 .set -0A4H
a29 .set 1DH
a30 .set 4BH
********************** 滤波器的指针的命名 **************
.text
.asg AR2,ORIGIN
.asg AR3,INPUT
.asg AR5,OUTPUT
*********************************************************
*****************重新映射中断向量的变量******************
*********************************************************
K_IPTR .set 000111000b<<07 ;指向1C00H新的向量区
;IPTR是DSP内部PMST寄存器的高9位,用于指定中断向量表的位置.
; 位时全为1,此程序诶了调试,重新映射到地址1D00H处
K_TEMP .set 1111111b
;定义一个常数,用于以后于PMST的与操作,保持PMST的弟7为不变
D_PMST .usect "pmst",1
.sect "prog"
start:
SSBX FRCT ;所有运算纯小数或纯正数
LDM PMST,A ;取出PMST的值,放入A.改变PMST的高9位,再放入PMST
AND #K_TEMP,A
OR #K_IPTR,A
STLM A,PMST
*********************************************************
***************** 定时器设置、中断设置 ******
*********************************************************
stm #0010h,TCR ;
stm #0400h,PRD ;采样频率10k
stm #0825h,TCR
stm #0008h,IMR ;开中断
nop
nop
rsbx intm ;允许中断
nop
nop
*********************************************************
***************** 设置初始值 ******************
*********************************************************
stm #d_temp,ar2
stm #d_cr0_send,ar1
st #k_cr0_send,*ar1+
st #k_cr1_send,*ar1
stm #d_cr0_send,ar1
LD #K_SAMPLE_NUM,A ;用以计数,注意在滤波程序段工作时会被用作中间结果的容器
*********************************************************
***************** 写状态字 **********************
*********************************************************
portr 0ffffh,*ar2 ;读别的端口使A/D转换器的CS位高
rpt #20
nop
nop
nop
portw *ar1+,07FFFh ;写A/D转换器的寄存器CR0
rpt #20
nop
nop
portw *ar1,07FFFh ;写A/D转换器的寄存器CR1
portr 0ffffh,*ar2 ;读别的端口,使A/D转换器的CS为高
rpt #20
nop
nop ;此时状态字写好A/D开始采样
*********************************************************
*****等中断用A作计数器,当写完K_SAMPLE_NUM个数据后 *******
********重置计数器A,并使AR5指向OUT_DATA的开始地址 *******
*********************************************************
; STL A,AR7 ;设置循环次数初值,用ar7保护A里的循环计数
************** 滤波器指针初始化 **********************
; STM #out_data,ORIGIN
; STM #bufferdatax,INPUT
; STM #filterdata,OUTPUT
;设置循环缓冲区大小和步长
;初始化 ;a1,a2,a3的个数
; RPT #K_B-1
; MVDD *ORIGIN+,*INPUT+0% ;初始化头三个 X(i)
; STM #bufferdatax,INPUT
WAIT: NOP
NOP
BC WAIT,ANEQ
NOP
STM #out_data,ORIGIN
STM #filterdata,OUTPUT
STM #K_DATA_SIZE,AR7
LD #K_SAMPLE_NUM,A
B WAIT
NOP
*********************************************************
******中断服务程序,用以读转换信号,放入out_data***********
*********************************************************
jump:
LDM AR7, A ;计数
SUB #1,A
STL A, AR7
rsbx xf ;发出读信号,A/D转换器收到后开始下一次采样
rpt #5
nop
portr 07FFFh,*ORIGIN
;读A/D转换数据,写在RAM的out_data数据段
rpt #5
nop
ssbx xf ;制高读信号
nop
portr 0FFFFh,*ar4 ;读别的端口,使A/D转换器的CS为高
filter_start:
STM #K_CIR,BK
STM #1,AR0
ld *ORIGIN+,a ;将采样得到的数据左移6位,再把计算得到的数据右移4位
sfta a,+6
AND #0FFFFh,A
stl a,*INPUT
nop
nop
RPT #K_B-1-1
MAR *INPUT-0%
nop
nop
MPY *INPUT+0%,#a30,B
LD B,A
MPY *INPUT+0%,#a29,B
ADD B,A
MPY *INPUT+0%,#a28,B
ADD B,A
MPY *INPUT+0%,#a27,B
ADD B,A
MPY *INPUT+0%,#a26,B
ADD B,A
MPY *INPUT+0%,#a25,B
ADD B,A
MPY *INPUT+0%,#a24,B
ADD B,A
MPY *INPUT+0%,#a23,B
ADD B,A
MPY *INPUT+0%,#a22,B
ADD B,A
MPY *INPUT+0%,#a21,B
ADD B,A
MPY *INPUT+0%,#a20,B
ADD B,A
MPY *INPUT+0%,#a19,B
ADD B,A
MPY *INPUT+0%,#a18,B
ADD B,A
MPY *INPUT+0%,#a17,B
ADD B,A
MPY *INPUT+0%,#a16,B
ADD B,A
MPY *INPUT+0%,#a15,B
ADD B,A
MPY *INPUT+0%,#a14,B
ADD B,A
MPY *INPUT+0%,#a13,B
ADD B,A
MPY *INPUT+0%,#a12,B
ADD B,A
MPY *INPUT+0%,#a11,B
ADD B,A
MPY *INPUT+0%,#a10,B
ADD B,A
MPY *INPUT+0%,#a9,B
ADD B,A
MPY *INPUT+0%,#a8,B
ADD B,A
MPY *INPUT+0%,#a7,B
ADD B,A
MPY *INPUT+0%,#a6,B
ADD B,A
MPY *INPUT+0%,#a5,B
ADD B,A
MPY *INPUT+0%,#a4,B
ADD B,A
MPY *INPUT+0%,#a3,B
ADD B,A
MPY *INPUT+0%,#a2,B
ADD B,A
MPY *INPUT+0%,#a1,B
ADD B,A
MPY *INPUT+0%,#a0,B
ADD B,A
sfta a,-4
add #0800h,16,A
STH A,*OUTPUT ;输出数据到OUTPUT的下一个单元
filter_end NOP
NOP
nop
nop
portw *OUTPUT+,0BFFFH
LDM AR7,A ;将保存的循环次数赋给A,用于判断循环是否结束
RSBX intm ;开启中断,允许再次中断
rete ;中断返回
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -