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

📄 mainsrc.asm

📁 DTMF信号产生原程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
     	.global  _c_int0  
     	.global  RTX_INT
     	.global	 INT2_INT  
     	.global	 TIMER_INT   
     	.include    "globals.inc"  
     	.include    "table.inc"
     	 
     	.text
        
     
_c_int0:  
		CLRC		CNF
		SETC		INTM
		CLRC		XF    
		
		POP
		POP
		POP 
		POP
		POP
		POP
		POP
		POP
		POP
		POP
		POP
		POP
		POP
		POP
		POP  
		
		LAR			AR7 , #03H
		
		MAR			* , AR1
		LAR			AR2 , #7FFFH 
_c_int0_0: 
		LACC        * , 0 , AR2 
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2  
		
		LACC        * , 0 , AR2 
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2  
		
		BANZ		_c_int0_0 , *- , AR1    
		SETC		XF 		
		
		MAR			* , AR1 
		LAR			AR2 , #7FFFH 
_c_int0_1: 
		LACC        * , 0 , AR2 
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2  
		
		LACC        * , 0 , AR2 
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2
		LACC        * , 0 , AR2  
			
		BANZ		_c_int0_1 , *- , AR1 
		
		CLRC		XF
		MAR			* , AR7
		LAR			AR2 , #7FFFH  
		BANZ		_c_int0_0 , *- , AR1		
 
;寄存器初始化
***********************************************************************************
		LDP			#VAL_B2_DP
		SPLK		#VAL_IFR , IFR ;中断挂起标志
		SPLK		#0 , IMR       
		SPLK		#VAL_GREG, GREG ;全局变量寄存器 

		SPLK        #VAL_PMST , SET_REG_TEMP
		OUT			SET_REG_TEMP , PMST                              
		                              
		SPLK		#VAL_ICR ,SET_REG_TEMP
		OUT			SET_REG_TEMP , ICR       
		
		SPLK        #VAL_SSPCR , SET_REG_TEMP
		OUT 		SET_REG_TEMP ,	SSPCR 
		
		SPLK 		#VAL_WSGR , SET_REG_TEMP
		OUT			SET_REG_TEMP , WSGR 
		
		SPLK   		#VAL_BRD , SET_REG_TEMP
		OUT			SET_REG_TEMP , BRD 
		   		                           
		SPLK		#VAL_ASPCR , SET_REG_TEMP
		OUT			SET_REG_TEMP , ASPCR 
		
		;时钟参数定义
		SPLK		#VAL_TCR	, SET_REG_TEMP
		OUT			SET_REG_TEMP , TCR		
		SPLK		#VAL_PRD , SET_REG_TEMP
		OUT			SET_REG_TEMP , PRD	                           		

		SPLK 		#VAL_IOSR, SET_REG_TEMP
		OUT			SET_REG_TEMP , IOSR 		
		 
		SETC		SXM
		SPM         0;PREG输出不移位
		SETC		OVM
		
		
		LDP			#VAL_B0_DP1 		
		MAR			* , AR1 
		
				
;初始化全局变量,缓冲区
*********************************************************************************		
		;初始化cosf1和cosf2 ;注意这里是不是跟着一起加
		;*******************************************************		           
		LAR			AR1 , #COSF_PARA
		RPT			#010H
		BLPD		#COSF_TBL , *+  
		
		;初始化从RECDATA_BUF  开始的数据   0CC0H个为0     4K数据存储器地址 
		;存放接收到得数据,等待分析的缓冲区,32个时隙全部缓冲,进行分析  
		;每个时隙有102个数据
		;********************************************************
		LACC 		#0H , 0
		LAR 		AR1 , #RECDATA_BUF 
		MAR 		* , AR1 
		LAR 		AR2 , #(RECDATA_BUF_LONG-1)		
_SYS_INIT_RECDATA:      
		SACL 		*+ , 0 , AR2 
		BANZ        _SYS_INIT_RECDATA , *- , AR1 
		
		SETC		XF     
		
		;初始化检测到要发送DTMF缓冲区开始的10个 
		;*********************************************************
		LACC		#0H , 0
		LAR			AR1 , #SEND_DTMF_BUF
		RPT			#0FH
		SACL		*+ , 0    
		
		;!DEBUG	
		;LACC		#0FFFFH , 0
		;LAR			AR1 , #SEND_DTMF_BUF
		;SACL		* , 0  
		
		;初始化NO_DTMF_COUNT计数
		;*********************************************************
		LACC		#0H , 0
		LAR			AR1 , #NO_DTMF_COUNT
		RPT			#01FH
		SACL		*+ , 0  		
		
		;初始化检测到MFC数据缓冲区开始的32个 
		;*********************************************************
		LACC		#07FFFH , 0
		LAR			AR1 , #RECIEVE_DTMF_BUF
		RPT			#0FH
		SACL		*+ , 0    
		 		
		;接收数据缓冲区的开头指针
		LACC		#RECDATA_BUF , 0
		SACL 		GOERTZEL_DEC_DATA_PTR
		
		;*********************************************************
        MAR			* , AR1        
        SPLK		#0H , BEGIN_REC_PCMDATA_FLAG
        SPLK 		#0H , REC_DEC_STATE
        SPLK 		#RECDATA_BUF , REC_FTS_PCMDATA_PTR     
        SPLK		#0H , ASP_SEND_W_PTR 
        SPLK		#0H , ASP_SEND_R_PTR
              
          
        SPLK 		#0H , TIMER_1MS_FLAG 
        SPLK 		#0H , TIMER_1MS_COUNT 
        SPLK 		#0H , TIMER_5MS_FLAG 
        SPLK 		#0H , TIMER_5MS_COUNT 
        SPLK 		#0H , TIMER_50MS_FLAG 
        SPLK 		#0H , TIMER_50MS_COUNT 
        SPLK 		#0H , TIMER_200MS_FLAG 
        SPLK 		#0H , TIMER_200MS_COUNT 
        SPLK 		#0H , TIMER_1S_FLAG 
        SPLK 		#0H , XF_CHANGE_COUNT  
        SPLK        #0H , DIV_VALUE_VAR;
        
        LAR			AR0 , #(SEND_DTMF_BUF+0FH)         
        
INIT_PREPARE_RUN:                      
        LDP			#VAL_B2_DP                  
        
        SPLK		#0C30H , RESET_SSP_T_R  ;复位传送和接收  
        OUT			RESET_SSP_T_R , SSPCR              
                       
        SPLK		#0C20H , RESET_SSP_T    ;复位发送
        
        SPLK		#VAL_IMR , IMR           
        SPLK		#0FFFFH , IFR    
        SPLK		#(VAL_SEND_BEGIN+2) , INT2_SEND_PTR  
        SPLK		#0H , SYNCH_COUNT
                
        LDP			#VAL_B0_DP1  
                   
        SPLK		#0 , DEC_TIMESLOT_INDEX
        LAR			AR5 , #VAL_SEND_BEGIN          
        LAR			AR4 , REC_FTS_PCMDATA_PTR   
        SPLK 		#VAL_SLOTBUF_LONG , REC_PCMDATA_COUNT       
        CLRC		INTM
        CLRC		XF 
	
;准备工作
;************************************************************
PREPARE_WORK:  ;在初始化过程中,8k中断没有产生之前才会在这里,运行过程中不会到达这里   
        LACC		REC_DEC_STATE
        BCND		PREPARE_WORK , EQ     
        
***程序正式开始的地方
*************************************************************        
MAIN_LOOP:    
        MAR			* , AR1        
        CALL        FUN_TIME_PRO , *   ;处理时间关系或控制 
              
        LACC		REC_DEC_STATE              ;当REC_DEC_STATE等于0时,需要开始检测数据了
        BCND		FUN_DEC_DTMF,EQ   
        
        B           MAIN_LOOP          
        
;进入检测过程 
;*************************************************************          
FUN_DEC_DTMF:      
        CALL        FUN_TIME_PRO , *   ;处理时间关系或控制       

;检测前初始化部分
;*****************************************************************************
        ;检测开始
        ;***********************************************                
        LACC		DEC_TIMESLOT_INDEX  ;当前操作时隙接收序号   

        ;初始化能量区 将GOERTZEL_EN开始的16个地址数据设为0
        ;***********************************************           
INIT_FN_EN:  
		MAR			* , AR1        
        LAR			AR1 , #GOERTZEL_EN   
        LAR			AR2 , #013H  ;循环因子14H个
        LACC		#0H          
_FN_EN:
        SACL 		*+ , 0 , AR2
        BANZ		_FN_EN , *- , AR1  
        
          
;GOERTZEL算法计算部分
;*****************************************************************************       
        ;GOERTZEL能量叠加计算
        ;************************************************   
        ;AR7 :计算能量数据量,作为循环累加变量因子
        ;AR1 :存放能量计算结果地址 (F(n-1)F(n-2) ...顺序存放)
        ;AR2 :接收数据指针
        ;AR3 :COS参数系数
        ;GOERTZEL_DEC_COUNT :要滤波频率个数   
GOERTZEL_ADD_TOTAL:       
        LAR			AR7 , #(VAL_SLOTBUF_LONG-1)   ;102个数据
        LAR			AR1 , #(GOERTZEL_EN+1)  ;从GOERTZEL_EN开始;注意这里用的是GOERTZEL_EN+1 
        LAR			AR2 , GOERTZEL_DEC_DATA_PTR  

        LAR			AR3 , #COSF_PARA
        LACC		#8H , 0
        SACL		GOERTZEL_DEC_COUNT
                
        CALL        FUN_GOERTZEL_ADD ,* , AR3   ;运算goertzel算法的能量累计           
        
        ;GOERTZEL第二步,能量计算
        ;************************************************   
        ;AR7:要计算滤波个数,作为循环因子运算8次
        ;AR1:存放数据地址
        ;AR2:存放cosf参数    
GOERTZEL_EN_COMPUTE:          
        LAR			AR7 , #07H
        LAR			AR1 , #(GOERTZEL_EN+15)  
        LAR 		AR2 , #(COSF_PARA+7)      
_EN_COMPUTE:
        ;call的内容
        ;f(n)*f(n)-2*cosf*f(n)*f(n-1)+f(n-1)*f(n-1)  ;;sbrk #2 
        ;=(f(n-1)-f(n-2))^2-2*(1+cosf)*f(n-1)*f(n-2)       
        CALL		FUN_GOERTZEL_EN ,* , AR2   
        SACH		*- , 1 , AR7 ;将计算的结果保存在(fn-2)上 ar1内容-1 为下一次做准备
        BANZ		_EN_COMPUTE , *- , AR1  
                
;开始检测数据
;************************************************************************  
		
		;取出行列最大值   
        ;***********************************************
GET_ROW_MAX: 
        ;取出ROW最大的index放到DEC_ROW_INDEX中
        ;*********************************************** 
        MAR			* , AR1
        LACC		#3H , 0
        SACL 		DEC_ROW_INDEX          
        LAR			AR2 , #2H
        LAR			AR1 , #(GOERTZEL_EN+6)  ;
             
        LACC		*- , 0
        MAR			*- , AR1
        SACL		DEC_ROW_MAX_EN   ;保存第一个数据到VAR_MAIN_TEMP_1  
        
_ROW_MAX:          
        LACC		DEC_ROW_MAX_EN   ;
        SUB			* , 0 
        BCND		_ROW_MAX_1 , GEQ   
        
        SAR			AR2 , DEC_ROW_INDEX
        LACC		* , 0
        SACL		DEC_ROW_MAX_EN  
        
_ROW_MAX_1:  
        MAR			*- , AR1
		MAR			*- , AR2
		BANZ		_ROW_MAX , *- , AR1   
		
		SUB			#20H
		BCND		NO_DTMF_SEND , LT
		 

GET_COL_MAX:  
		;取出COL最大的INDEX放到DEC_COL_INDEX中
        ;***********************************************   
        MAR			* , AR1      
        LACC		#3H , 0
        SACL 		DEC_COL_INDEX          
        LAR			AR2 , #2H
        LAR			AR1 , #(GOERTZEL_EN+0EH)  ;
      
        LACC		*- , 0
        MAR			*- , AR1
        SACL		DEC_COL_MAX_EN   ;保存第一个数据到VAR_MAIN_TEMP_1  
        
_COL_MAX:          
        LACC		DEC_COL_MAX_EN   ;
        SUB			* , 0 
        BCND		_COL_MAX_1 , GEQ   
        
        SAR			AR2 , DEC_COL_INDEX
        LACC		* , 0
        SACL		DEC_COL_MAX_EN  
        
_COL_MAX_1:  
        MAR			*- , AR1
		MAR			*- , AR2
		BANZ		_COL_MAX , *- , AR1    
		
		SUB			#20H
		BCND		NO_DTMF_SEND , LT 
		        
;相对峰值检测  
;if MAX*#2ABH-EN*800H <0则退出,不进行检测    
;****************************************************************** 
RELPEAK_CHECK:     
		;AR3:循环因子,作为比较能量值个数为4  
		;AR1:能量值存放地址  
		;AR2:为与差值大于数量参数,等于1,除了本身以外,不能比自己大
        LAR			AR3 , #3H
        LAR			AR1 , #(GOERTZEL_EN+07H)
        LAR			AR2 , #1H        
        
		LT			DEC_ROW_MAX_EN     ;DEC_ROW_MAX_EN*#2ABH
		MPY			#2ABH  				
ROW_RELPEAK_CHECK:
		MAR			*- , AR1     ;EN * 800H
		LACC		*- ,11 , AR3
		SPAC
		BCND		ROW_RELPEAK_CHECK_0 , LT 		
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -