?? 5-6.asm
字號:
.mmregs
.def main
.def ad50_data
spsa0 .set 38h ; 緩沖串口0子地址地址寄存器
spcd0 .set 39h ; 緩沖串口0子地址數據寄存器
drr21 .set 40h ; 緩沖串口1數據1接收寄存器
drr11 .set 41h ; 緩沖串口1數據2接收寄存器
dxr21 .set 42h ; 緩沖串口1數據2發送寄存器
dxr11 .set 43h ; 緩沖串口1數據1發送寄存器
dxr10 .set 23h ; 緩沖串口0數據1發送寄存器
drr10 .set 21h ; 緩沖串口0數據1接收寄存器
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
k_iptr .set 000111000b<<07 ; 設置中斷向量表的地址,指向0x1C00
k_temp .set 1111111b
b1 .set 0557h ; 濾波器的參數b1
b2 .set 1067h ; 濾波器的參數b2
b3 .set 1067h ; 濾波器的參數b3
b4 .set 0557h ; 濾波器的參數b4
a1 .set 0EEFh ; 濾波器的參數a1
a2 .set 10DCh ; 濾波器的參數a2
a3 .set 0AF9h ; 濾波器的參數a3
k_a .set 3 ; 濾波器參數a的個數
k_b .set 4 ; 濾波器參數b的個數
k_buffer .set 8 ; 濾波器循環緩沖的大小
buffery .usect "filter_vars",k_buffer*2 ; 定義濾波器數據輸出緩沖區
bufferx .usect "filter_vars",k_buffer*2 ; 定義濾波器數據輸入緩沖區
data_dp .usect "filter_vars",0 ; 定義數據頁指針
main:
STM 4000h,sp ; 設置堆棧指針
LD #0h,dp ; 設置數據頁指針
LDM pmst,a ; 改變中斷向量表首地址
AND #k_temp,a
OR #k_iptr,a
STL a,ar6
MVDM ar6,pmst
NOP
NOP
NOP
STM #0ffffh,tcr ; 關閉定時器
STM #05h,prd ; 設置定時器周期寄存器
STM #08e0h,tcr ; 設置定時器控制寄存器
SSBX intm ; 關閉中斷
SSBX sxm
ST #2491h,swwsr ; 設置外設等待時間寄存器
NOP
NOP
SSBX xf ; 設置XF引腳為高
NOP ; 等待硬件完成高電平檢測
NOP
dss_init:
RSBX cpl ; 設置DSP的緩沖串口0的所有寄存器
NOP
NOP
STM spcr10,spsa0
NOP
STM 06h,spcd0 ; 寫入06h到spcr10寄存器
NOP
stm spcr20,spsa0
NOP
STM 200h,spcd0 ; 寫入200h到spcr20寄存器
NOP
STM pcr0,spsa0
NOP
STM 0eh,spcd0
NOP
STM rcr10,spsa0
NOP
STM 40h,spcd0
NOP
STM rcr20,spsa0
NOP
STM 4h,spcd0
NOP
STM xcr10,spsa0
NOP
STM 40h,spcd0
NOP
STM xcr20,spsa0
NOP
STM 4h,spcd0
NOP
LD #64h,a ; 等待一段時間
RPT #50
NOP
STM spcr10,spsa0
NOP
STM 07h,spcd0 ; 開啟緩沖串口
NOP
STM spcr20,spsa0
NOP
STM 201h,spcd0
NOP
RPT #50
NOP
aic_init: ; 初始化AD50
STM 0h,imr ; 設置中斷寄存器
ORM 10h,imr
STM 0ffffh,ifr ; 清上電復位可能影響的中斷標志
PORTW 08h,02h
NOP
NOP
NOP
CALL wait
waitr$14$:
STM 0h,spsa0
NOP
LDM spcd0,a
NOP
NOP
NOP
AND #2h,0,a,a
BC waitr$14$,aeq ; 判斷是否可以寫數據到AD50
STM #101h,dxr10 ; 設置AD50的控制寄存器1
CALL wait
STM 0ffffh,ifr
waitr$17$:
STM 0h,spsa0
NOP
LDM spcd0,a
NOP
NOP
NOP
AND #2h,0,a,a
BC waitr$17$,aeq ; 判斷是否可以寫數據到AD50
STM #210h,dxr10 ; 設置AD50的控制寄存器2
CALL wait
STM 0ffffh,ifr
waitr$22$:
STM 0h,spsa0
NOP
LDM spcd0,a
NOP
NOP
NOP
AND #2h,0,a,a
BC waitr$22$,aeq ; 判斷是否可以寫數據到AD50
; STM #430h,dxr10 ; 設置20kHz采樣頻率
; STM #440h,dxr10 ; 設置15kHz采樣頻率
STM #400h,dxr10 ; 設置8kHz采樣頻率
CALL wait ; 設置AD50的控制寄存器4
STM 0ffffh,ifr
waitr$24$:
STM 0h,spsa0
NOP
LDM spcd0,a
NOP
NOP
NOP
AND #2h,0,a,a
BC waitr$24$,aeq ; 判斷是否可以寫數據到AD50
STM #301h,dxr10 ; 設置AD50的控制寄存器3
CALL wait
SSBX frct ; 設置數據的小數方式位
STM #buffery,ar4 ; 設置輸出數據指針
STM #bufferx, ar3 ; 設置輸入數據指針
STM #buffery, ar5
STM #k_buffer,bk ; 設置循環指針
STM #1, ar0
NOP
STM 0ffffh,ifr ; 清中斷標志寄存器
NOP
RSBX xf
NOP
NOP
NOP
LDM drr10,a ; 清空緩沖串口0的數據接收寄存器
NOP
STM 0h,imr
ORM 10h,imr ; 設置緩沖串口0的接收中斷
NOP
NOP
RSBX intm ; 開啟總中斷
js:
NOP
NOP
B js
NOP
NOP
NOP
wait: ; 延時子程序
RPT #8048
NOP
RET
NOP
NOP
ad50_data: ; AD50接收數據中斷子程序
LDM drr10,a ; 接收數據送到累加器A
CALL filter ; 調用濾波子程序
NOP
NOP
RETE
NOP
NOP
filter: ; 濾波子程序
NOP
NOP
NOP
STL a,*ar3 ; 采樣數據送到ar3指向的數據空間
NOP
MAR *ar3-0% ; 調整指針ar3,適應濾波器算法
MAR *ar3-0%
MAR *ar3-0%
; 開始做濾波算法
MPY *ar3+0%,#b4,b ; b=b4*x(i)
LD a,b
MPY *ar3+0%,#b3,b ; b=b3*x(i+1)
ADD a,b
MPY *ar3+0%,#b2,b ; b=b2*x(i+2)
ADD a,b
MPY *ar3+0%,#b1,b ; b=b1*x(i+3)
ADD a,b ; y(x+3)=a
MPY *ar4+0%,#a3,b ; b=y(i)*a3
ADD a,b ; a=a+b
MPY *ar4+0%,#a2,b ; b=y(i+1)*a2
ADD a,b ; a=a+b
MPY *ar4+0%,#a1,b ; a=y(i+2)*a1
ADD a,b ; y(x+3)=a+b
; STFA a,-2,b
STH b,*ar4-0% ; FILTER++
; STFA a,3,a
STH a,dxr10 ; 濾波后數據送到DA輸出
MAR *ar4-0% ; 調整濾波器數據指針,為下一次數據濾波做準備
NOP
NOP
RET
NOP
NOP
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -