?? dtmf.asm
字號:
; DTMF REMOTE CONTROL
;
; (c) 2003 Radu Constantinescu
; constantinescuradu @yahoo.com
; RELEASED UNDER GNU PUBLIC LICENSE
;
; SOFTWARE DTMF DECODER
; modified Goertzel algorithm
; timer 2 used to generate interupts at 9765.625hz
; PWM1 output at 19531.25hz NOT USED
;
;
; Use 255 samples table
; FOR 16F87X / 20 Mhz
; F sample = 5000000/512 hz = 9765. 625 hz
;
;
; RC0 BEEP OUT
; RC1 DTMF Signal Input - Schmitt trigger
; RC2 PWM1 OUT/ not used
; RC3 HOOK ON OUT
;
; RB0 = OUTPUT1
; RB1 = OUTPUT2
; RB2 = OUTPUT3
; RB3 = OUTPUT4
;
; #PASS#1-4#0-1## SET OUTPUT
; #PASS#1-4## VERIFY OUTPUT
; #PASS#NEWPASS#NEWPASS## CHANGE PASS
; PASS IS 10 DIGITS LONG
;
;
;
;
;Started 9/1/02
;
;
;
;
#include <p16f877.inc>
Bank0: MACRO
bcf STATUS, RP0
bcf STATUS, RP1
ENDM
Bank1: MACRO
bsf STATUS, RP0
bcf STATUS, RP1
ENDM
Bank2: MACRO
bcf STATUS, RP0
bsf STATUS, RP1
ENDM
Bank3: MACRO
bsf STATUS, RP0
bsf STATUS, RP1
ENDM
;****************************
;
;User Variables
;
;****************************
COUNT EQU H'27'
RESULT EQU H'28'
FLAGS EQU H'29'
EE_Byte EQU H'2A' ; variable for EEwrite
;2b
;2c
;2e
;2f
A697SIN EQU H'30'
A697COS EQU H'31' ; ACC
A770SIN EQU H'32'
A770COS EQU H'33' ; ACC
A852SIN EQU H'34'
A852COS EQU H'35' ; ACC
A941SIN EQU H'36'
A941COS EQU H'37' ; ACC
A1209SIN EQU 0X38
A1209COS EQU 0X39 ;ACC
A1336SIN EQU 0X3A
A1336COS EQU 0X3B ;ACC
A1447SIN EQU 0X3C
A1447COS EQU 0X3D ;ACC
A1633SIN EQU 0X3E
A1633COS EQU 0X3F ;ACC
SAMPLEBIT EQU 0X40
FSR_SAVE_DTMF EQU 0X41 ; DTMF START ROUTINE TEMP
TEMP_VAL EQU 0X42
TABLECOUNTER EQU 0X43
TEMP_TIMES EQU 0X44
LOWTEMPLATE EQU 0X45
HIGHTEMPLATE EQU 0X46
BYTE EQU 0X47
RESULT1 EQU 0X48 ; DECODED DIGIT OR 0
PCLATH_SAVE EQU 0X49
W_TEMP EQU 0X4A
STATUS_TEMP EQU 0X4B
FSR_SAVE EQU 0X4C
TIME0 EQU 0X4D ;TIMEOUT LSB
TIME1 EQU 0X4E
TIME2 EQU 0X4F ;TIMEOUT MSB
#DEFINE DONE FLAGS,0
#DEFINE TIMEOUT FLAGS,1
#DEFINE BEEP FLAGS,2
; Utility routines variables
CBLOCK 0x50
scrA: 1 ; scratch pad 0X50
scrB: 1
scrC: 1
scrD: 1
count_1:1 ; counter lsb
count_2:1
count_3:1
count_4:1 ; counter msb
dig_10: 1 ; display digit 10
dig_9: 1 ; display digit 9
dig_8: 1 ; display digit 8
dig_7: 1 ; display digit 7
dig_6: 1 ; display digit 6
dig_5: 1 ; display digit 5
dig_4: 1 ; display digit 4
dig_3: 1 ; display digit 3
dig_2: 1 ; display digit 2
dig_1: 1 ; display digit 1
dig_0: 1 ; end of string 0 0X62
PSS0: 1 ;PASSWORD
PSS1: 1 ;PASSWORD
PSS2: 1 ;PASSWORD
PSS3: 1 ;PASSWORD
PSS4: 1 ;PASSWORD
PSS5: 1 ;PASSWORD
PSS6: 1 ;PASSWORD
PSS7: 1 ;PASSWORD
PSS8: 1 ;PASSWORD
PSS9: 1 ;PASSWORD
ENDC
CBLOCK 0x72 ; variables for all the RAM pages
comA: 1
comB: 1
comC: 1
comD: 1
ENDC
;***********************************************
;EEprom Variables
;***********************************************
OUT0 EQU 0X0
PASS0 EQU 0X8
PASS1 EQU 0X9
PASS2 EQU 0XA
PASS3 EQU 0XB
PASS4 EQU 0XC
PASS5 EQU 0XD
PASS6 EQU 0XE
PASS7 EQU 0XF
PASS8 EQU 0X10
PASS9 EQU 0X11
ORG h'2100' ;EEPROM INITIAL VALUES
DE 0,0,0,0,0,0,0,0
DE "1234567890"
;************************************************
ORG 0X00
NOP
NOP
CLRF STATUS ; ENSURE BANK0
GOTO START
;GOTO STARTPLUS
INTERRUPT_VECTOR
ORG 0X04
;****************************
;
; CONTEXT SAVE
;
;****************************
C_SAVE MOVWF W_TEMP
SWAPF STATUS,W
CLRF STATUS ;ENSURE BANK0 SAVE
MOVWF STATUS_TEMP
MOVF PCLATH,W ; SAVE PCLATH
MOVWF PCLATH_SAVE
MOVF FSR, W
MOVWF FSR_SAVE
BTFSS PIR1,TMR2IF ; Exit ISR if it wasn't a TMR2 Overflow
GOTO C_RESTORE
BCF PIR1,TMR2IF ; RESET TIMER 2 INT FLAG
BTFSC TIMEOUT ; CHECK IF NOT TIMEOUT
GOTO CONTIN1
; DECREMENT TIMEOUT COUNTER
DECF TIME0, F
BTFSS STATUS, Z
GOTO CONTIN1 ; TIME0<>0
DECF TIME1, F
BTFSS STATUS, Z
GOTO CONTIN1 ; TIME1<>0
BSF TIMEOUT ; SET TIMEOUT=TRUE
CONTIN1:
; BEEP COUNTER
BTFSS BEEP ; CHECK IF NOT BEEP
GOTO CONTIN2
DECF scrA,F
BTFSS STATUS, Z
GOTO CONTIN2
movlw 1
xorwf PORTC, F ; flip port C0
MOVF TIME2, W ; RELOAD DELAY
MOVWF scrA
CONTIN2:
BTFSC DONE
GOTO C_RESTORE ; Skip if done
;*****************************
;TEST LEVEL of RC1 and set BYTE
CLRF BYTE
BTFSS PORTC, 1
GOTO CONTINUE
PIN_HIGH
COMF BYTE, F
CONTINUE
;*****************************
;
;Get the expected Lowband Bits
;
;*****************************
MOVLW LOW LOWBAND
ADDWF TABLECOUNTER,W
MOVLW HIGH LOWBAND
BTFSC STATUS,C
ADDLW 1
MOVWF PCLATH
MOVF TABLECOUNTER,W
CALL LOWBAND
CLRF PCLATH
MOVWF LOWTEMPLATE
MOVF BYTE,W
XORWF LOWTEMPLATE, F ; APPLY INPUT OVER MASK
;*****************************
;
;Get the expected Highband Bits
;
;*****************************
MOVLW LOW HIGHBAND
ADDWF TABLECOUNTER,W
MOVLW HIGH HIGHBAND
BTFSC STATUS,C
ADDLW 1
MOVWF PCLATH
MOVF TABLECOUNTER,W
CALL HIGHBAND
CLRF PCLATH
MOVWF HIGHTEMPLATE
MOVF BYTE,W
XORWF HIGHTEMPLATE, F ; APPLY INPUT OVER MASK
;*******************************
;
; LOWTEMPLATE AND HIGHTEMPLATE
; CONTAIN THE EXPECTED VALUES
; FOR THE INCOMING BIT
;
;*******************************
MOVLW LOW A697SIN
MOVWF FSR ;ACCUMULATOR ADDR
MOVLW 8
MOVWF SAMPLEBIT
COMPAREBITL
RLF LOWTEMPLATE,F
BTFSS STATUS,C
GOTO MATCHL
DECF INDF,F
GOTO CONTINL
MATCHL
INCF INDF,F
CONTINL
INCF FSR,F
DECFSZ SAMPLEBIT,F
GOTO COMPAREBITL ;FINISH THE BYTE
MOVLW LOW A1209SIN
MOVWF FSR ;ACCUMULATOR ADDR
MOVLW 8
MOVWF SAMPLEBIT
COMPAREBITH
RLF HIGHTEMPLATE,F
BTFSS STATUS,C
GOTO MATCHH
DECF INDF,F
GOTO CONTINH
MATCHH
INCF INDF,F
CONTINH
INCF FSR,F
DECFSZ SAMPLEBIT,F
GOTO COMPAREBITH ;FINISH THE BYTE
;********************************
;
; Increment Tablecounter 0..255
;
;********************************
INCF TABLECOUNTER,F
MOVF TABLECOUNTER,W
XORLW D'255' ;This is the number of samples to test against (max 7f)
BTFSS STATUS,Z
GOTO C_RESTORE
BSF DONE
; DTMF DECISION ALGORITHM
; compute absolute value acc = ABS(acc)
MOVLW H'30'
MOVWF FSR
TESTFORNEG
BTFSC INDF,7
GOTO NEG
GOTO NEXT
NEG
; SUBTRACT F FROM 0
MOVF INDF,W
SUBLW 0
MOVWF INDF
NEXT
INCF FSR,F
MOVF FSR,W
XORLW H'40'
BTFSS STATUS,Z
GOTO TESTFORNEG
; add acumulator results for sin and cos
MOVLW H'30'
MOVWF FSR
MORERESULTS
MOVF INDF,W
CLRF INDF
INCF FSR,F
ADDWF INDF,F
MOVF FSR,W
INCF FSR,F
XORLW H'3F'
BTFSS STATUS,Z
GOTO MORERESULTS
; compare acc with 64 of 255
MOVLW 0X31
MOVWF FSR
TEMPX1
MOVF INDF,W
SUBLW D'64' ;THRESHOLD
RRF RESULT,F
INCF FSR,F
INCF FSR,F
MOVF FSR,W
XORLW 0X41
BTFSS STATUS,Z
GOTO TEMPX1
COMF RESULT,F
; RESULT IS 1633/1477/1336/1209/941/852/770/697 FOR VALUE>64
; DECISION ALGORITHM : A VALUE MUST BE DETECTED AT LEAST 2-3 TIMES
; BEFORE IS CONSIDERED VALID /
MOVF RESULT, W
XORWF TEMP_VAL,W ; COMPARE RESULT WITH TEMP_VAL
BTFSC STATUS, Z
GOTO DECI1 ; ==
CLRF TEMP_TIMES
MOVF RESULT,W ; TEMP_TIMES = 0
MOVWF TEMP_VAL ; TEMP_VAL = RESULT
GOTO CLEANUP ; START AGAIN
DECI1
MOVLW 0XFF
XORWF TEMP_TIMES,W ; COMPARE TEMP_TIMES/255
BTFSC STATUS,Z
GOTO CLEANUP ; ==255, START AGAIN
INCF TEMP_TIMES, F ; <> 255, INC TEMP_TIMES
DECI3
MOVLW .1 ; 2 TIMES DETECTED -1
XORWF TEMP_TIMES,W
BTFSS STATUS,Z
GOTO CLEANUP ; <> START AGAIN
; GOT ONE VALUE 2 TIMES !!!!!!!!!!!
CLRW
XORWF TEMP_VAL, W ; COMPARE TEMP_VAL / 0
BTFSC STATUS,Z
GOTO CLEANUP ; ==0, START AGAIN
DECI2 ; <>0
;**********************************************
; GOT ONE CHARACTER, CONVERT IT TO ASCII....
;**********************************************
MOVF RESULT,W
XORLW D'17'
BTFSC STATUS,Z
GOTO GOTCHA1
MOVF RESULT,W
XORLW D'33'
BTFSC STATUS,Z
GOTO GOTCHA2
MOVF RESULT,W
XORLW D'65'
BTFSC STATUS,Z
GOTO GOTCHA3
MOVF RESULT,W
XORLW D'18'
BTFSC STATUS,Z
GOTO GOTCHA4
MOVF RESULT,W
XORLW D'34'
BTFSC STATUS,Z
GOTO GOTCHA5
MOVF RESULT,W
XORLW D'66'
BTFSC STATUS,Z
GOTO GOTCHA6
MOVF RESULT,W
XORLW D'20'
BTFSC STATUS,Z
GOTO GOTCHA7
MOVF RESULT,W
XORLW D'36'
BTFSC STATUS,Z
GOTO GOTCHA8
MOVF RESULT,W
XORLW D'68'
BTFSC STATUS,Z
GOTO GOTCHA9
MOVF RESULT,W
XORLW D'40'
BTFSC STATUS,Z
GOTO GOTCHA0
MOVF RESULT,W
XORLW D'72'
BTFSC STATUS,Z
GOTO GOTCHAPOUND
MOVF RESULT,W
XORLW D'24'
BTFSC STATUS,Z
GOTO GOTCHASTAR
; GOT ONLY TRASH...
CLRF TEMP_TIMES
GOTO CLEANUP
; CONVERT ASCII
GOTCHAPOUND
MOVLW H'23'
GOTO SENDIT
GOTCHASTAR
MOVLW H'2A'
GOTO SENDIT
GOTCHA1
MOVLW H'31'
GOTO SENDIT
GOTCHA2
MOVLW H'32'
GOTO SENDIT
GOTCHA3
MOVLW H'33'
GOTO SENDIT
GOTCHA4
MOVLW H'34'
GOTO SENDIT
GOTCHA5
MOVLW H'35'
GOTO SENDIT
GOTCHA6
MOVLW H'36'
GOTO SENDIT
GOTCHA7
MOVLW H'37'
GOTO SENDIT
GOTCHA8
MOVLW H'38'
GOTO SENDIT
GOTCHA9
MOVLW H'39'
GOTO SENDIT
GOTCHA0
MOVLW H'30'
GOTO SENDIT
SENDIT
MOVWF RESULT1 ; PLACE RECEIVED CHAR IN RESULT1
GOTO C_RESTORE
CLEANUP
MOVLW 0X2F ; start -1
MOVWF FSR
TEMPXX
INCF FSR,F
CLRF INDF
MOVF FSR,W
XORLW 0X3F ; CLEAR RAM FROM 0X30-0X3F
BTFSS STATUS,Z
GOTO TEMPXX
; table read pointer
CLRF TABLECOUNTER
BCF DONE ; CLEAR DONE, START
;********************************
;
; Context Restore
;
;********************************
C_RESTORE
CLRF STATUS ;ENSURE BANK0 RESTORE
MOVF FSR_SAVE,W
MOVWF FSR
MOVF PCLATH_SAVE,W
MOVWF PCLATH ; RESTORE PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -