📄 dtmf_255_10k_diag.asm
字号:
;
;
; SOFTWARE DTMF DECODER - TEST PROGRAM
; modified Goertzel algorithm
; timer 2 used to generate interupts at 9765.625hz
; PWM1 output at 19531.25hz
;
;
; (c) 2003 Radu Constantinescu
; constantinescuradu @yahoo.com
; RELEASED UNDER GNU PUBLIC LICENSE
;
;
; Use 255 samples table
; FOR 16F87X / 20 Mhz
; F sample = 5000000/512 hz
;
; DTMF Signal Input at RC1 pin - Schmitt trigger
; BLINK PORT C0 AT EACH CHARACTER
;
;
;
;
;
#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 in GPR
;
;****************************
SAMPLEBIT EQU 0X40
TABLECOUNTER EQU 0X43
TEMP EQU 0X44
LOWTEMPLATE EQU 0X45
HIGHTEMPLATE EQU 0X46
BYTE EQU 0X47
PCLATH_SAVE EQU 0X49
W_TEMP EQU 0X4A
STATUS_TEMP EQU 0X4B
FSR_SAVE EQU 0X4C
;COUNT EQU H'27'
RESULT EQU H'28'
FLAGS EQU H'29'
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
#DEFINE DONE FLAGS,0
#DEFINE ONELIT FLAGS,3
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
temp1l: 1 ; temp 1 lo
temp1h: 1 ; temp 1 hi
temp1C: 1 ; temp 1 Celsius
temp2l: 1 ; temp 2 lo
temp2h: 1 ; temp 2 hi
temp2C: 1 ; temp 2 Celsius
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 0X68
ENDC
CBLOCK 0x72 ; variables for all the RAM pages
comA: 1
comB: 1
comC: 1
comD: 1
ENDC
ORG 0X00
NOP
CLRF STATUS
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
;BCF INTCON,INTF
movlw 1
xorwf PORTC, F ; flip port C0
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)
BTFSC STATUS,Z
BSF DONE
;********************************
;
; 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
ORG 0X100
INIT
;Bank0
clrf PORTC ; program port C<0> for output
movlw B'11111110' ;port C0=out, C1=INPUT
BANKSEL TRISC
movwf TRISC
;Bank0
;BANKSEL TRISB ;Bank1
;BSF TRISB, 1 ;PORTB1 = in
BANKSEL T2CON
MOVLW B'00001100' ; X,1/2 postscale, timer 2 ON ~4.8khz sample rate
MOVWF T2CON
BANKSEL PR2
MOVLW 0XFF ; TIMER 2 PERIOD REGISTER
MOVWF PR2
BANKSEL PIR1
BCF PIR1,TMR2IF ; CLEAR TIMER 2 INT FLAG
BANKSEL PIE1
BSF PIE1,TMR2IE ; START INT FOR TIMER 2
BANKSEL INTCON
BSF INTCON,PEIE ; START PERIPHERAL INT
BSF INTCON,GIE ; START GLOBAL INT
BANKSEL CCP1CON
MOVLW B'00001100'
MOVWF CCP1CON ;PWM 1 ON
BANKSEL TRISC
BCF TRISC,2 ; RC2 = PWM 1 OUT
BANKSEL CCPR1L
MOVLW .128
MOVWF CCPR1L ; 50 DUTY CYCLE ~18KHZ
RETURN
START
call init_disp
call cur_h1
;movlw LOW linie3
;movwf comA
;movlw HIGH linie3
;movwf comB
;call prt_rom
;call cur_h2
;movlw LOW linie3
;movwf comA
;movlw HIGH linie3
;movwf comB
;call prt_rom
;CALL cur_h1
STARTPLUS
BSF DONE ; DO NOT START ....
CALL INIT
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
MOVLW 0 ; table read pointer
MOVWF TABLECOUNTER
BCF DONE ; CLEAR DONE, START
MAIN
BTFSC DONE ; GOT 128 SAMPLES?
GOTO GOT128
nop
nop
GOTO MAIN
GOT128
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
CALL WINNER
GOTO CLEANUP ; START AGAIN
WINNER
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
MOVLW 0X31
MOVWF FSR
;GOTO OUTCHAR
;OUTPUTRESULT
;WINNER
call cur_h1 ; first debug line
movf A697COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
movf A770COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
movf A852COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
movf A941COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
call cur_h2 ; second debug line
movf A1209COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
movf A1336COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
movf A1447COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
movf A1633COS, W
movwf count_1
call dispU8
movlw 0
movwf dig_0 ; place a 0 at the end of the string
BCF STATUS, IRP ; RAM bank 0 -1 indirect
movlw low dig_4
call prt_ram
return
;OUTCHAR
;
;OUTPUT HERE
;
MOVF INDF,W
SUBLW D'64' ;THRESHOLD
RRF RESULT,f
INCF FSR,F
INCF FSR,F
MOVF FSR,W
XORLW 0X41
BTFSS STATUS,Z
RETURN ; GOT TRASH
COMF RESULT,f
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'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -