📄 3-1.asm
字号:
.mmregs
.def jump
.def start
k_sample_num .set 256 ;设置保存采样数据的点数
out_data .usect "out_vars", k_sample_num
;数据输出位置,大小为k_sample_num
;用来保存一批数据来查看采样是否正确
;也可以供需要分批处理数据的程序调用程序中
;可以用ar0~ar7来指定数据的首地址
in_data .usect "in_vars",1
d_cr0_send .usect "cr_send",1
d_cr1_send .usect "cr_send",1
;定义2个状态字
;此状态字就是需要开始写入TLV1571的初始值
d_temp .usect "temp",1 ;存放临时数据
k_cr0_send .set 0080h ;初始化两个状态字的值
k_cr1_send .set 0100h
;重新映射中断向量的变量
k_iptr .set 000111000b<<07 ;point 1C00H 新的向量区
;iptr是DSP内部PMST寄存器的高9bit
;用来指定中断向量表的位置,复位时全为1
;为了调试此程序,iptr将重新映射到地址1D00处
k_temp .set 1111111b
;定义一个常数,用于以后与pmst的与操作
;保持pmst的低6bit不变
d_pmst .usect "pmst",1
.sect "prog"
start:
ldm pmst,a ;取出PMST的值,放入累加器a
;改变pmst的高9bit,再放入pmst
and #k_temp,a
or #k_iptr,a
stl a,ar2
mvdm ar2,pmst
stm #0001h,imr ;开中断0
nop
nop
stm #0002h,ifr ;通过写IFR,取消所有已经挂起的中断
nop
rsbx intm ;状态寄存器ST0的INTM位,允许中断
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 ;k_sample_num用来计数
stm #out_data,ar5
portr 01h,*ar2 ;读其他端口,使ADC的CS为高
nop
nop
nop
portw *ar1+,02h ;填AD转换器的寄存器cr1
rpt #8
nop
portw *ar1,02h ;填AD转换器的寄存器cr1
portr 01h, *ar2 ;读其他端口,使ADC的CS为高
rpt #10
nop
nop ;此时,写好状态字,AD开始采样
;等待中断, 使用累加器a做计数器
;当写完k_sample_num个数据后
wait: nop ;重置累加器a,并使ar5指向out_data的开始地址
nop
bc wait,aneq
nop
stm #out_data,ar5
ld #k_sample_num,a
b wait
nop
;中断服务程序,用以读转换信号,放入out_data区
jump: sub #1h,a ;计数
rsbx xf ;发出读信号,AD收到后开始下一次采样
rpt #5
nop ;等待几个周期,便于示波器查看波形
portr 00h,*ar5
;读AD转换数据,写在RAM的out_data数据段
rpt #5
nop
ssbx xf ;使读信号无效
nop
portr 01h,*ar2 ;读其他端口,使ADC的CS为高
nop
nop
portw *ar5+,03h ;从DA输出
rete ;中断返回
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -