⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.asm

📁 tms320lf2407a 利用自带片上10位AD实现AD采样 执行FFT算法已经得到验证
💻 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 + -