;************************************************************************************************************* ; DISCADORA_628_NO_TECL_V1.ASM (VERSÃO 1) ; ; PROJETO: (PROTÓTIPO) DISCADORA PARA USO EM ALARMES, COM PIC 16F628A, COM OPÇÃO P/ DECÁDICO (PULSO) OU DTMF, ; ESCOLHENDO MANUALMENTE VIA INTERRUPTOR SW2. ; OBJETIVO: CONECTAR UM DISPOSITIVO (POR EX. ALARME) COM A REDE TELEFONICA, VISANDO ; TRANSMITIR UM SINAL SONORO, INDICANDO A SUA ATUAÇÃO. ; UTILIZA UM TELEFONE COMUM CONECTADO A LINHA, PARA AQUISIÇÃO DE DADOS. ; USE CRISTAL DE 10 MHZ. ; CLAUDIO LÁRIOS INICIO: 26-09-2012 TÉRMINO :29-09-2012 ; USO APENAS PARA FINS DIDÁTICOS. ;************************************************************************************************************ ; ********** COMANDOS ACEITOS NO TECLADO:******************************************************************* ; INICIALMENTE, COLOQUE A CHAVE DE PROGRAMAÇÃO SW2 PARA MODO 'PROG', AO INVÉS DE 'USO'. ; POSICIONE A CHAVE SW1 DE ACORDO COM O TIPO DE LINHA EM USO (DTMF OU PULSO). ; PROGRAMAR NÚMERO A SER DISCADO EM UMA DAS 6 MEMÓRIAS: ; (EM MODO DTMF) DIGITE: (SENHA 4 DIG)(X)(NÚMERO DE TELEFONE ATÉ 20 DIG)(#) ; SENDO X = MEMÓRIA 1 A 6 (AGUARDE ; NO FINAL, 2 BIP CURTOS) ; (EM MODO PULSO) DIGITE: (SENHA 4 DIG)(X)(NÚMERO DE TELEFONE ATÉ 20 DIG) E AGUARDE 2 BIP CURTOS. ; APAGAR NÚMERO DE UMA DAS 6 MEMÓRIAS: ; (EM MODO DTMF) DIGITE: (SENHA 4 DIG)(X)(#) ; SENDO X = MEMÓRIA 1 A 6 (AGUARDE NO FINAL, 2 BIP CURTOS) ; (EM MODO PULSO) DIGITE: (SENHA 4 DIG)(X) E APENAS AGUARDE 2 BIP CURTOS. ; APAGAR NÚMERO DE TODAS AS 6 MEMÓRIAS DE UMA ÚNICA VEZ: ; DIGITE: (SENHA 4 DIG)(7)(0) (AGUARDE NO FINAL, UM BIP LONGO) ; TESTAR DISCAGEM DE NÚMERO DA MEMÓRIA: ; DIGITE: (SENHA 4 DIG)(8)(0) ; DISCARÁ TODOS OS NÚMEROS DAS MEMÓRIAS EM SEQUENCIA ; DIGITE: (SENHA 4 DIG)(8)(X) ; DISCARÁ SOMENTE A MEMÓRIA X ,SENDO X= 1 A 6 ; DEFINIR MODO DE DISCAGEM INTERROMPIDO(PARA DE DISCAR SE ENTRADA DE COMANDO VOLTAR AO GND(DISCA APENAS O 1º NÚMERO): ; DIGITE: (SENHA 4 DIG)(9) (AGUARDE NO FINAL, 2 BIP CURTOS) ; DEFINIR MODO DE DISCAGEM CONTINUO (DISCA EM SEQUENCIA TODOS OS NÚMEROS, MESMO SE ENTRADA DE COMANDO FOR '0': ; DIGITE: (SENHA 4 DIG)(0) (AGUARDE NO FINAL, 2 BIP CURTOS) ; SENDO SENHA = 1234 ,PODENDO SER MODIFICADA NA PARTE 'SENHA INICIAL' DOS 'EQU'S. ; APÓS PROGRAMAR, VOLTE A CHAVE SW2 PARA MODO 'USO'. ;************************************************************************************************************* ERRORLEVEL -302 #INCLUDE ; ARQUIVO PADRAO __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_ON & _HS_OSC & _LVP_OFF ; 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 TEMP,AUX,val,cont,VH,VL,W_SALVO,FREQH,FREQL,NUM,R1,R2,R3,S_TECLA,TIMER1,C0,C1,C2,C3,Z1,Z2 TIMER2, TIMER3, LIMITE, S_VAL,S_ADDRESS,AUX1,S_AD,FLAGS, ADDRESS,RDESL,DBC,T1 ENDC #DEFINE S0 PORTA,2 ;SAIDA DECÁDICA - RESISTOR DE 4K7 AO TRANSITOR DRIVE DO RELE PINO 1 #DEFINE S1 PORTA,3 ;SAIDA-DTMF FREQ ALTA - RESISTOR 470 OHMS PINO 2 #DEFINE S2 PORTA,4 ;SAIDA-DTMF FREQ BAIXA - RESISTOR 680 OHMS PINO 3 #DEFINE DISCAR PORTA,0 ;ENTRADA -COMANDO PARA DISCAR (1) PINO 17 #DEFINE MODO PORTA,1 ;ENTRADA-ESCOLHE DTMF (0) OU DECÁDICO (1)-RESISTOR 220 OHMS PINO 18 ;#DEFINE BIP PORTA,1 ;SAIDA BIP INDICADOR DE TECLA APERTADA/ACEITAÇÃO DE COMAMDO PINO 18 #DEFINE BIP PORTA,3 ;SAIDA-DTMF FREQ ALTA - RESISTOR 470 OHMS PINO 2 ;DTMF RECEBIDO #DEFINE Q1 PORTB,0 ;PINO 6 #DEFINE Q2 PORTB,1 ;PINO 7 #DEFINE Q3 PORTB,2 ;PINO 8 #DEFINE Q4 PORTB,3 ;PINO 9 #DEFINE STD PORTB,4 ;PINO 10 #DEFINE IN_PULSE PORTB,5 ;PINO 11 ;ENTRADA DE SINAL P/ PROGRAMAÇÃO EM MODO 'PULSO' #DEFINE SW_PROG PORTB,6 ;PINO 12 ;ENTRADA DA CHAVE DE PROGRAMAÇÃO (1) /USO (0) #DEFINE TST PORTB,7 ;PINO 13 ;APENAS TESTE ; DEFINIÇÕES DE FLAGS #DEFINE FLAG_J FLAGS,0 ;FLAG TESTE DE DISCAGEM #DEFINE FLAGPROG FLAGS,1 ;FLAG PARA MODO DE PROGRAMAÇÃO ;VARIAVÉIS DE TEMPO T_ESTAB_LINHA EQU .20 ;TEMPO PARA ESTABILIZAÇÃO DA LINHA T_COMP_LIGAC EQU .60 ;TEMPO PARA COMPLETAR LIGAÇÃO (3 SEG) T_OFF_ENTRE_DISC EQU .10 ;TEMPO DESCONECTADO (DESLIGA A LINHA ENTRE DISCAGENS DE NUMEROS DIFERENTES) T_PRE_DISPARO EQU .228 ;TEMPO MORTO PRÉ DISPARO (EVITA DISCAGENS DESNECESSÁRIAS ) .228= 10 SEG. T_SOLTURA EQU .5 ; DEBOUNCE 100 MSEG T_MAX_ESPERA_TECLA EQU .20 ;TEMPO DE ESPERA DTMF (AGUARDA TECLA SER DIGITADA ANTES DE SAIR PARA O 'INICIO') 20= 13 SEG T_MAX_ESPERA_TECLA_P EQU .12 ;TEMPO DE ESPERA PULSO(AGUARDA TECLA SER DIGITADA ANTES DE SAIR PARA O 'INICIO') 12= 10 SEG T_MAX_SOLTAR_TECLA EQU .10 ;TEMPO DE ESPERA PARA SOLTAR TECLA ANTES DE IR PARA O INICIO T_ALARME_NO_FONE EQU .130 ;TEMPO QUE SINAL DE ALARME SERÁ OUVIDO PELO RECEPTOR DO NUMERO DISCADO (.130=40SEG) ;============================================================================================================ ;SENHA INICIAL '1234' PRIMEIRO_NUM EQU .1 ;PRIMEIRO NUMERO DA SENHA INICIAL SEGUNDO_NUM EQU .2 ;PRIMEIRO NUMERO DA SENHA INICIAL TERCEIRO_NUM EQU .3 ;PRIMEIRO NUMERO DA SENHA INICIAL QUARTO_NUM EQU .4 ;PRIMEIRO NUMERO DA SENHA INICIAL ;__________________________________________________________________________________________________________ ;TABELA DE FREQUENCIAS DO SISTEMA DTMF ;ALTA FREQUENCIA (COLUNA) XTAL 10MHZ ;1209hz 79 128 ;1336hz 87 140 ;1477hz 96 151 ;1633hz 107 161 ;BAIXA FREQUENCIA (LINHA)) ;697hz 46 33 ;770hz 50 54 ;852hz 56 74 ;941hz 61 91 ;__________________________________________________________________________________________________________ ;TONS DE DISCAGEM (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 ;TABELAS 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 ;# ;******************************************************** ; ROTINA DE INTERRUPÇÕES (GERA DTMF NAS SAIDAS S1 E S2) ;--------------------------------------------------------- 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 ;**************************************************************** ; RESET DO PROGRAMA ;================================================================ RESET BANK1 MOVLW B'11100011' ; PB2..PB4 SAIDAS / RESTANTE ENTRADAS MOVWF TRISA MOVLW B'01111111' ;PB7...PB0 ENTRADAS MOVWF TRISB 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 PORTA MOVWF PORTB MOVLW .7 MOVWF CMCON CLRF FLAGS MOVLW 0XFF MOVWF TMR1H CLRF RDESL ;******************************************************************************* ; INICIO DO PROGRAMA ;=============================================================================== INICIO BTFSS DISCAR ;TESTA ENTRADA DE COMANDO PARA 'DISCAR' GOTO H3 ;NÃO ACIONADA, VAI ENTÃO VERIFICAR SINAL PARA PROGRAMAÇÃO MOVLW T_PRE_DISPARO ;DELAY PRÉ DISPARO CALL DELAY BTFSS DISCAR GOTO INICIO ;FALSO DISPARO CALL DISCAR_MEM ;DISCA NÚMEROS NA MEMÓRIA GOTO INICIO ;VOLTA AO LOOP PRINCIPAL H3 BTFSS SW_PROG ;TESTA SE CHAVE DE PROGRAMAÇÃO É 1 GOTO INICIO ;NÃO,É 'USO'. ;MODO DE PROGRAMAÇÃO BTFSS MODO ;0= CHAVE EM MODO 'PROG' COM TELEFONE CONECTADO GOTO LER_8870 ;0= TESTA POR SINAL DE PROGRAMAÇÃO DO TIPO 'DTMF' ;=============================================================================== ; ROTINA DE LEITURA DE PULSOS PARA PROGRAMAÇÃO AGUARDA_PULSO ;1= TESTA POR SINAL DE PROGRAMAÇÃO DO TIPO 'PULSO' BTFSC FLAGPROG GOTO PROS8 BTFSS IN_PULSE GOTO INICIO BSF FLAGPROG PROS8 CALL LER_PULSOS BTFSC STATUS,C GOTO INICIO ;SAI XORLW PRIMEIRO_NUM ;SUCESSO: TESTA PRIMEIRO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO CALL CARGA_TMAX_ESPERA_TECLA_P EL1 CALL LER_PULSOS BTFSS STATUS,C GOTO EAPERTADO DECFSZ TIMER1,F GOTO EL1 DECFSZ TIMER2,F GOTO EL1 DECFSZ TIMER3,F GOTO EL1 SAPITA CALL APITA ;APITA E SAI POR TEMPO MOVLW .7 CALL DELAY CALL APITA GOTO INICIO EAPERTADO XORLW SEGUNDO_NUM ;TESTA SE É O SEGUNDO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO CALL CARGA_TMAX_ESPERA_TECLA_P EL2 CALL LER_PULSOS BTFSS STATUS,C GOTO EAPERTADO1 DECFSZ TIMER1,F GOTO EL2 DECFSZ TIMER2,F GOTO EL2 DECFSZ TIMER3,F GOTO EL2 GOTO SAPITA EAPERTADO1 XORLW TERCEIRO_NUM ;TESTA SE É O TERCEIRO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO CALL CARGA_TMAX_ESPERA_TECLA_P EL3 CALL LER_PULSOS BTFSS STATUS,C GOTO EAPERTADO2 DECFSZ TIMER1,F GOTO EL3 DECFSZ TIMER2,F GOTO EL3 DECFSZ TIMER3,F GOTO EL3 GOTO SAPITA EAPERTADO2 XORLW QUARTO_NUM ;TESTA SE É O QUARTO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO CALL CARGA_TMAX_ESPERA_TECLA_P EL4 CALL LER_PULSOS BTFSS STATUS,C GOTO EAPERTADO3 DECFSZ TIMER1,F GOTO EL4 DECFSZ TIMER2,F GOTO EL4 DECFSZ TIMER3,F GOTO EL4 GOTO SAPITA EAPERTADO3 GOTO COMUM_IN ;SEGUE NA ROTINA COMUM ;===================================================================================== ;ROTINA DE LEITURA DE NUMEROS TECLADOS EM MODO 'PULSO' LER_PULSOS BTFSC IN_PULSE GOTO ER5 CLRF S_TECLA PROX_N CLRF T1 DNV1 CALL TXMS_US BTFSC IN_PULSE GOTO COMPARA_1 INCFSZ T1,F GOTO DNV1 BCF FLAGPROG GOTO ER5 ;ERRO:0=> THIGH >125MS COMPARA_1 MOVFW T1 SUBLW .117 BTFSS STATUS,C GOTO SEG_A1 ; SEGUE PROGRAMA GOTO ER5 ; ERRO: TH<50MS (C=1 INDICA ERRO) SEG_A1 CLRF T1 DNV2 CALL TXMS_US BTFSS IN_PULSE GOTO COMPARA_2 INCFSZ T1,F GOTO DNV2 INCF S_TECLA,F ;INCREMENTA REGISTRADOR P/ NUMERO DISCADO MOVFW S_TECLA ;RETORNA NUMERO EM 'W' XORLW .10 BTFSS STATUS,Z GOTO DNV7 CLRW BCF STATUS,C ;LEITURA OK RETURN DNV7 MOVFW S_TECLA BCF STATUS,C ;LEITURA OK RETURN COMPARA_2 MOVFW T1 SUBLW .46 BTFSS STATUS,C GOTO SEG_A2 ;LEITURA OK ;SE =1 ERRO: TLOW <20MS ER5 BSF STATUS,C RETURN SEG_A2 INCF S_TECLA,F GOTO PROX_N ;VOLTA A PEGAR MAIS PULSOS ;=============================================================================== ;ROTINAS DE LEITURA DO MT8870 LER_8870 BTFSS STD ;TESTA SE É VALIDO A CONTEUDO DA SAIDA DO MT8870 GOTO INICIO ;VOLTA AO LOOP PRINCIPAL CALL LE_DEC_8870 ;LÊ AS SAIDAS DO MT 8870 XORLW PRIMEIRO_NUM ;SUCESSO: TESTA PRIMEIRO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO CALL CARGA_TMAX_ESPERA_TECLA_DTMF CL4 BTFSC STD ;AGUARDA SOLTAR TECLA GERADORA DO TOM GOTO FAPERTADO DECFSZ TIMER1,F GOTO CL4 DECFSZ TIMER2,F GOTO CL4 DECFSZ TIMER3,F GOTO CL4 XSAPITA CALL APITA ;APITA E SAI POR TEMPO MOVLW .7 CALL DELAY CALL APITA GOTO INICIO FAPERTADO CALL LE_DEC_8870 XORLW SEGUNDO_NUM ;TESTA SE É O SEGUNDO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO ; NÃO, ENTÃO DESPREZA E VAI PARA O INICIO CALL CARGA_TMAX_ESPERA_TECLA_DTMF CL5 ;FICA LENDO O TECLADO POR UM TEMPO BTFSC STD ;AGUARDA SOLTAR TECLA GERADORA DO TOM GOTO FAPERTADO1A DECFSZ TIMER1,F GOTO CL5 DECFSZ TIMER2,F GOTO CL5 DECFSZ TIMER3,F GOTO CL5 GOTO XSAPITA FAPERTADO1A CALL LE_DEC_8870 XORLW TERCEIRO_NUM ;TESTA SE É O TERCEIRO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO CALL CARGA_TMAX_ESPERA_TECLA_DTMF CL6 ;FICA LENDO O TECLADO POR UM TEMPO BTFSC STD GOTO FAPERTADO2A DECFSZ TIMER1,F GOTO CL6 DECFSZ TIMER2,F GOTO CL6 DECFSZ TIMER3,F GOTO CL6 GOTO XSAPITA FAPERTADO2A CALL LE_DEC_8870 XORLW QUARTO_NUM ;TESTA SE É O QUARTO NUMERO DA SENHA BTFSS STATUS,Z GOTO INICIO CALL CARGA_TMAX_ESPERA_TECLA_DTMF CL7 ;FICA LENDO O TECLADO POR UM TEMPO BTFSC STD GOTO FAPERTADO3A DECFSZ TIMER1,F GOTO CL7 DECFSZ TIMER2,F GOTO CL7 DECFSZ TIMER3,F GOTO CL7 GOTO XSAPITA FAPERTADO3A CALL LE_DEC_8870 COMUM_IN XORLW .1 BTFSC STATUS,Z GOTO EH1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO EH2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO EH3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO EH4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO EH5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO EH6 MOVFW S_TECLA XORLW .7 BTFSC STATUS,Z GOTO APAGAR_TODOS_NUM MOVFW S_TECLA XORLW .8 BTFSC STATUS,Z GOTO TESTE_DISC ;DISCAR NUMEROS PARA TESTE MOVFW S_TECLA XORLW .9 BTFSC STATUS,Z GOTO MODO_INTERROMPIDO MOVFW S_TECLA XORLW .0 BTFSC STATUS,Z GOTO MODO_CONTINUO MOVFW S_TECLA XORLW .10 BTFSC STATUS,Z GOTO MODO_CONTINUO GOTO INICIO ;ERRO ;======================================================== ;GRAVAR MEMÓRIAS NAS POSIÇÕES 1 A 5 EH1 MOVLW .0 MOVWF ADDRESS MOVLW .20 MOVWF LIMITE GOTO SCOM EH2 MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO SCOM EH3 MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO SCOM EH4 MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO SCOM EH5 MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO SCOM EH6 MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE SCOM CALL GRAVANDO_DIGITOS CALL APITA GOTO INICIO ;==================================================== ;SENHA+70 (APAGAR TODAS AS 6 MEMÓRIAS DE NÚMEROS DE UMA VEZ ) APAGAR_TODOS_NUM BTFSC MODO GOTO MODO_PULSEX CALL CARGA_TMAX_ESPERA_TECLA_DTMF CL8 ;FICA LENDO O TECLADO POR UM TEMPO BTFSC STD GOTO FAPERTADO4A DECFSZ TIMER1,F GOTO CL8 DECFSZ TIMER2,F GOTO CL8 DECFSZ TIMER3,F GOTO CL8 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO4A MOVLW T_SOLTURA CALL DELAYS CALL LE_DEC_8870 COMUM_2 XORLW .0 ;0 BTFSS STATUS,Z GOTO INICIO MOVLW 0X78 MOVWF ADDRESS DENOVO3 MOVLW 0XFF CALL WPROM DECFSZ ADDRESS,F GOTO DENOVO3 MOVLW 0XFF CALL WPROM MOVLW .20 MOVWF TIMER1 AP12 CALL APITA ;APITO LONGO PARA INDICAR APAGAMENTO TOTAL DECFSZ TIMER1,F GOTO AP12 GOTO INICIO ;QUANDO EM MODO 'PULSO' APENAS MODO_PULSEX CALL CARGA_TMAX_ESPERA_TECLA_P EL5 CALL LER_PULSOS BTFSS STATUS,C GOTO EAPERTADO4 DECFSZ TIMER1,F GOTO EL5 DECFSZ TIMER2,F GOTO EL5 DECFSZ TIMER3,F GOTO EL5 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO EAPERTADO4 GOTO COMUM_2 ;=============================================================================== ; DISCAR CONTEUDO DA MEMÓRIA ; SENHA+80 = TODOS OS NÚMEROS SÃO DISCADOS ; SENHA+8X = DISCA SOMENTE A MEMÓRIA X, SENDO X= 1...6 TESTE_DISC BTFSC MODO GOTO MODO_PULSEY CALL CARGA_TMAX_ESPERA_TECLA_DTMF CL9 ;FICA LENDO O TECLADO POR UM TEMPO BTFSC STD GOTO FAPERTADO5 DECFSZ TIMER1,F GOTO CL9 DECFSZ TIMER2,F GOTO CL9 DECFSZ TIMER3,F GOTO CL9 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO FAPERTADO5 CALL LE_DEC_8870 COMUM_3 XORLW .0 BTFSC STATUS,Z GOTO DISCA_TODAS MOVFW S_TECLA XORLW .1 BTFSC STATUS,Z GOTO DISCA_1 MOVFW S_TECLA XORLW .2 BTFSC STATUS,Z GOTO DISCA_2 MOVFW S_TECLA XORLW .3 BTFSC STATUS,Z GOTO DISCA_3 MOVFW S_TECLA XORLW .4 BTFSC STATUS,Z GOTO DISCA_4 MOVFW S_TECLA XORLW .5 BTFSC STATUS,Z GOTO DISCA_5 MOVFW S_TECLA XORLW .6 BTFSC STATUS,Z GOTO DISCA_6 GOTO INICIO DISCA_TODAS BSF FLAG_J CALL DISCAR_MEM ;DISCAR TODAS AS 6 MEMÓRIAS P/ TESTE BCF FLAG_J GOTO INICIO DISCA_1 ;DISCA A MEMÓRIA 1 APENAS CLRF ADDRESS MOVLW .20 MOVWF LIMITE GOTO V_DISC_UM DISCA_2 ;DISCA A MEMÓRIA 2 APENAS MOVLW .20 MOVWF ADDRESS MOVLW .40 MOVWF LIMITE GOTO V_DISC_UM DISCA_3 ;DISCA A MEMÓRIA 3 APENAS MOVLW .40 MOVWF ADDRESS MOVLW .60 MOVWF LIMITE GOTO V_DISC_UM DISCA_4 ;DISCA A MEMÓRIA 4 APENAS MOVLW .60 MOVWF ADDRESS MOVLW .80 MOVWF LIMITE GOTO V_DISC_UM DISCA_5 ;DISCA A MEMÓRIA 5 APENAS MOVLW .80 MOVWF ADDRESS MOVLW .100 MOVWF LIMITE GOTO V_DISC_UM DISCA_6 ;DISCA A MEMÓRIA 6 APENAS MOVLW .100 MOVWF ADDRESS MOVLW .120 MOVWF LIMITE V_DISC_UM BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO LIGAÇÃO DESCONECTADA CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY CALL DISCANDO BCF S0 GOTO INICIO MODO_INTERROMPIDO ;PROGRAMA MODO INTERROMPIDO MOVLW 0X7F MOVWF ADDRESS MOVLW .0 GOTO X9 MODO_CONTINUO ;PROGRAMA MODO CONTINUO MOVLW 0X7F MOVWF ADDRESS MOVLW .1 X9 CALL WPROM MOVLW .10 CALL DELAY CALL APITA MOVLW .10 CALL DELAY CALL APITA GOTO INICIO ; QUANDO EM MODO 'PULSO' APENAS MODO_PULSEY CALL CARGA_TMAX_ESPERA_TECLA_P EL6 CALL LER_PULSOS BTFSS STATUS,C GOTO EAPERTADO5 DECFSZ TIMER1,F GOTO EL6 DECFSZ TIMER2,F GOTO EL6 DECFSZ TIMER3,F GOTO EL6 CALL APITA ;APITA E SAI POR TEMPO GOTO INICIO EAPERTADO5 GOTO COMUM_3 ;======================================================= ;SUBROTINAS GERAIS ;======================================================= ;======================================================= ;CARGA DE TEMPO MAXIMO POR ESPERA DE TECLA EM MODO PULSO CARGA_TMAX_ESPERA_TECLA_DTMF MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' RETURN ;================================================================================ ;CARGA DE TEMPO MAXIMO POR ESPERA DE TECLA EM MODO PULSO CARGA_TMAX_ESPERA_TECLA_P MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA_P ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' RETURN ;================================================================================ GRAVANDO_DIGITOS TECLANDO BTFSC MODO GOTO PULSE_ACIONADO MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 30 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' CL10 ;FICA LENDO O TECLADO POR UM TEMPO BTFSC STD GOTO FAPERTADO6A DECFSZ TIMER1,F GOTO CL10 DECFSZ TIMER2,F GOTO CL10 DECFSZ TIMER3,F GOTO CL10 CALL APITA GOTO APAGA_RESTO_DIG ;ENCERRA PROGRAMAÇÃO ZERANDO O RESTO DAS CASAS DA MEMÓRIA FAPERTADO6A CALL LE_DEC_8870 COMUM_T6 XORLW .12 ;SE FOR # (SUSTENIDO) BTFSC STATUS,Z GOTO APAGA_RESTO_DIG ;ENCERRA PROGRAMAÇÃO POR # MOVFW S_TECLA CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 ;CHEGOU NO LIMITE E SAI DE 20 NÚMEROS GOTO TECLANDO ;VAI RECEBER NOVA DIGITAÇÃO APAGA_RESTO_DIG ;APAGA TODAS AS CASAS APÓS # DA MEMÓRIA ESCOLHIDA MOVLW 0XFF CALL WPROM INCF ADDRESS,F MOVFW LIMITE XORWF ADDRESS,W BTFSC STATUS,Z RETLW .1 GOTO APAGA_RESTO_DIG PULSE_ACIONADO CALL CARGA_TMAX_ESPERA_TECLA_P VL1 CALL LER_PULSOS BTFSS STATUS,C GOTO FOI_APERTADO DECFSZ TIMER1,F GOTO VL1 DECFSZ TIMER2,F GOTO VL1 DECFSZ TIMER3,F GOTO VL1 CALL APITA ;APITA E SAI POR TEMPO GOTO APAGA_RESTO_DIG ;ENCERRA PROGRAMAÇÃO ZERANDO O RESTO DAS CASAS DA MEMÓRIA FOI_APERTADO GOTO COMUM_T6 ;===================================================================== ;DISCA OS NÚMEROS GRAVADOS NA MEMÓRIA DISCAR_MEM BSF S0 ;LIGA RELE DA LINHA PINO 1 DO PIC MOVLW T_ESTAB_LINHA CALL DELAY ;TEMPO DE ESTABILIZAÇÃO E OBTENÇÃO DE SINAL DE LINHA MOVLW .0 MOVWF ADDRESS MOVWF S_ADDRESS MOVLW .20 MOVWF LIMITE VAI_DISC_OUTR_MEM CALL RPROM XORLW 0XFF BTFSS STATUS,Z CALL DISCANDO MOVLW .20 ADDWF LIMITE,F MOVFW S_ADDRESS ADDLW .20 MOVWF ADDRESS MOVWF S_ADDRESS XORLW .140 BTFSS STATUS,Z GOTO PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA RETURN PROS343 BCF S0 ;DESCONECTA A LINHA TELEFONICA MOVLW T_OFF_ENTRE_DISC ;TEMPO PARA COMPLETAR A LIGAÇÃO CALL DELAY BSF S0 ;CONECTA A LINHA TELEFONICA MOVLW T_ESTAB_LINHA ;TEMPO DE ESTABILIZAÇÃO DA LINHA 'PÓS GANCHO RETIRADO' CALL DELAY BTFSC FLAG_J GOTO VAI_DISC_OUTR_MEM MOVFW ADDRESS MOVWF S_AD MOVLW 0X7F MOVWF ADDRESS CALL RPROM XORLW .1 ;SE =1 DISCARÁ TODOS OS NÚMEROS, INDEPENDENTE SE DISCAR=0 OU 1 BTFSC STATUS,Z GOTO AUX_J BTFSC DISCAR ;TESTA SE AINDA A COMANDO PARA DISCAR GOTO AUX_J ;SIM ,DISCA PRÓXIMO NÚMERO BCF S0 ;NÃO, DESCONECTA A LINHA TELEFONICA RETURN AUX_J MOVFW S_AD ;RETORNA VALOR SALVO MOVWF ADDRESS GOTO VAI_DISC_OUTR_MEM DISCANDO DISCAR_DE_NOV CALL RPROM MOVWF S_VAL XORLW 0XFF BTFSC STATUS,Z GOTO SOM ;FINALIZA COM NUMERO MENOR QUE 20 DIGITOS BTFSS MODO GOTO M_DTMF ;VAI DISCAR DTMF MOVFW S_VAL ;VAI DISCAR EM MODO PULSO XORLW .0 ;SE '0' BTFSS STATUS,Z GOTO P7RT MOVLW .10 ;CARREGA '10' MOVWF S_VAL P7RT BCF S0 CALL PULSO_66MS ;MAKE PERIOD 66,6 MSEG ;LINHA TELEFONICA FICA COM 48V BSF S0 CALL PULSO_33MS ;BREAK PERIOD 33,3 MSEG ;LINHA FICA COM = +-8 VOLTS (CONECTADA) DECFSZ S_VAL,F GOTO P7RT MOVLW .8 MOVWF AUX JFI4 CALL PULSO_66MS ;PAUSA ENTRE NÚMEROS DISCADOS (8 x (MAKE PERIOD + BREAK PERIODO)) CALL PULSO_33MS DECFSZ AUX,F GOTO JFI4 RTCOMUM INCF ADDRESS,F MOVFW ADDRESS XORWF LIMITE,W BTFSC STATUS,Z GOTO SOM ;SAI POR CHEGAR A LIMITE MÁXIMO DE NUMEROS GOTO DISCAR_DE_NOV RET_VAZ BCF S0 ;DESCONECTA A LINHA TELEFONICA CALL L5_BIP ;GERA 5 BIPS GOTO INICIO ;FINALIZA PORQUE MEMÓRIA NÃO FOI GRAVADA SOM ; SOM A SER OUVIDO PELO ATENDENTE (SIRENE) ; TEMPO DE SOM = 33 SEGUNDOS MOVFW LIMITE ADDLW .236 ;SUBTRAI .20 XORWF ADDRESS,W BTFSC STATUS,Z GOTO RET_VAZ ;RETORNA, PORQUE PRIMEIRA POSIÇÃO DESTA MEMÓRIA ESTA VAZIA MOVLW T_COMP_LIGAC ; TEMPO PARA COMPLETAR LIGAÇÃO CALL DELAY MOVLW T_ALARME_NO_FONE ;TEMPO DO SINAL DE ALARME NO 'FONE' MOVWF TIMER3 GERAR_SOM MOVLW .130 MOVWF AUX1 SOM1 BSF S1 BSF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 BCF S1 BCF S2 MOVLW .230 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 DECFSZ AUX1,F GOTO SOM1 MOVLW .180 MOVWF AUX1 SOM2 BSF S1 BSF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 BCF S1 BCF S2 MOVLW .140 MOVWF AUX NOP NOP NOP NOP DECFSZ AUX,F GOTO $-5 DECFSZ AUX1,F GOTO SOM2 DECFSZ TIMER3,F GOTO GERAR_SOM RETURN M_DTMF MOVFW S_VAL CALL SEND_DTMF CALL PULSO_33MS ;TEMPO ENTRE NUMEROS DISCADOS CALL PULSO_66MS ;TEMPO ENTRE NUMEROS DISCADOS GOTO RTCOMUM RETURN ;======================================================= ; ROTINAS DE TEMPO ;======================================================= 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 DELAYS MOVWF C2 MOVLW .250 MOVWF C1 NOP NOP NOP NOP NOP NOP NOP DECFSZ C1,F GOTO $-.8 DECFSZ C2,F GOTO $-.12 RETURN ;======================================================================= ; PULSOS PADRÕES NO MODO DECÂDICO PULSO_33MS MOVLW .66 GOTO PCG1 PULSO_66MS MOVLW .132 PCG1 MOVWF C1 CALL T500US DECFSZ C1,F GOTO $-2 MOVLW .196 MOVWF C0 DECFSZ C0,F GOTO $-1 RETURN TXMS_US MOVLW .210 MOVWF C0 GOTO FAP T500US MOVLW .250 MOVWF C0 FAP NOP NOP DECFSZ C0,F GOTO FAP RETURN ;=================================================== ; ENVIA NÚMERO A DISCAR PARA SAIDA DTMF S1,S2 ; EM FORMATO DE DUPLO TOM CORRESPONDENTE ;=================================================== SEND_DTMF 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 ;LIGA INTERRUPÇÃO MOVLW .3 call DELAY ;ENVIA POR 145 MSEG BCF S1 BCF S2 BCF INTCON,GIE ;DESLIGA INTERRUPÇÃO MOVLW .2 ;TEMPO MORTO ENTRE ENVIOS 97 MSEG CALL DELAY RETURN GET MOVWF TEMP MOVLW .0 MOVWF PCLATH MOVFW TEMP MOVWF PCL ;==================================================== WPROM ;ESCREVE NA E2PROM DADO=W /ENDEREÇO=ADDRESS BANK1 MOVWF EEDATA ;CARREGA DADO DE 'W' BANK0 MOVFW ADDRESS BANK1 MOVWF EEADR ;APONTA ENDEREÇO DE 'ADDRESS' BCF INTCON,GIE BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR BCF EECON1,WREN BTFSC EECON1,WR GOTO $ - 1 BANK0 RETURN RPROM ;SUB-ROTINA DE LEITURA DE E2PROM W=DADO /ADDRESS=ENDEREÇO MOVFW ADDRESS BANK1 MOVWF EEADR ;APONTA ENDEREÇO DE 'ADDRESS' BSF EECON1,RD ; MOVF EEDATA,W ; BANK0 ; RETURN ;================================================================= ;GERA SINAL SONORO (BIP) APITA MOVLW .250 MOVWF AUX1 VFGF BSF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 BCF BIP MOVLW .100 MOVWF AUX DECFSZ AUX,F GOTO $-1 DECFSZ AUX1,F GOTO VFGF RETURN ;======================================================================= ; GERA BIPS L5_BIP MOVLW .5 ;GERA 5 BIP W_BIP MOVWF TIMER1 ;GERA PELO NUMERO EM 'W' FKW1 CALL APITA ;4 BIPS PARA INDICAR MEMÓRIA VAZIA MOVLW .5 CALL DELAY DECFSZ TIMER1,F GOTO FKW1 RETURN LE_DEC_8870 CLRW BTFSC PORTB,0 ADDLW .1 BTFSC PORTB,1 ADDLW .2 BTFSC PORTB,2 ADDLW .4 BTFSC PORTB,3 ADDLW .8 MOVWF S_TECLA MOVLW .255 MOVWF TIMER1 MOVWF TIMER2 MOVLW T_MAX_ESPERA_TECLA ;ESPERA TECLA SER APERTADA POR 15 SEGUNDOS MOVWF TIMER3 ;DEPOIS DESTE TEMPO SAI PARA O 'INICIO' L07 ;FICA LENDO O TECLADO POR UM TEMPO BTFSS STD GOTO L11 DECFSZ TIMER1,F GOTO L07 DECFSZ TIMER2,F GOTO L07 DECFSZ TIMER3,F GOTO L07 GOTO RESET ;MUITO TEMPO APERTADO, SAI POR TEMPO ,RESETANDO PROGRAMA L11 MOVLW .255 MOVWF Z1 MOVLW .100 ;CARGA DE TEMPO PARA SOLTURA DE TECLA MOVWF Z2 F11 BTFSC STD ;ESPERA STD FICAR '0' POR UM PERIODO GOTO L07 DECFSZ Z1,F GOTO F11 DECFSZ Z2,F GOTO F11 MOVFW S_TECLA XORLW .10 BTFSS STATUS,Z GOTO RCP MOVLW .0 ;TECLA '0' ACIONADA RETURN ;SAI POR TEMPO RCP MOVFW S_TECLA ;RETORNA TECLAS EM 'W' RETURN END