📄 mainsrc.asm
字号:
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 + -