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

📄 mainsrc.asm

📁 DTMF信号产生原程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
		ADD			#SEND_DTMF_BUF
		SACL		MAIN_TEMP_2
		
		LAR			AR1 ,  MAIN_TEMP_2 
		LACC		*   		
			
		;低时隙,高8位,高时隙低8位	
		BIT			MAIN_TEMP_1 , 15	
		BCND		NO_DTMF_HIGH , TC  
				
		AND			#0FFH
		SACL		*
		B		    NO_DTMF_END   
		
NO_DTMF_HIGH:     		
		AND			#0FF00H
		SACL		*
				
NO_DTMF_END:
		
		RET    

**********************************************************
*** Goerztel能量计算
***     ;f(n)*f(n)-2*cosf*f(n)*f(n-1)+f(n-1)*f(n-1) 
***     =(f(n)-f(n-1)) * (f(n)-f(n-1))-2*f(n)*f(n-1)*(1+cosf)
*** 临时变量VAR_GOERZTEL    
*** 不变量1ch=#1    
*** 返回时计算结果保存在acc并且ar1=ar1-1
**********************************************************		
FUN_GOERTZEL_EN:
		;Fx=(1+cosf)
		;VAR_GOERZTEL = (1+cosf)
		;***************************   
		LACC		#8000H , 15    ;1,作为定点算法的Q15
		ADD			*- , 15 , AR1 
		SACH		VAR_GOERZTEL 
		
		;VAR_GOERZTEL=fx=2*(1+cosf)*f(n-1)
		;****************************		
		LT			*-                
		MPY			VAR_GOERZTEL
		PAC 		
		SACH		VAR_GOERZTEL , 1   
		
		;VAR_GOERZTEL=fx=2*(1+cosf)*f(n-2)*f(n-1) 
		;*****************************
		LT			*+               
		MPY			VAR_GOERZTEL 
		PAC			
		SACH		VAR_GOERZTEL , 1    
		
		;Fx=abs(f(n-1)-f(n-2))		
		LACC		*- , 15          
		SUB			* , 15
		ABS			
		SACH		* , 0     
		
		; (abs(f(n-1)-f(n-2)))^2-2*2*(1+cosf)*f(n-2)*f(n-1)   		
		LT			*                
		MPY			* 
		PAC			 ;注意数据保存在低位
		SUB			VAR_GOERZTEL , 15         ;返回时计算结果保存在acc并且ar1=ar1-1
		RET
 		
*******************************************************
***GOERTZEL算法中的(f(n-2)与f(n-1))计算 
*** f(n)=2*f(n-1)*cosf-f(n-2)+x(n) 
***输入参数: ar7,每次运算循环个数 一次滤波时应该是102个
***          ar1,f(n)(第一个),f(n-1)(第二个)的起始地址
***			 27H,运算的次数 =8次,
***              后向运算应该为4次对应于4个后向频率 ,二次滤波应该为1次 
***			 ar3,cosf的起始地址,为#100H  二次滤波应该为9
***			 ar2,数据缓冲区指针       
***		  	全局变量GOERTZEL_DEC_COUNT,GOERTZEL_DEC_DATA_PTR  
*******************************************************                      
FUN_GOERTZEL_ADD:
		LT			* , AR2  
		LACC		DIV_VALUE_VAR   
		BCND        _GOERTZEL_ADD1 , NEQ
		
_GOERTZEL_ADD:
		LACC		*+ , VAL_VALUE_DIV , AR1   ;x(n)-f(n-2)+2*f(n-1)*cosf
		SUB			*- , 16
		MPY 		* 
		LTD			* , AR3
		LTA			* , AR1
		APAC
		APAC     
		SACH		*+ , 0 , AR7    
		
		
		BANZ		_GOERTZEL_ADD , *- , AR2 
		B			_GOERTZEL_ADD_NEXT;
		
_GOERTZEL_ADD1:
		LACC		*+ , VAL_VALUE_DIV1 , AR1   ;x(n)-f(n-2)+2*f(n-1)*cosf
		SUB			*- , 16
		MPY 		* 
		LTD			* , AR3
		LTA			* , AR1
		APAC
		APAC     
		SACH		*+ , 0 , AR7    
		
		
		BANZ		_GOERTZEL_ADD1 , *- , AR2   
			     
_GOERTZEL_ADD_NEXT:
	    ;************************************************
		LAR			AR7 , #(VAL_SLOTBUF_LONG-1)
		LAR			AR2 , GOERTZEL_DEC_DATA_PTR
		MAR			* , AR1
		MAR			*+ , AR1
		MAR			*+ , AR3
		MAR			*+ , AR3
		LACC		GOERTZEL_DEC_COUNT
		SUB			#1H
		SACL		GOERTZEL_DEC_COUNT
		BCND		FUN_GOERTZEL_ADD , NEQ			
		RET        
		
;******************************************************
;***RTX_INT  
;***发送接收中断 
;***当REC_DEC_STATE<>0时可以接收数据,为=0时正在检测数
;***据或者刚刚复位,没有启动接收
;******************************************************  		
RTX_INT:
		SST			#0 , INT_SAVE_T0           ;保存状态寄存器ST0 , ST1
		SST			#1 , INT_SAVE_T1     
		
		BIT			REC_DEC_STATE , 15           
		BCND		_RTX_INT_2 , TC  
		
		;只向PCM发送数据
		;*********************************************************
		MAR			* , AR5            ;AR5 存放要发送数据的指针
		OUT			*+ , STDR          ;AR0存放的为输出缓冲区最大地址 
		
		CMPR		2                  ;AR5>AR0继续运行 _RTX_INT_1
		BCND		_RTX_INT_1 , TC
		
		LDP			#VAL_B2_DP
		LST			#1 , INT_SAVE_T1
		LST			#0 , INT_SAVE_T0
		CLRC		INTM
		RET
		
_RTX_INT_1:
		LAR			AR5 , #SEND_DTMF_BUF       
		LDP			#VAL_B2_DP
		LST			#1 , INT_SAVE_T1
		LST			#0 , INT_SAVE_T0
		CLRC		INTM
		RET
		
		;发送和接收PCM数据
		;**********************************************************
_RTX_INT_2:                            
		;发送数据
		MAR			* , AR5            ;
		SACL		INT_SACC_L                ;保存ACC
		SACH		INT_SACC_H     
		
		OUT			*+ , STDR
		CMPR		2
		BCND		_RTX_INT_3 , NTC
		LAR			AR5 , #SEND_DTMF_BUF   
		
_RTX_INT_3: 
		IN 			RTX_INT_RECDATA , STDR
		SAR			AR4 , RTX_INT_TEMP            ;AR4保存接收数据指针
		LACC		RTX_INT_TEMP 
		SUB			#(RECDATA_BUF_LONG+RECDATA_BUF); 177AH , 0    ;
		BCND		_RTX_INT_4 , GT      ;
		
		;高8位低时隙  转换为线性数据
		LACC		RTX_INT_RECDATA , 8
		SACH		RTX_INT_TEMP
		LACC		RTX_INT_TEMP
		MAR			* , AR4
		AND			#0FFH , 0     ;这里应该是A率转换为线性数据读表
		ADD			#A_TO_LINE_TBL , 0 	;	   
		TBLR		* , AR4     
		
		;低8位高时隙  转换为线性数据
		LACC		RTX_INT_RECDATA
		AND			#0FFH , 0
		ADRK		#VAL_SLOTBUF_LONG
		ADD			#A_TO_LINE_TBL , 0   ;  784H
		
		TBLR		* , AR4
		ADRK		#VAL_SLOTBUF_LONG   
		
_RTX_INT_4:
		LACC		INT_SACC_H , 16   ;恢复ACC
		OR 			INT_SACC_L    
		
		LDP			#VAL_B2_DP
		LST			#1 , INT_SAVE_T1   ;恢复ST0 , ST1
		LST			#0 , INT_SAVE_T0
		CLRC		INTM  		 
		RET	

**************************************************  
***定时器
**************************************************
TIMER_INT:
       SST			#0 , INT_SAVE_T0           ;保存状态寄存器ST0 , ST1
	   SST			#1 , INT_SAVE_T1   
		
	   SACL			TIMER_SACC_L
	   SACH			TIMER_SACC_H 
	   
	   ;5MS处理     
	   SPLK			#1H , TIMER_5MS_FLAG 
	   
	   LACC			TIMER_5MS_COUNT
	   ADD			#1H
	   SACL			TIMER_5MS_COUNT 
	   SUB			#40   
	   BCND			_TIMER_INT_END , LT 	    
	   
	   ;200MS处理   
	   SPLK			#0H , TIMER_5MS_COUNT   
	   SPLK			#1H , TIMER_200MS_FLAG  
	   
	   LACC         TIMER_200MS_COUNT
	   ADD			#1H
	   SACL			TIMER_200MS_COUNT
	   
	   SUB			#05H
	   ;1S处理
	   BCND			_TIMER_INT_END , LT	   
	   SPLK			#1H , TIMER_1S_FLAG  
	   SPLK			#0H , TIMER_200MS_COUNT

_TIMER_INT_END:	 
       LACC			TIMER_SACC_H , 8
       OR           TIMER_SACC_L
       LDP			#VAL_B2_DP
	   LST			#1 , INT_SAVE_T1   ;恢复ST0 , ST1
	   LST			#0 , INT_SAVE_T0   
	   CLRC			INTM  
       RET


;***************************************************
;***INT2_INT 
;***INT2中断服务程序
;***该中断完成:
;***1. 开始接收标志为0时,初始化接收参数
;***2.接收状态为0(正在检测数据)时,就退出
;***3.REC_PCMDATA_COUNT数为0时,接收缓冲区满,进入检测状态参数初始化
;***4.REC_PCMDATA_COUNT 计数 ,缓冲区头指针+1
;***************************************************
INT2_INT:
		SST			#0 , INT_SAVE_T0      ;保存ST0 , ST1
		SST			#1 , INT_SAVE_T1
		SACL		INT_SACC_L           ;保存ACC
		SACH 		INT_SACC_H      
				 		
		LACC		BEGIN_REC_PCMDATA_FLAG           
		BCND		_INT2_INT_3 , EQ  
		
		LACC		REC_DEC_STATE           ;=0退出
		BCND		_INT2_INT_1 , EQ
		
		LACC		REC_PCMDATA_COUNT
		BCND		_INT2_INT_2 , EQ
		
		;接收数据计数
		;*************************************
		SUB			#1H           ;
		SACL		REC_PCMDATA_COUNT 
		
		;初始化新的接收头指针 		
		LAR			AR4 , REC_FTS_PCMDATA_PTR  
		LACC		REC_FTS_PCMDATA_PTR 
		ADD			#1H
		SACL		REC_FTS_PCMDATA_PTR
		
        
_INT2_INT_1:		
		LACC		INT_SACC_H , 16   ;恢复ACC
		OR			INT_SACC_L
		LDP			#VAL_B2_DP   
		LST			#1 , INT_SAVE_T1    ;恢复ST0 , ST1
		LST			#0 , INT_SAVE_T0
		CLRC		INTM
		RET

_INT2_INT_2:
		;进入检测状态,并定义同步标志
		SACL		REC_DEC_STATE   ;20=0      
		SAR			AR5, INT2_SEND_PTR ;AR5->INT2_SEND_PTR      	
		LACC		INT_SACC_H , 16
		OR			INT_SACC_L  
		  		
		LDP			#VAL_B2_DP	
		OUT			RESET_SSP_T , SSPCR     
		LST			#1 , INT_SAVE_T1
		LST			#0 , INT_SAVE_T0
		CLRC		INTM
		RET

_INT2_INT_3:
		;开始接收数据了
		LACC		#0FFFFH , 0
		SACL		BEGIN_REC_PCMDATA_FLAG
		SACL		REC_DEC_STATE
		LAR			AR4 , REC_FTS_PCMDATA_PTR 
		LAR			AR5 , #(VAL_SEND_BEGIN+2) 
				
		LACC		INT_SACC_H , 16
		OR			INT_SACC_L  
		
		LDP			#VAL_B2_DP	
		OUT			RESET_SSP_T_R , SSPCR   ;控制寄存器
		LST			#1 , INT_SAVE_T1
		LST			#0 , INT_SAVE_T0
		CLRC		INTM			
		RET 

***********************************************************   
*** FUN_TIME_PRO
*** 时间处理任务
***********************************************************	
FUN_TIME_PRO: 
		LACC       TIMER_5MS_FLAG  
		BCND		TIMER_5MS_END , EQ   
		
TIMER_5MS_BEGIN:   ;5MS任务  
		SPLK       #0 , TIMER_5MS_FLAG 
		 
TIMER_5MS_END: 
		BIT			TIMER_5MS_COUNT ,	15  
		BCND        TIMER_10MS_BEGIN , TC 
		B           TIMER_10MS_END
				
TIMER_10MS_BEGIN: ;10MS任务
        CALL		FUN_ASP_PRO   
        ;CALL		FUN_TEST_ERROR  
TIMER_10MS_END:

		;200MS做一次翻转  
        LACC		TIMER_200MS_FLAG
		BCND		TIMER_200MS_END , EQ   
		
TIMER_200MS_BEGIN:  ;200MS任务
		SPLK		#0H , TIMER_200MS_FLAG  		
		
		LACC		XF_CHANGE_COUNT
		ADD			#1H;  
		SACL		XF_CHANGE_COUNT
		
		BIT			XF_CHANGE_COUNT , 15	 ;0位
		BCND		_SETC_XF, NTC 
		CLRC		XF
		B 			TIMER_200MS_END
_SETC_XF:		
		SETC		XF  
		SPLK		#0H , XF_CHANGE_COUNT
		  
TIMER_200MS_END:   

		;1S做一次运行状态检测 
        LACC		TIMER_1S_FLAG
		BCND		TIMER_1S_END , EQ  
		SPLK		#0H , TIMER_1S_FLAG   
		CALL    FUN_TEST_ERROR;检测是否时隙便宜,如果便宜,则挂起,恢复时间为2秒
		;CALL		1S_TASK
		 
TIMER_1S_END: 

_TIME_PRO_END:
		RET  
		
FUN_TEST_ERROR:  
		LACC		INT2_SEND_PTR
		SUB			#(SEND_DTMF_BUF+2) 
		
		BCND		SYNCH_ERROR , NEQ
		SPLK		#0H , SYNCH_COUNT		
		RET  
		
SYNCH_ERROR: ;失步处理
       LACC			SYNCH_COUNT 
       BCND			HUANG_UP_ERROR , NEQ 
       SPLK			#1H , SYNCH_COUNT  
       RET  
       
HUANG_UP_ERROR:    ;程序挂起等待复位
		SETC		INTM
HUANG_UP:	
		B	        HUANG_UP 
		RET
       

      

⌨️ 快捷键说明

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