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