📄 dtmffsk.asm
字号:
;=============================================================
;An example to illustrate how to set the internal adjustable
;CID gain and receive FSK or DTMF data.
;Assume end-code of DTMF data string is "D".
;
;Step1. Initialize the CID system.
;Step2. Setting the CID gain control.
;Step3. Enable Ring detector (assume the FSK/DTMF signal comes
; between 1st and 2nd rings).
;Step4. Enable FSK and DTMF receivers when 1st ring is detected.
;Step5. Check CID interrupt resulted from FSK or DTMF receiver
; by reading CIDFG register.
;
;If FSK interrupt then refer to step5~7.
;If DTMF interrupt then refer to step8
;--FSK---
;Step5. Confirm FSK data string by counting the number of
; consecutive channel seizure.
;Step6. Continuously receive FSK data string and store it in RAM
; till receive all data or time out.
;Step7. Verify if system receives FSK data string correctly
; by comparing check-sum.
;;Jump to Step10
;--DTMF---
;Step8. Read low nibble of DTMFDR to get DTMF decoded data
;Step9. Store DTMF data in RAM.
; Repeat step8 and step9 till end-code "D" is received or time out.
;
;Step10. Process the received data according system need.
;===============================================================
;====Define the flags for FSK receiving ======================
Flag0 reg 23h ;Flag register
Channel_Seizure_Flag reg Flag0.0 ;if the number of recognition is equal to C_Ch_Seiz_Times,set flag
FSK_Data_Flag reg Flag0.1 ;if FSK data string begins, set FSK_Data_Flag
FSK_Format_Flag reg Flag0.2 ;Set when receive FSK format data
FSK_Multiple_Format_Flag reg Flag0.3 ;Set if the FSK format data is equal to 08h
FSK_Single_Format_Flag reg Flag0.4 ;Set if the FSK format data is equal to 04h
FSK_Length_Flag reg Flag0.5 ;Set when receive the FSK length data
FSK_Finish_Flag reg Flag0.6 ;Set when FSK receive data completely and correctly
;--------------------------------------------------------------
Cid_Flag1 reg 24h ;Flag register 1
Multiple_Length_Flag reg Cid_Flag1.0 ;Set when FSK receive parameter type value, clear as FSK gets parameter length
Multiple_Date_Flag reg Cid_Flag1.1 ;Set when FSK receive Data parameter, clear as FSK finish Date receiving
Multiple_Number_Flag reg Cid_Flag1.2 ;Set when FSK receive number parameter, clear as FSK finish number receiving
Multiple_Name_Flag reg Cid_Flag1.3 ;Set when FSK receive name parameter, Clear as finish name receiving
Multiple_Dummy_Flag reg Cid_Flag1.4 ;Set when FSK receiver other paramter, Clear as FSK finish dummy receiving
DTMF_Data_Flag reg Cid_Flag1.5 ;Set when DTMF decoder begins to receive DTMF data
CID_Finish_Flag reg Cid_Flag1.6 ;Set when CID receives completed data correctly
CID_Error_Flag reg Cid_Flag1.7 ;Set when CID (FSK) decoder recieves data incorrectly
;----------------------------------------------------------------
;====Register Definition================================
Cidfg_R reg 60h ;a register store cidfg
Counter1 reg 63h ;normal counter
Counter2 reg 64h ;normal counter
Data_Buffer reg 65h ;noram data buffer
Check_Sum reg 66h ;FSK check sum
Fsk_Data reg 67h ;a register to store FSKDR
DTMF_Data reg 68h ;a register to store DTMF
R0_Dp reg 69h ;save the data pointer of R0
Counter_Channel_Seizure reg 6Ah ;counter to count Channel seizure number
Data_Length reg 6Bh ;Store the FSK data length
Multiple_Parameter_Length reg 6Ch ;Store the multiple parameter length value
WDT_Counter reg 6Dh ;used in WDT interrupt to count the time-out times
Incall_Buf_Pointer_R1 reg R1 ;use R1 to be the data pointer of incall structure buffer
;-----------------------------------------------------------
;====Constant Definition===========================================
;---FSK constant-----------------------------
C_Channel_Seizure equ 055h ;Channel Seizure data
C_Ch_Seiz_Times equ 03h ;Consecutive receiving Channel seizure times
C_Single_Format equ 04h ;Single format code=04h
C_Multiple_Format equ 80h ;Multiple format code=80h
;---CID power control signal ----------
; cidprc: - - - CIDE, - FSKE, CASE, DTMFE
CAS_Enable equ 00011010b ;enable CIDE, CASE
FSK_Enable equ 00011100b ;enable CIDE, FSKE
DTMF_Enable equ 00011001b ;enable CIDE, DTMFE
C_caspt equ 15 ;CAS present time
C_casat equ 24 ;CAS absent time
C_dtmfpt equ 25 ;DTMF present time
C_dtmfat equ 25 ;DTMF absent time
;===CID gain control registers and constants definition==================
;---The Address of Internal CID Gain Control Register---------------------
CIDGD reg F9h ;CID gain control data register
CIDGA reg FAh ;CID gain control address register
C_DTMFR1_Add equ 00h ;DTMFR1 address=00h
C_DTMFR2_Add equ 01h ;DTMFR2 address=01h
C_PGAF_Add equ 02h ;Programmable Gain control Alert tone/FSK address=02h
C_PGAD_Add equ 03h ;Programmable Gain control DTMF
C_PHAD_Add equ 04h ;Programmable Hysteresis alert tone/DTMF
C_PHFL_Add equ 05h ;Programmable Hysteresis FSK/Low pass filter
;---The value of programmable gain and hysteresis ----------------
C_Gain_FD equ 09h ;set FSK/DTMF input gain=10.05dB, PGAF<3:0>
C_Gain_A equ 09h ;set Alert tone input gain=10.05dB, PGAF<7:4>
C_Gain_Row equ 07h ;set DTMF row(low) tone input gain=4.64dB, PGD<3:0>
C_Gain_Col equ 0Ah ;set DTMF column(high) tone input gain=13.53dB, PGD<7:4>
C_Hys_DTMF equ 05h ;set DTMF hysteresis=21mV, PHAD<3:0>
C_Hys_A equ 03h ;set Alert tone hysteresis=22mV, PHAD<7:4>
C_Hys_LP equ 03h ;set FSK Low Pass filter hysteresis=22mV, PHFL<3:0>
C_Hys_FSK equ 03h ;set FSK hysteresis=22mV, PHFL<7:4>
C_dtmfr1 equ 01h ;DTMF register1, row acceptable error freq:2.5%,
C_dtmfr2 equ 01h ;DTMF register2 column acceptable error freq:2.5%
C_Freq_Chg_Rst equ 01h ;1: represents DTMF PT counter will be reset by detected freq. changed
C_No_Down_Count equ 01h ;1: DTMF AT counter is up counter only, 0:is up-down counter
;-----------------------------------------------------------------
org 00h
ljmp Start
org 53h ;The address of CID interrupt vector
ljmp Cid_Int
org 70h
Start:
mov sp,#0d0h ;stack point begins at D0H
mov Counter1,#00
mov Counter2,#00
mov Counter3,#00
mov r0,#80h ;for indirect data pointer from 80H
mov R0_Dp,r0
mov Flag0,#00h
mov Cid_Flag1,#00h
call CID_Gain_Setting ;Setting the internal adjustable CID gain
call FSK_Flag_Initial_Setting ;Set the flags relative FSK to initial state
;---set CID control signals-------------
mov cidpcr,#00h ;Off all CID power
mov cidpcr,#DTMF_Enable ;-, -, -, CIDE, -, FSKE, ASE, DTMFE
orl cidpcr,#Ring_Enable ;enable ring detector
mov dtmfpt,#C_dtmfpt ;Alert Signal Present Time
mov dtmfat,#C_dtmfat ;Alert Signal Absent Time
;----clear all CID related flags--------
mov cidfg,#00h ;-, -, -, -, dtmfdf,fdrf,algof,rngf
mov exif,#00h ;clear exif.2=cidf, exif.3=divf
setb ecid ;enable CID interrupt(EIE.2)
setb ea ;enable global interrupt(IE.7)
;---Stay in a loop to wait for ring detection------------
wait_ring:
jb CID_Finish_Flag,Correct
jb CID_Error_Flag,Error
mov a,dtmfdr ;CASH,CASL,DTMFH,DTMFL,DD3,DD2,DD1,DD0
jmp wait_ring ;User can poll DTMFH/DTMFL by reading dtmfdr register.
Correct:
call CID_Correct_Procedure ;Do some procedure when data received correctly,
clr CID_Finish_Flag ;for example, show the date, time and number on LCD
call FSK_Flag_Initial_Setting ;Set the flags relative FSK to initial state
jmp wait_ring
Error:
call CID_Error_Procedure ;Do some procedure when data received with error
clr CID_Error_Flag
call FSK_Flag_Initial_Setting ;Set the flags relative FSK to initial state
jmp wait_ring
;============================================================================
; Caller ID interrupt
;1. Jump to Ring/CAS/FSK/DTMF interrupt according to CID flags(cidfg)
;2. Ring_Int:
; Enable FSK receiver power
;3. FSK_Int:
; a. Check 3 consucutive Channel_Seizure(55H) at the beginning of the FSK data string?
; If YES: setb Channel_Seizure_Flag and Disable DTMF decoder
; If NO: Clear Counter_Channel_Seizure and jump to reset counter
; and Check if DTMF_Int occurs?
; b. Check Single or Multiple format then sum up the received data:
; The first byte of FSK data string is either 04H(Single) or 80H(Multiple).
; c. Continueously store and sum up received data till the number of received bytes
; is equal to the FSK length data.
; d. Compare the check sum:
; If Correct: setb CID_Finish_Flag
; If Error: setb CID_Error_Flag
;4.DTMF_Int:
; a. Store the low nibble of DTMFDR into DTMF_Data
; b. Check Start or End code.
;============================================================================
Cid_Int:
mov Cidfg_R,cidfg ;record CIDFG register
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -