;************************************************************************* ; ; ; PROJETO: CONVERSOR DE SINAL DISCADO PARA DTMF ; ; OBJETIVO: USAR ALARMES ANTIGOS / TELEFONES ANTIGOS (DISCOS), ; CUJAS DISCADORAS SÃO DECADICAS, CONVERTENDO-AS PARA DTMF. ; PRINCIPIO: CAPTURAR O NUMERO DECADICO DISCADO E EM SEGUIDA,COM O USO ; DO TMR0 E TMR1 , GERAR AS FREQUENCIA CORRESPONDENTES AO NUMERO DTMF ; DISCADO, FAZENDO USO DE TABELAS E INTERRUPÇOES DOS TIMERS. ; ; CLAUDIO LÁRIOS 28-08-2011 ;************************************************************************ #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _HS_OSC ; PAGINACAO DE MEMORIA; #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ; VARIAVEIS CBLOCK 0X20 ;ENDERECO INICIAL DE MEMORIA c0,c1,c2,c3,temp,aux,val,cont,VH,VL,W_SALVO,FREQH,FREQL,NUM,R1,R2,R3 endc #DEFINE S1 GPIO,2 ;DTMF- SAIDA alta freq - resistor 470 ohms PINO 5 #DEFINE S2 GPIO,1 ;DTMF- SAIDA baixa freq - resistor 470 ohms PINO 6 #DEFINE PULSO GPIO,0 ;ENTRADA PARA O SINAL DISCADO VIA RESISTOR DE 1K PINO 7 ;high frequency (coloun) XTAL 10MHZ ;1209hz ---> x_SW = 79 128 ;1336hz ---> x_SW = 87 140 ;1477hz ---> x_SW = 96 151 ;1633hz ---> x_SW = 107 161 ;low frequency (row) ;697hz ---> x_SW = 46 33 ;770hz ---> x_SW = 50 54 ;852hz ---> x_SW = 56 74 ;941hz ---> x_SW = 61 91 ; DIALING TONES (dtmf) ; ; 1209 1336 1477 1633 ; ; 697 1 2 3 A ; ; 770 4 5 6 B ; ; 852 7 8 9 C ; ; 941 * 0 # D ;--------------------------------- ORG 0X00 GOTO RESET ;-------------------------------- ORG 0X04 GOTO INT_TIMERS TABH DT .140 ;0 DT .128 ;1 DT .140 ;2 DT .151 ;3 DT .128 ;4 DT .140 ;5 DT .151 ;6 DT .128 ;7 DT .140 ;8 DT .151 ;9 DT .161 ;A DT .161 ;B DT .161 ;C DT .161 ;D DT .128 ;* DT .151 ;# TABL DT .91 ;0 DT .33 ;1 DT .33 ;2 DT .33 ;3 DT .54 ;4 DT .54 ;5 DT .54 ;6 DT .74 ;7 DT .74 ;8 DT .74 ;9 DT .33 ;A DT .54 ;B DT .74 ;C DT .91 ;D DT .91 ;* DT .91 ;# ;--------------MAIN-------------------------- RESET BANK1 MOVLW B'111001' MOVWF TRISIO ; CLRF ANSEL MOVLW B'00000010' MOVWF OPTION_REG MOVLW B'00000001' MOVWF PIE1 BANK0 MOVLW B'00110001' MOVWF T1CON MOVLW B'1100000' MOVWF INTCON MOVLW .0 MOVWF GPIO MOVLW .7 MOVWF CMCON MOVLW 0XFF MOVWF TMR1H MOVLW .10 call delay ;------------------------------------------------------ ; rotina para pegar pulsos decadicos da porta p3.4 e enviar pulsos dtmf inicio: CLRF NUM err1: BTFSC PULSO GOTO $-1 ; jb pulso,$ ;fica aguardando mudança na entrada decadica de 1 para 0 proxpulso: MOVLW 0XFF MOVWF R2 MOVLW 0X04 MOVWF R3 DECFSZ R2,F GOTO $-1 DECFSZ R3 GOTO $-3 BTFSC PULSO GOTO ERR1 INCF NUM MOVLW 0XFF MOVWF C1 MOVLW 0X7F MOVWF C2 BTFSS PULSO GOTO $-1 VAICONTAR DECFSZ C1,F GOTO TESTAOUTRO DECFSZ C2,F GOTO TESTAOUTRO MOVFW NUM ;entrar XORLW 0X0A BTFSS STATUS,Z GOTO NAOMUDA MOVLW 0X00 MOVWF NUM V6 ANDLW 0X0F MOVWF NUM CALL SEND CLRF NUM GOTO INICIO NAOMUDA MOVFW NUM GOTO V6 TESTAOUTRO BTFSS PULSO GOTO PROXPULSO GOTO VAICONTAR ;******************************************************** ; ROTINA DE INTERRUPÇÕES ;--------------------------------------------------------- ; AS FREQUENCIAS DTMF SÃO GERADAS PELAS CARGAS NO TMR0 E TMR1 INT_TIMERS BTFSC PIR1,TMR1IF GOTO V3 BCF INTCON,T0IF MOVWF W_SALVO SWAPF FREQH,W MOVWF TMR0 MOVFW W_SALVO BTFSS S1 GOTO V2 BCF S1 RETFIE V2 BSF S1 RETFIE ;-------------------------------- V3 BCF PIR1,TMR1IF MOVWF W_SALVO SWAPF FREQL,W MOVWF TMR1L MOVLW 0XFF MOVWF TMR1H MOVFW W_SALVO BTFSS S2 GOTO V4 BCF S2 RETFIE V4 BSF S2 RETFIE ;**************************************************** WAIT MOVLW .8 CALL DELAY RETURN DELAY MOVWF C2 CG1 MOVLW 0XFF MOVWF C1 CG2 MOVLW 0X9D MOVWF C0 DECFSZ C0,f GOTO $-1 NOP DECFSZ C1,F GOTO CG2 NOP DECFSZ C2,F GOTO CG1 NOP RETURN GET MOVWF TEMP MOVLW .0 MOVWF PCLATH MOVFW TEMP MOVWF PCL SEND ANDLW 0X0F MOVWF AUX MOVLW TABH ADDWF AUX,W CALL GET MOVWF FREQH SWAPF FREQH,F MOVLW TABL ADDWF AUX,W CALL GET MOVWF FREQL SWAPF FREQL,F BSF INTCON,GIE MOVLW .3 call delay BCF S1 BCF S2 BCF INTCON,GIE MOVLW .2 ;TEMPO MORTO ENTRE ENVIOS CALL DELAY RETURN END