?? my.asm
字號:
************************************************************
***************************************************
********************** BPF.asm ***********************
************************************************************
.mmregs
.def jump
.def start
K_SAMPLE_NUM .set 256
;設(shè)置保存采樣數(shù)據(jù)的點數(shù)
K_DATA_SIZE .set 256
;輸入數(shù)據(jù)點數(shù)
K_BUFFER_SIZE .set 32
;緩沖大小,必須大于a向量和b向量的個數(shù)綜合,并且必須是2的整數(shù)次冪
K_B .set 31 ;b向量的個數(shù)
K_CIR .set K_BUFFER_SIZE
DATA_DP .usect "filter_vars",0
out_data .usect "out_data",K_SAMPLE_NUM
;A/D讀入的數(shù)據(jù)保存位置,大小為K_SAMPLE_NUM,用來保存一批數(shù)據(jù),
;以便查看采樣是否正確,可以提供需要分批處理數(shù)據(jù)的程序調(diào)用,例如FFT.
;可以用ARX來指定數(shù)據(jù)的首地址
filterdata .usect "filter_vars",K_DATA_SIZE
;濾波后的數(shù)據(jù)輸出位置,大小為K_DATA_SIZE,用來查看濾波后的數(shù)據(jù)
bufferdatax .usect "filter_vars",K_BUFFER_SIZE*2 ;循環(huán)緩沖區(qū)Y
in_data .usect "in_vars",1
d_cr0_send .usect "cr_send",1
d_cr1_send .usect "cr_send",1
;定義2個狀態(tài)字,此狀態(tài)字就是需要開始寫入A/D的初值
d_temp .usect "temp",1 ;存放臨時數(shù)據(jù)
k_cr0_send .set 0080h ;初始化兩個狀態(tài)字的值
k_cr1_send .set 0100h
**************** 濾波器系數(shù) *************************
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新的向量區(qū)
;IPTR是DSP內(nèi)部PMST寄存器的高9位,用于指定中斷向量表的位置.
; 位時全為1,此程序誒了調(diào)試,重新映射到地址1D00H處
K_TEMP .set 1111111b
;定義一個常數(shù),用于以后于PMST的與操作,保持PMST的弟7為不變
D_PMST .usect "pmst",1
.sect "prog"
start:
SSBX FRCT ;所有運算純小數(shù)或純正數(shù)
LDM PMST,A ;取出PMST的值,放入A.改變PMST的高9位,再放入PMST
AND #K_TEMP,A
OR #K_IPTR,A
STLM A,PMST
*********************************************************
***************** 定時器設(shè)置、中斷設(shè)置 ******
*********************************************************
stm #0010h,TCR ;
stm #0400h,PRD ;采樣頻率10k
stm #0825h,TCR
stm #0008h,IMR ;開中斷
nop
nop
rsbx intm ;允許中斷
nop
nop
*********************************************************
***************** 設(shè)置初始值 ******************
*********************************************************
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 ;用以計數(shù),注意在濾波程序段工作時會被用作中間結(jié)果的容器
*********************************************************
***************** 寫狀態(tài)字 **********************
*********************************************************
portr 0ffffh,*ar2 ;讀別的端口使A/D轉(zhuǎn)換器的CS位高
rpt #20
nop
nop
nop
portw *ar1+,07FFFh ;寫A/D轉(zhuǎn)換器的寄存器CR0
rpt #20
nop
nop
portw *ar1,07FFFh ;寫A/D轉(zhuǎn)換器的寄存器CR1
portr 0ffffh,*ar2 ;讀別的端口,使A/D轉(zhuǎn)換器的CS為高
rpt #20
nop
nop ;此時狀態(tài)字寫好A/D開始采樣
*********************************************************
*****等中斷用A作計數(shù)器,當(dāng)寫完K_SAMPLE_NUM個數(shù)據(jù)后 *******
********重置計數(shù)器A,并使AR5指向OUT_DATA的開始地址 *******
*********************************************************
; STL A,AR7 ;設(shè)置循環(huán)次數(shù)初值,用ar7保護(hù)A里的循環(huán)計數(shù)
************** 濾波器指針初始化 **********************
; STM #out_data,ORIGIN
; STM #bufferdatax,INPUT
; STM #filterdata,OUTPUT
;設(shè)置循環(huán)緩沖區(qū)大小和步長
;初始化 ;a1,a2,a3的個數(shù)
; 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
*********************************************************
******中斷服務(wù)程序,用以讀轉(zhuǎn)換信號,放入out_data***********
*********************************************************
jump:
LDM AR7, A ;計數(shù)
SUB #1,A
STL A, AR7
rsbx xf ;發(fā)出讀信號,A/D轉(zhuǎn)換器收到后開始下一次采樣
rpt #5
nop
portr 07FFFh,*ORIGIN
;讀A/D轉(zhuǎn)換數(shù)據(jù),寫在RAM的out_data數(shù)據(jù)段
rpt #5
nop
ssbx xf ;制高讀信號
nop
portr 0FFFFh,*ar4 ;讀別的端口,使A/D轉(zhuǎn)換器的CS為高
filter_start:
STM #K_CIR,BK
STM #1,AR0
ld *ORIGIN+,a ;將采樣得到的數(shù)據(jù)左移6位,再把計算得到的數(shù)據(jù)右移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 ;輸出數(shù)據(jù)到OUTPUT的下一個單元
filter_end NOP
NOP
nop
nop
portw *OUTPUT+,0BFFFH
LDM AR7,A ;將保存的循環(huán)次數(shù)賦給A,用于判斷循環(huán)是否結(jié)束
RSBX intm ;開啟中斷,允許再次中斷
rete ;中斷返回
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -