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

📄 at0.asm

📁 基于Ti DSP系统进行DTMF拨号的实时检测测算代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	.title "DTMF SIGNAL DECTECTOR & GENERATOR"
	.version 50
	.mmregs

LENGTH: .set 120
THRES:  .set 30
ST:     .set 16330

	.sect ".table"
	.label TABLE_SRC
DIGIT:  .int  1, 2, 3,13        ;NUMBER TABLE
	.int  4, 5, 6,14
	.int  7, 8, 9,15
	.int 11, 0,12,10
TRANS:  .int 13, 0, 1, 2        ;ROW&COLUMN ADDRESS TABLE
	.int  4, 5, 6, 8        ;ROW ADDRESS IS LOW GROUP INDEX.
	.int  9,10,15,12        ;COLUMN ADDRESS IS HIGH GROUP INDEX.
	.int 14, 3, 7,11        ;ROW*4+COLUMN (4 BITS) SPANS 0--15.

WEIGHT:   .word 0800H
WEIGHT_L: .word 1220H,1140H,0FC0H,0E40H
WEIGHT_H: .word 0E00H,0CC0H,0AC0H,0800H

CTONE:  .int 7686                   ;DEFAULT AS 450Hz

COS_L:  .int 6995,6739,6425,6055    ;2*COS(WiT)
COS_H:  .int 4768,4081,3271,2329

SINWKT: .int 0, -313                               ;902(-10dB)
	.int 0, -526,0, -575,0, -628,0, -682       ;1012(-9dB)
	.int 0,-1036,0,-1105,0,-1168,0,-1221       ;1274(-7dB)
				    ;SIN(WiKT), SIN[Wi(K-1)T] .
				    ;INITIALIZE K=0.
LP_FILTER:
	.int 7248,-3910,1636,-3037
	.int 5286,-3777,2875,-3369  ;-B,-C,A(AE),AD
	.int 5940,-3146,-818,0      ;-B,-C,AE(-A),0
HP_FILTER:
	.int 5246,-3729,1898,-2789  ;-B,-C,A(AE),AD
	.int 2866,-1412,4022,-7365

DBHL:   .int 450
DBLH:   .int 320

ACT:    .int 0

	.label TABLE_END
		 ; .table section will be mapped into onchip B1
	.sect ".adat"
	.copy "adat.asm"

SEQ:    .usect  ".seq",32
PRCS:   .usect ".cnts",512

	.bss    GET_L,1
	.bss    GET_H,1
	.bss    SMPL,1
	.bss    TEMP,1
	.bss    TEMPX,1
	.bss    SIGN,1
	.bss    COUNTER,1
	.bss    SEQUENCE_SRC,1
	.bss    SEQUENCE_END,1
	.bss    RCV_SLOT,1
	.bss    DCSN_SLOT,1
	.bss    DS,1
	.bss    SAMPLE_L,1
	.bss    SAMPLE_H,1
	.bss    AR3TEMP,1
	.bss    AR4TEMP,1
	.bss    SLOT,1
	.bss    FB_FLAG,1
	.bss    OE_FLAG,1
	.bss    MARK,1
	.bss    DCSN_SIGN,1
	.bss    RECU_SIGN,1
	.bss    S450,1
	.bss    TE,1
	.bss    LOOPC,1
	.bss    ITER,1
	.bss    DTCT_SMPL,16
	.bss    S,80
	.bss    Y,144
	.bss    ENERGY,48

;****************************************************************************
	.sect ".vectors"
RESET:  B INIT
	.space 8*16
RINT:   B ISR2
	.space 6*16
INT4:   B ISR1

;****************************************************************************
	.text
INIT:   LDP #0
	SPLK #3,PDWSR
	CLRC SXM
	SETC OVM
	CLRC XF
	MAR *,0
	LAR  AR0,#PRCS
	RPT  #(CONTENT_END-CONTENT_SRC-1)
	BLPD #CONTENT_SRC,*+    ;LOAD TIME CRITICAL CODES INTO ON_CHIP B0
	SETC CNF                ;MAP B0 INTO PROGRAM MEMORY
	LAR  AR0,#DIGIT
	RPT  #(TABLE_END-TABLE_SRC-1)
	BLPD #TABLE_SRC,*+      ;LOAD DATA TABLES INTO ON_CHIP B1
	OPL #6,PMST             ;ENABLE MULTIPLE TREGs
				;ENABLE EXTRA INDEX REGISTER
	SPLK #2,INDX            ;AUX. REGISTER INDEX STEP=2
	SPLK #8,SPC
				;INITIALIZE SERIAL PORT:
				;FSM=1,MCM=TXM=DLB=FO=0
				;CONTIOUS MODE,16-BIT FORMAT,
				;EXTERNAL CLKX & FSX,
				;NOT LOOPBACK,FREE RUN,
				;PUT SP INTO RESET(XRST=RRST=0)
	SPLK #0FFFFH,IFR
				;CLEAR IFR
	LAR AR0,#SEQUENCE_SRC
	LACC #SEQ
	SACL *+
	SACL *                  ;INITIALIZE THE SEQUENCE POINTER
	LAR AR0,#S
	ZAP
	RPT #80+144+48-1
	SACL *+                 ;CLEAR S,Y,ENERGY

	SPLK #TRANS,CBSR1
	SPLK #TRANS+15,CBER1
	SPLK #9,CBCR            ;AR1 POINTS TO TRANS AS CIRCULAR BUFFER 1
	LAR AR1,#TRANS+2        ;INITIALIZE AR1 TO POINT TO SLOT NO.1

	SPLK #SEQ,CBSR2
	SPLK #SEQ+31,CBER2
	OPL #0A0H,CBCR           ;AR2 POINTS TO SEQ AS CIRCULAR BUFFER 2

	LDP #6
	SPLK #0,RCV_SLOT
	SPLK #0,SIGN             ;THE 16 BITS OF SIGN REPRESENT THE STATES
				 ; OF 16 SLOTS. "1" MEANS ON , "0" MEANS OFF.
	SPLK #0,COUNTER
	SPLK #0,RECU_SIGN        ;RECU_SIGN=0 MEANS NO RECUSION .
	SPLK #1,DCSN_SIGN        ;DCSN_SIGN=1 MEANS NO DECISION .

	SPLK #0,FB_FLAG          ;THE 16 SLOTS AT THE BEGINING OF A FRAME
				 ;ARE AVAILABLE FOR DTMF DETECTION AND
				 ;GENERATION.
	SPLK #13,ITER

	SPLK #0,OE_FLAG          ;EVEN SLOTS OF THE 16 SLOTS WILL BE PROCESSED
				 ;FIRST.

	LAR AR5,#S
	LAR AR6,#Y
	LAR AR7,#ENERGY

	LARP AR2

	LACC #100H
	SAMM IMR
	CLRC INTM


WAIT0:  CPL #1,ACT
	BCND WAIT0,NTC

	SETC INTM
	LDP #0
	OPL  #0C0H,SPC           ;TAKE SP OUT OF RESET
	SPLK #5555H,DXR
	SPLK #010H,IMR           ;TURN ON RINT
	LDP #6
	CLRC INTM
	B DETECT

;****************************************************************************

DETECT: CPL #0,DCSN_SIGN         ;IF DCSN_SIGN=0, GO TO DCSN ROUTINE.
	CC DCSN,TC               ;DCSN_SIGN IS RESET WHEN RECUSIVE CALCUTION
				 ;OF THE MATCHED FILTER COMPLETED, AND SET
				 ;WHEN DECISION COMPLETED.
	LACL SEQUENCE_SRC
	SUB  SEQUENCE_END
	BCND DETECT,EQ           ;SEQUENCE_SRC=SEQUENCE_END MEANS NO FURTHER
				 ;NUMBER DETECTED.
	LAR AR2,SEQUENCE_SRC     ;IF SEQUENCE_SRC != SEQUENCE_END, NEW NUMBER
				 ;DETECTED WILL BE SENT TO 8031 THROUGH I/O
				 ;PORT WITH HAND-SHAKING.
	OUT *+,50H
	SAR AR2,SEQUENCE_SRC     ;UPDATE THE SOURCE POINT.

	SETC XF                  ;SET XF, WAIT UNTIL BIO SET, CLEAR XF.
WAIT2:  CPL #0,DCSN_SIGN
	CC DCSN,TC
	BCND WAIT2,BIO
	CLRC XF
	B DETECT



;****************************************************************************

ISR1:   SAR AR3,AR3TEMP          ;ISR OF EXT. INT4.
	SAR AR4,AR4TEMP          ;INT4 IS ACTIVATED BY 8031.

	IN TEMP,50H       ;GET 5-BIT SLOT INDEX AND 5-BIT DIALING NUMBER.

	APL #0FFH,TEMP    ;ONLY 8 LSBs USED.

	CPL #020H,TEMP
	BCND CMD1,TC

	CPL #030H,TEMP
	BCND CMD2,TC

	CPL #040H,TEMP
	BCND CMD3,TC

	CPL #041H,TEMP
	BCND CMD4,TC

	CPL #042H,TEMP
	BCND CMD5,TC

	CPL #0E0H,TEMP
	BCND CMD6,TC

BACK:   LAR AR3,AR3TEMP
	LAR AR4,AR4TEMP

	RETE

CMD1:   SPLK #00H,FB_FLAG
	SPLK #13,ITER
	B BACK

CMD2:   SPLK #10H,FB_FLAG
	SPLK #3,ITER
	B BACK

CMD3:   SPLK #7791,CTONE
	SPLK #-278,SINWKT+1
	B BACK

CMD4:   SPLK #7686,CTONE
	SPLK #-313,SINWKT+1
	B BACK

CMD5:   SPLK #7568,CTONE
	SPLK #-345,SINWKT+1
	B BACK

CMD6:   SPLK #1,ACT
	B BACK


;****************************************************************************

	.sect   ".content"
	.label  CONTENT_SRC


;****************************************************************************
ISR2:   SAR AR3,AR3TEMP        ;STORE AR3 AND AR4
	SAR AR4,AR4TEMP

	SETC SXM
	LAMM IFR
	AND #01H
	SAMM IFR
	BCNDD XMT,EQ            ;EXT. INT1 IS USED FOR SYNCHRONIZATION.
	LACL #20H
	SAMM IFR                ;CLEAR XMT INTERRUPT FLAG.
				;IF INT1 IS SET THEN:

	SPLK #0FH,RCV_SLOT      ;1. RECEIVED SAMPLE OF SLOT 30 & 31
				;CAN BE GOT FROM THE SERIAL PORT.

	LAR AR1,#TRANS+1        ;2. THE SAMPLE OF SLOT 2 & 3 SHOULD BE PASSED
				;TO THE SERIAL PORT.

XMT:    LARP 1

	LACC *
	AND #0CH
	SFR
	ADD #SINWKT+2
	SAMM AR3                ;ROW ADDRESS -->AR3

	LACC *+,1,AR3
	AND #6
	ADD #SINWKT+10
	SAMM AR4                ;COLUMN ADDRESS -->AR4

	LARP AR3
	LACC *,AR4
	ADD *,AR3
	AND #01FFFH
	ADD #ENC                ;ALAW ENCODE
	TBLR TEMP

	LACC S450,8
	ADD TEMP
	SACL TEMP

	LMMR DXR,#TEMP

	LACL RCV_SLOT
	SUB ITER
	BCND RCV,NEQ
	
REFRESH:LAR AR3,#SINWKT         ;UPDATE 9 SAMPLES AT 9 FREQUENCIES
	LAR AR4,#CTONE          ;WHEN RCV_SLOT=13.
	LARP AR3                ;FORMULA:
	LACL #8                 ;sin[w(k+1)T]=2*cos(wT)*sin(wT)-sin[w(k-1)T].
	SAMM BRCR

	RPTB L0-1
	LT *+,AR4
	MPY *+,AR3
	PAC
	SUB *-,12
	DMOV *
	SACH *0+,4
L0:
	LACC SINWKT
	AND #01FFFH
	ADD #ENC
	TBLR S450

RCV:    CLRC SXM
	LACC RCV_SLOT,1
	XOR FB_FLAG      ;FB_FLAG=00H POINTS TO THE 1ST HALF OF ALL 32 SLOTS.
			 ;FB_FLAG=10H POINTS TO THE 2ND HALF.
	SACL SLOT
	SUB #10H
	BCNDD STEP0,GEQ
	LAMM DRR
	NOP

	SACL TEMP

	LACC #DTCT_SMPL
	ADD SLOT
	SAMM AR3
	LARP AR3
	LACC TEMP,8
	SACH *+
	LACL TEMP
	AND #0FFH
	SACL *           ;STORE THE RECEIVED SAMPLES INTO "DTCT_SMPL" BUFFER

STEP0:  CPL #0,RECU_SIGN       ;IF RECU_SIGN=1 THEN CARRY OUT RECUSION
	BCND RETURN,TC

	LACL RCV_SLOT          ;IF OE_FLAG=0, THEN PROCESS EVEN SLOTS;
	AND #1                 ;IF OE_FLAG=1, THEN PROCESS ODD  SLOTS.
	SUB OE_FLAG
	BCND RETURN,NEQ

	CPL #0,COUNTER         ;IF COUNTER=0, THEN GO TO CLR ROUTINE.
	BCND CLR,TC

	LACC #DTCT_SMPL        ;GET THE SAMPLE FROM DTCT_SMPL BUFFER.
	ADD RCV_SLOT
	SAMM AR3
	LARP AR3        
	LACC #DEC
	ADD *,AR5
	TBLR SMPL

RES:    SETC SXM
	LAR AR4,#LP_FILTER
	LACC SMPL,8     ;/16
	LT *+,AR4       ;TREG0=S
	MPY *+,AR5      ;-B*S
	LTA *,AR4       ;Xn-B*S, TREG0=S_OLD
	MPY *+,AR5      ;-C*S_OLD
	LTA *-,AR4      ;Xn-B*S-C*S_OLD, TREG0=S_OLD

⌨️ 快捷键说明

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