📄 adc.asm
字号:
; Include Files
;-----------------------------------------------------------------------------
.include lf2407regs.h
;=============================================================================
N .equ 128
M .equ 7
.def _c_int0,GISR2,PHANTOM,T1PINT_ISR;,ADCINT_ISR,GISR1
.ref PVECTORS,ADCOUNT,input,indatr,fft,resave,i,sintab,nom,InitSin
;-----------------------------主程序-----------------------------------------------------------
_c_int0
CALL SYSINIT
CALL InitSin
CALL IOINIT
CALL ADINIT ;初始化ADC程序
CALL ADSTART
CALL T1INIT
CALL T1START
LDP #DP_PF2 ;电灯程序
LACL PCDATDIR
XOR #00FFH
SACL PCDATDIR
WAIT:
NOP
B WAIT
;**************************系统初始化*************************************************
SYSINIT:
SETC INTM ;关总中断
CLRC SXM ;符号扩展为0
CLRC OVM ;清益处符号
CLRC CNF ;B0块定义为数据区
LDP #0E0H
SPLK #00CDH,SCSR1 ;4*fin,设置使能adc,sci,evb,eva中断(#0000 000 0 1100 1101B)
SPLK #0E8h,WDCR ;关看门狗
LDP #01FFh
SPLK #0000h,WSGR
LDP #000H
SPLK #003Fh,IMR ;允许 INT1-INT6 中断
SPLK #0FFFFh,IFR ;清所有中断标志
LAR AR1,#0060h ;AR1为堆栈指针
LDP #DP_B2
SPLK #1,nom ;fft要归一化
RET
;******************
;******IO模块******
;******************
;******************************IO初始化PC口**************************************************
IOINIT:
LDP #DP_PF2
LACL MCRB
AND #0000H
OR #0FF00h ;PC0-PC7一般IO口
SACL MCRB
LACL PCDATDIR
AND #0FF00h ;PC口为输出方式,且当前输出为0
OR #0FF00h
SACL PCDATDIR
RET
;******************
;******AD模块******
;******************
;******************************AD初始化*****************************************************
ADINIT:
LDP #DP_PF2
SPLK #4000H,ADCTRL1
NOP
NOP
SPLK #2010H,ADCTRL1 ;AD在仿真悬挂时候转化完之后停止,级联,自动排序模式
SPLK #0000H,MAXCONV ;1个 通道
SPLK #0000H,CHSELSEQ1 ;选择1通道
SPLK #0000H,CHSELSEQ2
SPLK #0000H,CHSELSEQ3
SPLK #0000H,CHSELSEQ4
SPLK #0000H,ADCTRL2 ;无中断,EVAEVB都不能引起AD中断
RET
;******************************启动模数转换程序***********************************
ADSTART:
CLRC INTM
LDP #DP_PF2
LACL ADCTRL2
OR #2000H ;启动AD
SACL ADCTRL2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
WAITAD1:
LACL ADCTRL2
AND #1000h
BCND WAITAD1,NEQ
LACL ADCTRL2
OR #4200h
SACL ADCTRL2
RET
;GISR1:
; LDP #0E0H
; LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位-->ACC
; ADD #PVECTORS ;加上外设中断入口地址
; BACC ;跳到相应的中断服务子程序
;ADCINT_ISR:
; LDP #DP_PF2 ;电灯程序
; LACL PCDATDIR
; XOR #00FFH
; SACL PCDATDIR
; CALL DELAY
;LDP #DP_PF2 ;清AD中断标志INT FLAG SEQ1
;LACL ADCTRL2
;OR #2200H ;重新启动AD,并指向conv00
;SACL ADCTRL2
; CLRC INTM
;
; RET
;
; END
;************************
;******T1通用计数器******
;************************
;********************************T1初始化************************************
T1INIT:
LDP #DP_EVA
SPLK #0080h,EVAIMRA ;T仅仅周期中断T1PINT使能,其它关闭#0000 0000 1000 0000B
SPLK #0FFFFH,EVAIFRA ;清楚所有eva中断标志
SPLK #0000h,GPTCONA ;T1禁止比较,无启动ad事件(在周期中断中只要读取result0)
;#0000 0000 0000 0000B
SPLK #150Ch,T1CON ;0 00 10 101 0 (0) 00 11 00B,连续增计数,
;输入时钟32分频,内部cpu时钟,比较屏蔽,并关闭定时器
SPLK #0061h,T1PR ;在上述的方式设置下78us的周期中断计数值
SPLK #0,T1CNT
LDP #DP_B2
SPLK N,ADCOUNT ;装载计数值
LAR AR2,#indatr ;AR2为存放结果地址的首地址
RET
;******************************启动T1计数***************************************
T1START:
CLRC INTM ;开总中断
LDP #DP_EVA
LACL T1CON
OR #0040H ;定时器计数使能
SACL T1CON
RET
;*******T1中断程序**************************************
GISR2: ;优先级INT2中断子程序入口
;保护现场
SST #0,7Eh
SST #1,7Fh
MAR *,AR1
POPD *+
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位-->ACC
ADD #PVECTORS ;加上外设中断入口地址
BACC ;跳到相应的中断服务子程序
T1PINT_ISR:
LDP #DP_PF2
LACL ADCTRL2
OR #2000H ;启动AD
SACL ADCTRL2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
WAITAD:
LACL ADCTRL2
AND #1000h
BCND WAITAD,NEQ
LACC #0
LACC RESULT0,16 ;读取通道1的结果,并左移15位
MAR *,AR2
SACH *+ ;将结果存入adintr数组里面
LACL ADCTRL2
OR #4200h
SACL ADCTRL2
;---ach中就是归一化结果
LDP #DP_B2
LACC ADCOUNT
SUB #1 ;计数器减一
BCND T1_END,NEQ ;没有减到0则跳过fft
FFT: SPLK N,ADCOUNT ;若减到0则表示采样到了指定点数,运行fft程序
LDP #DP_EVA
LACL T1CON
AND #0FFBFH
SACL T1CON ;关闭T1定时器
SPLK #0H,T1CNT ;计数器清零
CALL resave
CALL fft
LAR AR2,#indatr
LDP #DP_PF2 ;电灯程序
LACL PCDATDIR
XOR #00FFH
SACL PCDATDIR
CALL DELAY
B FFTEND
T1_END:
SACL ADCOUNT
FFTEND:
LDP #DP_EVA ;清楚T1PINT中断标志
LACL EVAIFRA
OR #00F0H
AND #00F0H
SACL EVAIFRA
LACL T1CON
OR #0040H
SACL T1CON ;开T1定时器
GISR2_RET: ;中断返回出口
;恢复现场
MAR *,AR1
SBRK #1
PSHD *
LDP #0
LST #1,7Fh
LST #0,7Eh
CLRC INTM ;开总中断,因为一进中断就自动关闭了总中断
RET
;******************
;******假中断******
;******************
PHANTOM:
;KICK_DOG ;复位看门狗
NOP
CLRC INTM
RET
;**********************
;******其它子程序******
;**********************
;***************************Sintab初始化***********************
;*******************延时子程序****************************
DELAY: ;大约半秒延时
;保护现场:
SST #0,7Ah ;保护ST0
SST #1,7Bh ;保护ST1
MAR *,AR1
POPD *+
SAR AR0,*+
SAR AR3,*+
SAR AR4,*+
SAR AR1,*
LAR AR0,*+,AR4
LAR AR3,#0011H
LAR AR4,#0FFFEH
LAR AR0,#00H
DELAY1:
SBRK #1
NOP
CMPR 00
BCND DELAY1,NTC
LAR AR4,#0EFFEH
MAR *,AR3
SBRK #1
NOP
CMPR 00
MAR *,AR4
BCND DELAY1,NTC
;恢复现场:
MAR *,AR1
SBRK #2
LAR AR4,*-
LAR AR3,*-
LAR AR0,*-
PSHD *
LDP #0
LST #1,7Bh
LST #0,7Ah
RET
;********************
;******测试程序******
;********************
;Q15乘法测试程序
;MPYTest:
; SPM 1
; SETC OVM
; MAR *,AR2
;
; LAR AR2,#200h
;SPLK #0DFFFh,*+
; ;SPLK #0DFFFh,*+
; SPLK #0C000h,*+
; SPLK #0C000h,*+
; SPLK #2000h,*+
; SPLK #4000h,*
; LACC #0
; LAR AR2,#200h
; LT *
; LAR AR2,#201h
; MPY *
; LAR AR2,#202h
;
; LT *
; LAR AR2,#203h
; MPYA *
; RET
;****************************************************
;rsvtest: ;反向进位测试程序indatr-->>input
; MAR *,AR2
; LDP #DP_SARAM1
; SPLK #0H,i
; LAR AR2,#indatr
; LAR AR0,#indatr+8
;AA0: LACL i
; SACL *+
; LACL i
; ADD #1
; SACL i
; CMPR 00
; BCND AA0,NTC
;
;
;
; LAR AR2,#input
; LAR AR0,#input+16
;
;AA1: SPLK #0,*+
; CMPR 00
; BCND AA1,NTC
;
; CALL resave
; RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -