;***************************************************************************************************************************** ; ALARME_3Z.ASM ; DISPOSITIVO DE ALARME C/ 3 ZONAS ; COM OPÇÃO DE SENSORES RF E CONTROLES REMOTOS ; (OBS.SOMENTE SENSORES/CONTROLES COM CIRCUITO INTEGRADO INTERNO DA FAMILIA HT6P20B) ; ACEITA ATÉ 5 CONTROLES REMOTOS E ATÉ 25 SENSORES SEM FIO ; DISCAGEM AUTOMÁTICA, EM CASO DE INVASÃO, PARA ATÉ 4 NÚMEROS TELEFONICOS PRÉVIAMENTE PROGRAMADOS ; PODE SER PROGRAMADO PARA DISCAR EM MODO PULSO OU TOM (DTMF) ; OPÇÃO DE ATIVAR TODO O SISTEMA OU PARTE DELE ( COLOCANDO JUMPER EM 'J1' E 'J2'). ; OPÇÃO DE TEMPO DE DISPARO DA SIRENE: 2MIN30S, 5MIN OU 10MIN, ALTERANDO DEFINIÇÕES DE USUÁRIO E ; RECOMPILANDO. ; ATÉ 3 ZONAS TEMPORIZADAS AO ACIONAR PELO TECLADO, ESCOLHENDO NAS DEFINIÇÕES DO USUÁRIO E RECOMPILANDO ; OPÇÃO DE TROCA DE SENHA PELO USUÁRIO (SENHA DE 4 DIGITOS) ; OPÇÃO DE OBTER SENHA PADRÃO EM CASO DE ESQUECIMENTO DA SENHA DO USUÁRIO. ; REALIZA TESTES DE DISCAGEM PARA CONFERIR PROGRAMAÇÃO DE NÚMEROS TELEFONICOS. ; AUTOR: CLÁUDIO LÁRIOS INÍCIO: 08/07/13 TÉRMINO: 02/08/13 ; ESTE PROGRAMA TEM FINS DIDÁTICOS APENAS. ; ;****************************************************************************************************************************** ; INSTRUÇÕES DE USO DO EQUIPAMENTO ;============================================================================================================================== ; PROGRAMAR CONTROLES REMOTOS (FREQUÊNCIA DE 433MHZ, APENAS COM CI HT6P20B): ; 1) APERTE BOTÃO 'PROG'. COMEÇARÁ A PISCAR LED_ARM_PROG E SERÁ EMITIDO UM BIP. ; 2) APERTE TECLA '1' E SERÁ EMITIDO OUTRO BIP. ; 3) APERTE UM BOTÃO DO CONTROLE REMOTO, PRÓXIMO DA CENTRAL (MAX. 2 METROS) ; E SERÁ EMITIDO OUTRO BIP ; OBS: NA HIPÓTESE DE TENTAR UM CONTROLE/SENSOR JÁ GRAVADO, ENTÃO, NO PASSO 3 ACIMA, IRÁ ACENDER BREVEMENTE O LED_Z3 E APÓS UM ; BIP LONGO, SAIRÁ DO MODO DE PROGRAMAÇÃO. DIGITE A TECLA '#" PARA SAIR ANTECIPADAMENTE DESTE MODO DE PROGRAMAÇÃO. ; CASO DEMORE A TECLAR OU APERTAR O CONTROLE REMOTO, EM 30 SEGUNDOS SAIRÁ DESTE MODO DE PROGRAMAÇÃO. ;****************************************************************************************************************************** ; PROGRAMAR SENSORES (SEM FIO, VIA RF EM 433MHZ, APENAS COM CI HT6P20B): ; 1) APERTE BOTÃO 'PROG'. COMEÇARÁ A PISCAR LED_ARM_PROG E SERÁ EMITIDO UM BIP. ; 2) APERTE TECLA '2' E SERÁ EMITIDO OUTRO BIP. ; 3) ACIONE O SENSOR, PRÓXIMO DA CENTRAL (MAX. 2 METROS) E SERÁ EMITIDO OUTRO BIP (ALGUNS SENSORES TEM UM BOTÃO INTERNO QUE ; TEM QUE SER APERTADO. EM OUTROS MODELOS, APENAS LIGUE A BATERIA QUE EMITIRÁ PULSO POR 3 SEGUNDOS, PARA O APRENDIZADO. ; OBS: NA HIPÓTESE DE TENTAR UM CONTROLE/SENSOR JÁ GRAVADO, ENTÃO, NO PASSO 3 ACIMA, IRÁ ACENDER BREVEMENTE O LED_Z3 E APÓS UM ; BIP LONGO, SAIRÁ DO MODO DE PROGRAMAÇÃO. DIGITE A TECLA '#" PARA SAIR ANTECIPADAMENTE DESTE MODO DE PROGRAMAÇÃO. ; CASO DEMORE A TECLAR OU APERTAR O CONTROLE REMOTO, EM 30 SEGUNDOS SAIRÁ DESTE MODO DE PROGRAMAÇÃO. ;****************************************************************************************************************************** ; ENTRAR EM MODO DE PROGRAMAÇÃO (VIA TECLADO): ; ; 1)DIGITE '#" ; 2) NA SEQUÊNCIA, DIGITE A SENHA. ; O LED ARM/PROG COMEÇARÁ A PISCAR, INDICANDO QUE ESTÁ EM MODO DE PROGRAMAÇÃO. ; PARA SAIR DO MODO DE PROGRAMAÇÃO, DIGITE '#', CESSANDO AS PISCADAS NO LED ARM/PROG. ; USE A TECLA '*' PARA CORRIGIR DIGITAÇÃO ERRADA. ;***************************************************************************************************************************** ; ALTERAR SENHA DE 4 DÍGITOS: ; 1) ENTRE EM MODO DE PROGRAMAÇÃO. ; 2) DIGITE '0'. ; 3) DIGITE A NOVA SENHA E OUVE-SE 3 BIPS. ; 4) DIGITE NOVAMENTE A NOVA SENHA PARA CONFIRMAR E OUVE-SE 3 BIPS, SAINDO DO MODO DE PROGRAMAÇÃO. ; ; OBS. EM CASO DE ESQUECIMENTO DA SENHA, PROCEDA O RESET DA CENTRAL. ;****************************************************************************************************************************** ; RESET DA CENTRAL (VOLTAR A SENHA PADRÃO E APAGAR TODOS CONTROLES E SENSORES GRAVADOS): ; 1) DESLIGUE A ALIMENTAÇÃO ; 2)APERTE O BOTÃO 'PROG' NA PLACA ; 3)MANTENDO O BOTÃO 'PROG' APERTADO, RELIGAR A ALIMENTAÇÃO DO CIRCUITO. ; 4)EM SEGUIDA, O LED 'ARM_PROG' ACENDERÁ E DEPOIS PISCARÁ, E SE ; OUVIRÁ UM BIP LONGO, INDICANDO O RETORNO DA SENHA PARA O VALOR PADRÃO = '1234'. ; TAMBÉM, SERÁ APAGADOS TODOS OS CONTROLES E SENSORES, TENDO QUE REPROGRAMAR UM A UM NOVAMENTE. ;**************************************************************************************************************************** ; PROGRAMAR NÚMEROS TELEFONICOS: ; PERMITE GRAVAR 4 NÚMEROS TELEFÓNICOS DIFERENTES COM 16 DÍGITOS. PARA GRAVAR: ; 1)ENTRE EM MODO DE PROGRAMAÇÃO ; 2)DIGITE '1' PARA FUNÇÃO DE PROGRAMAR NÚMERO ; 3)DIGITE O NÚMERO DA MEMÓRIA A GRAVAR ('1' A '4') ; 4)DIGITE O NÚMERO TELEFONICO COM EEE-DD-NNNN-NN-NN ; ONDE: E= OPERADORA EX: 021 ; D= DDD DA CIDADE ; N= NÚMERO TELEFONICO ; 5)DIGITE '#' PARA FINALIZAR A GRAVAÇÃO E SAIR DO MODO DE PROGRAMAÇÃO ; OBS. SE O NÚMERO TIVER 16 DÍGITOS, JÁ SAIRÁ AUTOMATICAMENTE AO DIGITAR ; O ÚLTIMO DÍGITO. ;***************************************************************************************************************************** ; APAGAR NÚMERO TELEFONICO DA MEMÓRIA: ; 1)ENTRE EM MODO DE PROGRAMAÇÃO ; 2)DIGITE '1' PARA FUNÇÃO DE PROGRAMAR NÚMERO ; 3)DIGITE O NÚMERO DA MEMÓRIA A APAGAR ('1' A '4') ; 4)DIGITE '#' PARA APAGAR A GRAVAÇÃO ANTERIOR E SAIR DO MODO DE PROGRAMAÇÃO ;***************************************************************************************************************************** ; TESTE DE DISCAGEM DE NÚMERO TELEFONICO DA MEMÓRIA: ; 1)ENTRE EM MODO DE PROGRAMAÇÃO ; 2)DIGITE '2' PARA FUNÇÃO DE DISCAR PARA TESTE ; 3)DIGITE O NÚMERO DA MEMÓRIA A DISCAR ('1' A '4') ; A DISCAGEM OCORRERÁ IMEDIATAMENTE, COM O ENVIO DO SINAL DE AVISO DE ALARME POR 20SEG. ; OBS. CASO QUEIRA ENCERRAR ANTECIPADAMENTE O TESTE APÓS INICIADO, DIGITE '#', E SERÁ ; FINALIZADO O TESTE, SAINDO TAMBÉM DO MODO DE PROGRAMAÇÃO. ;***************************************************************************************************************************** ; AJUSTAR MODO DE DISCAGEM ENTRE PULSO OU DTMF: ; 1)ENTRE EM MODO DE PROGRAMAÇÃO ; 2)DIGITE '3' PARA FUNÇÃO DE MODO DE DISCAGEM ; 3)DIGITE '0' PARA MODO PULSO OU '1' PARA DTMF ; OBS. ESTE AJUSTE SERÁ GRAVADO NA EEPROM, NA POSIÇÃO 0X7E, E MESMO DESLIGANDO A ALIMENTAÇÃO, ; NÃO SERÁ PERDIDA ESTA INFORMAÇÃO. ;**************************************************************************************************************************** ; LIGAR O ALARME VIA TECLADO: ; PARA LIGAR O ALARME VIA TECLADO, APENAS DIGITE A SENHA. SERÁ OUVIDO 2 TOQUES NA SIRENE INDICANDO QUE ALARME ; FOI LIGADO. APÓS O QUE, TERÁ UM PERIODO DE TEMPORIZAÇÃO, PARA SAIR DO AMBIENTE E FECHAR AS PORTAS, DE 68 SEGUNDOS. ; TERMINADO ESTE PERIODO, A SIRENE DARÁ UM BREVE TOQUE, INDICANDO QUE, A PARTIR DESTE MOMENTO, SE FOR ABERTO UMA PORTA OU ; ACIONADO UM SENSOR, DENTRO DE 34 SEGUNDOS, O ALARME DISPARARÁ, EXCETO SE FOR ACIONADO O CONTROLE REMOTO OU DIGITADO A ; SENHA PARA DESLIGAR O ALARME. ; OBS. SE UM SETOR ESTIVER ABERTO, OUVIRÁ 5 BREVES TOQUES DE SIRENE E NÃO ARMARÁ. ;**************************************************************************************************************************** ; DESLIGAR ALARME VIA TECLADO: ; PARA DESLIGAR O ALARME VIA TECLADO, APENAS DIGITE A SENHA. SERÁ OUVIDO UM TOQUE DE SIRENE INDICANDO O DESLIGAMENTO. ; APÓS ABRIR UMA PORTA NA ZONA TEMPORIZADA, TERÁ 34 SEGUNDOS PARA DESLIGAR O ALARME, DIGITANDO A SENHA NO TECLADO OU ACIO- ; NANDO O CONTROLE REMOTO. ; NOTA: LIGANDO O ALARME VIA CONTROLE REMOTO NÃO PRODUZ TEMPORIZAÇÃO EM NENHUMA ZONA. SE O ALARME FOR LIGADO POR CONTROLE ; REMOTO, DEVERÁ SER DESLIGADO POR ELE. DO CONTRÁRIO, HAVERÁ DISPARO ATÉ QUE SE DESLIGUE NO TECLADO, DIGITANDO ; A SENHA. ; OBS. O SISTEMA SOMENTE PODE SER ATIVADO SE TODOS OS SENSORES ESTIVEREM FECHADOS (SETORES COM FIO Z1 E Z2). CASO SE TENTE ; LIGAR O ALARME COM ALGUM SENSOR ABERTO, A SIRENE DARÁ 5 BREVES TOQUES PARA INDICAR ESTA CONDIÇÃO. FECHE TODOS OS SENSORES, ; ARME O ALARME VIA TECLADO, E ENTÃO PODERÁ SAIR POR UMA PORTA, DENTRO DO TEMPO PERMITIDO. ; ATENÇÃO: CERTIFIQUE-SE A PORTA DE ACESSO AO TECLADO SEJA LIGADA EM ZONA COM TEMPORIZAÇÃO. ;***************************************************************************************************************************** ; ACIONADO ALARME VIA CONTROLE REMOTO: ; OS CONTROLES DEVERÃO TER SIDO APRENDIDOS (PROGRAMADOS PARA SEREM ACEITOS PELO ALARME). ; APERTE UM DOS BOTÕES: O ALARME LIGARÁ, E SE OUVIRÁ 3 TOQUES DE SIRENE. ; UM NOVO APERTO DE UM DOS BOTÕES: O ALARME SE DESLIGARÁ, OUVINDO-SE ENTÃO UM TOQUE DE SIRENE ; OBS. SE UM SETOR ESTIVER ABERTO, OUVIRÁ 5 BREVES TOQUES DE SIRENE E NÃO ARMARÁ. ;***************************************************************************************************************************** ; FUNÇÃO PÁNICO: ; APERTE E MANTENHA APERTADO UM BOTÃO DO CONTROLE REMOTO ATÉ DISPARAR A SIRENE (POR VOLTA DE 5 SEGUNDOS), E QUANDO DISPARAR ; A SIRENE, SOLTE O BOTÃO IMEDIATAMENTE. ; ALÉM DO DISPARO DA SIRENE, TAMBÉM FARÁ A DISCAGEM AUTOMÁTICA DOS NÚMEROS PREVIAMENTE PROGRAMADOS NAS MEMÓRIAS. ; APERTANDO UM BOTÃO DO CONTROLE NOVAMENTE, ENCERRA A FUNÇÃO PÁNICO E TAMBÉM QUALQUER DISCAGEM EM ANDAMENTO. ; OBS. CASO O BOTÃO CONTINUE APERTADO POR UM TEMPO APÓS O DISPARO DA SIRENE, AO SOLTAR ESTE BOTÃO, TAMBÉM ENCERRARÁ ; A FUNÇÃO PÁNICO. ;****************************************************************************************************************************** ; APAGAR MEMÓRIA DE VIOLAÇÃO DE ZONAS (LEDS DE VIOLAÇÃO): ; APENAS DIGITE A SENHA NO TECLADO, QUE AO LIGAR/DESLIGAR , VIA TECLADO, LIMPARÁ A MEMÓRIA DE VIOLAÇÃO. ;****************************************************************************************************************************** ; TESTAR SENSORES COM A FUNÇÃO 'TESTE DE SENSORES': ; 1)ENTRE EM MODO DE PROGRAMAÇÃO. ; 2)EM SEGUIDA, DIGITE A TECLA '4'(FUNÇÃO TESTE DE SENSORES).A SIRENE JÁ DARÁ UM BREVE TOQUE PARA ANUNCIAR ESTE MODO. ; AO ABRIR OU FECHAR UM SENSOR COM FIO, TOCARÁ BREVEMENTE A SIRENE. NOS SENSORES SEM FIO, HAVERÁ VARIOS TOQUES BREVES DA SIRENE ; ENQUANTO O SENSOR ESTIVER ENVIANDO O SINAL RF (MOMENTO DA DETENÇÃO). ;****************************************************************************************************************************** ; LIMITAÇÃO DO SISTEMA: ; PARA DESLIGAR ALARME VIA TECLADO, APOS DISPARADO A SIRENE, E ESPECIAMENTE NA FASE DE DISCAGEM, OS NÚMEROS DA SENHA DEVERÃO ; SER DIGITADOS LENTAMENTE, SEMPRE APERTANDO/SOLTANDO A TECLA E ESPERANDO ATÉ OUVIR O BIP ANTES DE APERTAR O PRÓXIMO NÚMERO. ; APÓS ESTA FASE DE DISCAGEM, O TECLADO VOLTA A RECEBER OS NÚMEROS DA SENHA COM MAIS RAPIDEZ. ; ; NOTA IMPORTANTE: ESTE PROJETO TRATA-SE DE UM PROTÓTIPO REALIZADO EM PLACA DE PROTOBOARD, NÃO TENDO SIDO TESTADO EM MONTAGEM ; PRÁTICA (INSTALADO EM ALGUMA CASA). PORTANTO, PODERÁ ESTAR SUJEITO A TER BUGS AINDA NÃO IDENTIFICADOS, EM USO NORMAL. ; ESTA SENDO FORNECIDO O ARQUIVO ASM, O QUAL PODERÁ SER MODIFICADO SEGUNDOS AS NECESSIDADES DOS HOBISTAS. ; O AUTOR NÃO SE RESPONSABILIZA POR PROBLEMAS QUE PODERÃO SURGIR COM MONTAGEM, INSTALAÇÃO E USO DESTE EQUIPAMENTO, POR SE ; TRATAR DE MONTAGEM PARA FINS DIDÁTICOS. ;****************************************************************************************************************************** ; PROGRAMA ASM ;============================================================================================================================== ; DEFINIÇÕES DO USUÁRIO (ALTERE CONFORME DESEJAR ANTES DE COMPILAR): ; ESCOLHER QUANTAS E QUAIS ZONAS SERÃO TEMPORIZADAS, VIA TECLADO ; TEMPORIZA ZONAS QUANDO ALARME FOR LIGADO VIA TECLADO, CONFORME A ESCOLHA DE DEFINIÇÕES, PELO USUÁRIO, ALISTADO ABAIXO: #DEFINE TEMPORIZA_Z1 ; DESCOMENTE PARA TEMPORIZAR ZONA 1 (SENSORES C/ FIO)QUANDO ALARME FOR LIGADO VIA TECLADO ;#DEFINE TEMPORIZA_Z2 ; DESCOMENTE PARA TEMPORIZAR ZONA 2 (SENSORES C/ FIO)QUANDO ALARME FOR LIGADO VIA TECLADO #DEFINE TEMPORIZA_Z3 ; DESCOMENTE PARA TEMPORIZAR ZONA 3 (SENSORES S/ FIO) QUANDO ALARME FOR LIGADO VIA TECLADO ; ; OBS. CONVÉM DEIXAR PELO MENOS UMA ZONA TEMPORIZADA PARA PODER USAR O TECLADO DENTRO DO AMBIENTE PROTEGIDO. ; CASO A ZONA 1 NÃO FOR USADA, COLOQUE O JUMPER 'J1' NA PLACA. O MESMO PARA ZONA 2, QUE, SE NÃO USADA, DEVERÁ SER COLOCADO ; O JUMPER 'J2' NA PLACA. ;**************************************************************************************************************************** ; ESCOLHA DO TEMPO EM QUE A SIRENE FICARÁ DISPARADA: ; ATENÇÃO: DESCOMENTE APENAS UMA ÚNICA OPÇÃO E COMENTE AS OUTRAS: ;#DEFINE TEMPO_2MIN ;DESCOMENTE PARA TEMPO DA SIRENE LIGADA POR 2 MINUTOS E 30 SEG #DEFINE TEMPO_5MIN ;DESCOMENTE PARA TEMPO DA SIRENE LIGADA POR 5 MINUTOS ;#DEFINE TEMPO_10MIN ;DESCOMENTE PARA TEMPO DA SIRENE LIGADA POR 10 MINUTOS ; OBS. SE ALGUM SENSOR FICAR ACIONADO, A SIRENE PERMANECERÁ LIGADA, DESPREZANDO O TEMPO ESCOLHIDO. ;**************************************************************************************************************************** ; ESCOLHA DE BLOQUEIO DO SETOR DISPARADO (UM ÚNICO DISPARO APENAS, MESMO QUE O SENSOR FIQUE ABERTO OU FOR NOVAMENTE ACIONADO) #DEFINE BLOQUEAR_Z ;DESCOMENTE PARA BLOQUEAR TODAS AS ZONAS DISPARADAS, CUJO SENSORES PODERÃO FICAR ABERTOS. ;OBS. ESTA FUNÇÃO PERMITE QUE NO CASO DE UMA PORTA OU JANELA ARROMBADA, E NÃO SE CONSIGA FECHA-LA MAIS, QUE O ALARME SÓ DISPARE ; UMA ÚNICA VEZ NAQUELE SETOR. A MEDIDA QUE OUTROS SETORES FOREM SENDO DISPARADOS, SERÃO TAMBÉM BLOQUEADOS. ;**************************************************************************************************************************** ;MODELO DO MICROCONTROLADOR LIST P=16f628A , R=DEC INCLUDE "P16F628A.INC" ;PALAVRA DE CONFIGURAÇÃO ERRORLEVEL -302 ;ELIMINA MENSAGEM DE ERRO __CONFIG _CP_OFF & _PWRTE_ON & _WDT_ON & _HS_OSC & _BODEN_ON & _LVP_OFF & _MCLRE_OFF ;BANCOS #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK0 DE MEMORIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK1 ;RAM CBLOCK 0X20 BOT,RES2,RES1,RES0,RES2A,RES1A,RES0A,R1,R2,TMP,AUX,R_END_MAX,R_END_MIN FLAGS,FLAGS1,FLAGS2,FLAGS3,FLAGS4,FLAGS5,X3,X2,X1,LC,HC,BITCOUNTER T0,T1,T2,T1A,T2A,TEMP,TECLA,TECLA1,XTECLA,XCNT,TEMP1,TEMP2,R_PANICO,GER,GER1 S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S0A,S1A,S2A,S3A,NTD,CTD1 ND,FREQH,FREQL,S_VAL,SAUX,TSOM,T0C,T1C,T2C,ADDRESS,ADDRESS1 ENDC CBLOCK 0X70 WTEMP,STATUSTEMP ;REGISTRADORES ESPELHADOS NOS BANCOS ENDC ;DEFINES FLAGS #DEFINE FLAG_VZ1 FLAGS,0 ;SETANDO= PISCARÁ LED_Z1 #DEFINE FLAG_VZ2 FLAGS,1 ;SETANDO= PISCARÁ LED_Z2 #DEFINE FLAG_VZ3 FLAGS,2 ;SETANDO= PISCARÁ LED_Z3 #DEFINE FLAG_ARM_PROG FLAGS,3 ;SETANDO= PISCARÁ LED_ARM_PROG #DEFINE FLAG_RTEC FLAGS,4 ;SETADO= TECLA RECEBIDA NO BUFFER 'XTECLA' #DEFINE FLAG_APERTADO FLAGS,5 ;SETADO= TECLA AINDA APERTADA #DEFINE FLAG_INZ1 FLAGS,6 ;ESTADO DA ENTRADA ZONA 1 #DEFINE FLAG_INZ2 FLAGS,7 ;ESTADO DA ENTRADA ZONA 2 ;DEFINES FLAGS1 #DEFINE FLAG_PL FLAGS1,0 ;PRIMEIRA LEITURA DE TECLADO #DEFINE FLAG_ROK FLAGS1,1 ;SETADO= RECEPÇÃO RF NO BUFFER RES2...RES0 #DEFINE FLAG FLAGS1,2 ;FLAG AUX #DEFINE FLAG1 FLAGS1,3 ;FLAG DE PRIMEIRA RECEPÇÃO #DEFINE FLAG_REST FLAGS1,4 ;FLAG DE RESTART DA RECEPÇÃO #DEFINE FLAG_TH FLAGS1,5 ;FLAG TRAVA HIGH #DEFINE FLAG_TL FLAGS1,6 ;FLAG TRAVA LOW ;DEFINES FLAGS2 #DEFINE FLAG_CONTROL FLAGS2,0 ;INDICA SE TX RECEBIDO SERÁ GRAVADO COMO CONTROLE OU SENSOR #DEFINE FLAG_ON FLAGS2,1 ;INDICA SE ALARME ESTÁ ARMADO OU DESLIGADO #DEFINE FLAG_SUST FLAGS2,2 ;FLAG DE TECLA 'SUSTENIDO' INICIAL #DEFINE FLAG_CONF FLAGS2,3 ;FLAG DE CONFERENCIA DE SENHA #DEFINE FLAG_NP FLAGS2,4 ;FLAG DE TRAVA EM PROGRAMAÇÃO DE NUMERO DE TELEFONE #DEFINE FLAG_DISCAR FLAGS2,5 ;FLAG DE HABILITAÇÃO PARA DISCAGEM TELEFONICA #DEFINE FLAG_GTOM FLAGS2,6 ;FLAG DE HABILITAÇÃO PARA INTERRUPÇÃO GERADORA DE TOM #DEFINE FLAG_MODO_TOM FLAGS2,7 ;FLAG DE MODO DE DISCAGEM POR TOM OU PULSO ;DEFINE FLAGS3 #DEFINE FLAG_DISC_T1 FLAGS3,0 ;FLAG TRAVA 1 MODO DISCANDO #DEFINE FLAG_DISC_T2 FLAGS3,1 ;FLAG TRAVA 2 MODO DISCANDO #DEFINE FLAG_DISC_T3 FLAGS3,2 ;FLAG TRAVA 3 MODO DISCANDO #DEFINE FLAG_SETDISC FLAGS3,3 ;FLAG TRAVA TEMPO ANTES DE DISCAR #DEFINE FLAG_DISC_M1 FLAGS3,4 ;FLAG TRAVA 1 DISCA MEMÓRIA 1 #DEFINE FLAG_DISC_M2 FLAGS3,5 ;FLAG TRAVA 2 DISCA MEMÓRIA 2 #DEFINE FLAG_DISC_M3 FLAGS3,6 ;FLAG TRAVA 3 DISCA MEMÓRIA 3 #DEFINE FLAG_DISC_M4 FLAGS3,7 ;FLAG TRAVA 4 DISCA MEMÓRIA 4 ;DEFINE FLAGS4 #DEFINE FLAG_JADISCOU FLAGS4,0 ;FLAG DE UNICA RODADA DE DISCAGEM #DEFINE FLAG_N_VAZ FLAGS4,1 ;FLAG DE MEMÓRIA NÃO VAZIA #DEFINE FLAG_TEMPOR FLAGS4,2 ;FLAG DE TEMPORIZAÇÃO AO ACIONAR ALARME VIA TECLADO #DEFINE FLAG_TEMPOR_T1 FLAGS4,3 ;FLAG DE TRAVA PARA TEMPORIZAÇÃO (AUXILIAR DE RESET) #DEFINE FLAG_TEMPOR_ON FLAGS4,4 ;FLAG DE TRAVA PARA TEMPORIZAÇÃO (AUXILIAR DE 'ON AFTER TIME') #DEFINE FLAG_VIOL_Z3 FLAGS4,5 ;FLAG DE VIOLAÇÃO DA ZONA 3 EM MODO TEMPORIZADO #DEFINE FLAG_VIOL_Z2 FLAGS4,6 ;FLAG DE VIOLAÇÃO DA ZONA 2 EM MODO TEMPORIZADO #DEFINE FLAG_VIOL_Z1 FLAGS4,7 ;FLAG DE VIOLAÇÃO DA ZONA 1 EM MODO TEMPORIZADO ;DEFINE FLAGA5 #DEFINE FLAG_INIT_TD FLAGS5,0 ;FLAG DE INICIO DE TEMPO PARA ENTRADA #DEFINE FLAG_INIT_T1 FLAGS5,1 ;FLAG DE TRAVA PARA TEMPO DE INICIO DE ENTRADA #DEFINE FLAG_TESTEZ1 FLAGS5,2 ;FLAG PARA TESTE DE MUDANÇA EM ZONAS #DEFINE FLAG_TESTEZ2 FLAGS5,3 ;FLAG PARA TESTE DE MUDANÇA EM ZONAS #DEFINE FLAG_VZ3A FLAGS5,4 ;FLAG AUX DE VIOLAÇÃO Z3 #DEFINE FLAG_VZ2A FLAGS5,5 ;FLAG AUX DE VIOLAÇÃO Z2 #DEFINE FLAG_VZ1A FLAGS5,6 ;FLAG AUX DE VIOLAÇÃO Z1 #DEFINE FLAG_BLOQ_RX FLAGS5,7 ;FLAG DE BLOQUEIO DE RECEPÇÃO RF ;DEFINES PORTS #DEFINE LED_ARM_PROG PORTB,0 ;PINO 6 - TAMBÉM LED 'ARMADO/PROGRAMAÇÃO' #DEFINE BUZZER PORTB,0 ;PINO 6 - BUZZER #DEFINE LED_Z1 PORTA,0 ;PINO 17- LED DE ESTADO DA ENTRADA DA ZONA 1 #DEFINE LED_Z2 PORTB,7 ;PINO 13- LED DE ESTADO DA ENTRADA DA ZONA 2 #DEFINE LED_Z3 PORTB,6 ;PINO 12- LED DE ESTADO DA ZONA 3 #DEFINE IN_Z1 PORTA,0 ;PINO 17- ENTRADA DA ZONA 1 #DEFINE IN_Z2 PORTB,7 ;PINO 13- ENTRADA DA ZONA 2 #DEFINE TRIS_IN_Z1 TRISA,0 ;TRIS-STATE IN/OUT #DEFINE TRIS_IN_Z2 TRISB,7 ;IDEM #DEFINE TRIS_Z1 TRISIO,0 ;IDEM #DEFINE TRIS_Z2 TRISIO,7 ;IDEM ;TECLADO #DEFINE LIN2 PORTB,4 ;PINO 10 TECLADO #DEFINE LIN3 PORTB,1 ;PINO 7 TECLADO #DEFINE LIN5 PORTB,2 ;PINO 8 TECLADO #DEFINE LIN7 PORTB,3 ;PINO 9 TECLADO #DEFINE TRIS_LIN2 TRISB,4 ;PINO 10 TRIS-STATE IN/OUT #DEFINE TRIS_LIN3 TRISB,1 ;PINO 7 IDEM #DEFINE TRIS_LIN5 TRISB,2 ;PINO 8 IDEM #DEFINE TRIS_LIN7 TRISB,3 ;PINO 9 IDEM #DEFINE RFIN PORTA,1 ;PINO 18 ENTRADA DE RF #DEFINE SIRENE PORTB,5 ;PINO 11 SIRENE #DEFINE PROG PORTA,5 ;PINO 4 BOTÃO 'PROG' #DEFINE RELE_LINHA PORTA,2 ;PINO 1 RELE DA LINHA TELEFONICA #DEFINE TOM2 PORTA,3 ;PINO 2 SAIDA DE TOM P/ LINHA TELEFONICA #DEFINE TOM1 PORTA,4 ;PINO 3 SAIDA DE TOM P/ LINHA TELEFONICA (NECESSITA PULLUP) ;EQUATES DE RECEPÇÃO DE TX TMAX EQU .30 ;TEMPO MÁXIMO (PARA DETERMINAR INTERVALO) .38 QB EQU .24 ;QUANTIDADE DE BITS A RECEBER ;EQUATES DE NUMERO MAXIMO DE CONTROLES E SENSORES SEM FIO QCTRL EQU .5 ;QUANTIDADE MÁXIMA DE CONTROLES REMOTOS QSENS EQU .25 ;QUANTIDADE MÁXIMA DE SENSORES SEM FIO ;EQUATES DE ENDEREÇOS DE AREAS DE GRAVAÇÃO NA EEPROM PARA SENSORES E CONTROLES CTRL_END_MAX EQU (QCTRL * 3) - 1 ;ENDEREÇO MÁXIMO PARA CONTROLES CTRL_END_MIN EQU .0 ;ENDEREÇO INICIAL PARA CONTROLES SENS_END_MAX EQU (QCTRL * 3) + (QSENS * 3) ;ENDEREÇO MAXIMO PARA SENSORES SEM FIO SENS_END_MIN EQU QCTRL * 3 ;ENDEREÇO INICIAL PARA SENSORES SEM FIO MEM_MAX EQU SENS_END_MAX ;MAXIMA POSIÇÃO A SER APAGADA INIT_TELEFONE EQU MEM_MAX + 1 ;INICIO DA POSIÇÃO PARA NÚMEROS TELEFONICOS ;EQUATE PARA TEMPO DA FUNÇÃO PANICO V_PANICO EQU .240 ;VALOR PARA AJUSTE DA FUNÇÃO PANICO ;EQUATE PARA DISCAGEM CBYTES_A_DISCAR EQU .8 ;NÚMERO DE BYTES A DISCAR (16 NÚMEROS MÁX.) ;================================================================================ ; RESET DO PROGRAMA ;================================================================================ ORG 0X00 INIT CALL START ;CHAMA ROTINA DE INICIALIZAÇÃO GOTO MAIN ;VAI PARA A ROTINA PRINCIPAL ;================================================================================ ; INTERRUPÇÕES ;================================================================================ ORG 0X04 GOTO INT_TMR0 ;INTERRUPÇÕES DO TIMER 0 E ... ;================================================================================ ;__________________________________________________________________________________________________________ ;TABELA DE FREQUENCIAS DO SISTEMA DTMF: ;ALTA FREQUENCIA (COLUNA) XTAL 10MHZ ;1209hz 128 ;1336hz 140 ;1477hz 151 ;1633hz 161 ;BAIXA FREQUENCIA (LINHA)) ;697hz 33 ;770hz 54 ;852hz 75 ;941hz 92 ;__________________________________________________________________________________________________________ ;TONS DE DISCAGEM (DTMF) PARA CADA TECLA ACIONADA: ; ; 1209 1336 1477 1633 ; ; 697 1 2 3 A ; ; 770 4 5 6 B ; ; 852 7 8 9 C ; ; 941 * 0 # D ;___________________________________________________________________________________________________________ ;================================================================================ ; TABELAS PARA GERAÇÃO DE TOM DE DISCAGEM ;================================================================================ GET CLRF PCLATH MOVWF PCL ;TABELAS AJUSTADAS POR TENTATIVA E ERRO P/ FREQUENCIA DE XTAL DE 10 MHZ 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 ABAIXO: NÃO USADAS DT .161 ;B DT .161 ;C DT .161 ;D DT .128 ;* DT .151 ;# TABL DT .92 ;0 DT .33 ;1 DT .33 ;2 DT .33 ;3 DT .54 ;4 DT .54 ;5 DT .54 ;6 DT .75 ;7 DT .75 ;8 DT .75 ;9 DT .33 ;A ABAIXO: NÃO USADAS DT .54 ;B DT .75 ;C DT .92 ;D DT .92 ;* DT .92 ;# ;================================================================================ ; ROTINA PRINCIPAL ;================================================================================ MAIN ;================================================================================ ; RECEPÇÃO DE NÚMEROS DIGITADOS NO TECLADO ;================================================================================ ; TECLADO MODO ACIONAMENTO/PROGRAMAÇÃO DE SENHAS,NÚMERO DE TELEFONES, DISCAGENS,ETC TECLADO BTFSS FLAG_RTEC ;AGUARDA RECEPÇÃO GOTO EM_TESTE_SENSE ;VERIFICA SE ESTÁ EM MODO DE TESTE DE SENSORES (PASSO 6) BCF FLAG_RTEC ;APAGA FLAG DE RECEPÇÃO CALL BIP ;BIP SINALIZADOR CLRF T2 MOVLW .11 ;TECLA '#' XORWF XTECLA,W BTFSC STATUS,Z GOTO TGER ;TESTA SE GER=0 ;SENÃO ,SAI DO MODO DE PROGRAMAÇÃO MOVLW .10 ;TECLA '*' XORWF XTECLA,W BTFSS STATUS,Z GOTO VER_GER ;CORRIGIR DIGITAÇÃO DO INICIO CALL CARGA_NTD ;CARGA PARA 4 DIGITOS NOVAMENTE GOTO SAI_TECLADO EM_TESTE_SENSE ;ESTÁ EM MODO TESTE DE SENSORES? MOVFW GER ;CARREGA 'W' COM VALOR DO GERENCIADOR DE PASSOS XORLW .6 ;COMPARA COM PASSO 6 - TESTE DE SENSORES BTFSC STATUS,Z GOTO ROTINA_TESTE_SENSE ;SIM, VAI PARA A ROTINA DE TESTE ;=============================================================================== ; BLOQUEAR RECEPÇÃO DE SENSORES E CONTROLES EM MODO DE PROGRAMAÇÃO ;=============================================================================== MOVF GER,F ;CARREGA 'W' COM VALOR DO GERENCIADOR DE PASSOS BTFSS STATUS,Z BSF FLAG_BLOQ_RX ;NÃO PERMITE RECEPÇÃO RF (EXCETO PASSOS 0 E 6) GOTO SAI_TECLADO ;NÃO, SAI DA ROTINA DE TECLADO ;FIM DA ROTINA DE BLOQUEIO ;============================================================================ ;============================================================================ ; SELETOR DE PASSOS ;============================================================================ TGER MOVFW GER ;VERIFICA QUAL FUNÇÃO EXECUTAR XORLW .3 ;SE = 3 BTFSC STATUS,Z GOTO GRAVA_NUMEROS_EEPROM ;GRAVA NÚMEROS TELEFONICOS MOVF GER,F ;TESTA SE = 0 BTFSS STATUS,Z GOTO SAI_MOD1 ;SAI DO MODO DE PROGRAMAÇÃO VER_GER CLRF PCLATH ;ACERTA JUMP NA PAGINA CORRETA MOVFW GER ANDLW 0X07 ;LIMITA A 8 POSSIBILIDADES DE SALTO ADDWF PCL,F ;REALIZA UM SALTO 'GOTO' GOTO PASSO_0 ;RECEBE SENHA OU MODO PROGRAMAÇÃO GOTO PASSO_1 ;RECEBE DIGITO DE FUNÇÃO NO MODO DE PROGRAMAÇÃO GOTO PASSO_2 ;TROCA DE SENHA - DIGITE FUNÇÃO '0' (APOS ENTRAR M.PROG.) GOTO PASSO_3 ;PROGR. NUM.TELEFONE - DIGITE FUNÇÃO '1' + NUM.MEMÓRIA (1 A 4) GOTO PASSO_4 ;DISCAR NÚMEROS TELEFONICOS PROGRAMADOS NA MEMÓRIA - DIGITE FUNÇÃO '2' + NUM.MEMÓRIA (1 A 4) GOTO PASSO_5 ;MODO TOM OU PULSO- DIGITE FUNÇÃO '3' + '0'=PULSO OU '1'=TOM GOTO PASSO_6 ;MODO TESTE DE SENSORES GOTO SAI_MOD1 ;NÃO USADO,SAI DO MODO DE PROGRAMAÇÃO ;================================================================================ ; PASSO 6 - TESTAR ABERTO/FECHADO DAS ZONAS 1 E 2 USANDO TOQUES DE SIRENE ;================================================================================ ;A CADA MUDANÇA DE ESTADO DE SENSORES COM FIO SERÁ GERADO UM TOQUE DE SIRENE ;SENSORES SEM FIO DARÃO BREVES TOQUES ENQUANTO ESTIVER TRANSMITINDO. PASSO_6 ; MP + 4 CLRF T2 ;RESETA CONTADOR ROTINA_TESTE_SENSE BTFSS FLAG_RTEC ;TESTA RECEPÇÃO DE TECLADO GOTO SEGLW1 ;NADA DIGITADO BCF FLAG_RTEC MOVFW XTECLA XORLW .11 ;SE DIGITADO '#' BTFSC STATUS,Z GOTO SAI_B_PROG_ERRO ;SAI DESTE MODO DE PROGRAMAÇÃO SEGLW1 BTFSS FLAG_INZ1 ;TESTA FLAG DE ESTADO DA ENTRADA Z1 GOTO SFZ1_0 BTFSS FLAG_TESTEZ1 ;FLAG AUX DE MUDANÇAS GOTO IR_TESTAR_Z2 CALL HUM_TOQUE_SIRENE_TESTE ; DÁ UM TOQUE DE SIRENE CLRF T2 ;RESETA CONTADOR BCF FLAG_TESTEZ1 GOTO IR_TESTAR_Z2 SFZ1_0 BTFSC FLAG_TESTEZ1 GOTO IR_TESTAR_Z2 CALL HUM_TOQUE_SIRENE_TESTE ; DÁ UM TOQUE DE SIRENE CLRF T2 ;RESETA CONTADOR BSF FLAG_TESTEZ1 IR_TESTAR_Z2 BTFSS FLAG_INZ2 GOTO SFZ2_0 BTFSS FLAG_TESTEZ2 GOTO IR_TESTAR_Z3 CALL HUM_TOQUE_SIRENE_TESTE ; DÁ UM TOQUE DE SIRENE CLRF T2 ;RESETA CONTADOR BCF FLAG_TESTEZ2 GOTO IR_TESTAR_Z3 SFZ2_0 BTFSC FLAG_TESTEZ2 GOTO IR_TESTAR_Z3 CALL HUM_TOQUE_SIRENE_TESTE ; DÁ UM TOQUE DE SIRENE CLRF T2 ;RESETA CONTADOR BSF FLAG_TESTEZ2 IR_TESTAR_Z3 GOTO SAI_TECLADO ;SAI DA ROTINA DO TECLADO ;================================================================================ ; PASSO 5 - PROGRAMAR MODO DE DISCAGEM - 0=PULSO 1=TOM ;================================================================================ PASSO_5 ; MP + 3 + 0...1 MOVFW XTECLA ;TESTA SE A TECLA APERTADA FOI '1' OU '0' SUBLW .1 BTFSS STATUS,C GOTO N_ERR ;NÚMERO DIGITADO INVÁLIDO (SOMENTE '1' OU '0') MOVFW XTECLA ;USA O NÚMERO DIGITADO ANDLW 0X01 MOVWF TMP ;COLOCA NO BUFFER DE GRAVAÇÃO DA EEPROM MOVLW 0X7D ;DÁ O ENDEREÇO A GRAVAR CALL EEWRITE ;GRAVA A OPÇÃO DE TOM OU PULSO NA EEPROM MOVF XTECLA,F BCF FLAG_MODO_TOM ;ACERTA FLAG PARA A ESCOLHA ATUAL BTFSS STATUS,Z BSF FLAG_MODO_TOM CALL BIP ;BIP GOTO SAI_MOD1 ;SAI DA ROTINA DO TECLADO ;================================================================================ ; PASSO 4 - DISCAR O NÚMERO DE TELEFONE (4 MEMÓRIAS DE 16 DIGITOS CADA) ;================================================================================ PASSO_4 ; MP + 2 + 1...4 OBS. DISQUE '#" PARA ENCERRAR ANTECIPADO O TESTE. ; XTECLA JÁ TERÁ O NÚMERO DA MEMÓRIA A TESTAR MOVF GER1,F BTFSS STATUS,Z GOTO TESTA_FIM_DISCAGEM MOVLW INIT_TELEFONE +1 ;INICIO DA EEPROM PARA NÚMEROS TELEFONICOS MOVWF ADDRESS1 ;CARREGA BUFFER DE ENDEREÇO DA EEPROM MOVF XTECLA,F ;TESTA SE = '0' BTFSC STATUS,Z GOTO ERRO_DIGITAC ;NÚMERO DA MEMÓRIA INVÁLIDO (NÃO HÁ MEMÓRIA '0') MOVFW XTECLA ;NÚMERO DA MEMÓRIA A DISCAR MOVWF TEMP SUBLW .4 BTFSS STATUS,C GOTO ERRO_DIGITAC ;NÚMERO DA MEMÓRIA INVÁLIDO DECF TEMP,F ;FAZ CORREÇÃO PARA DESLOCAMENTO MOVLW 0X03 ANDWF TEMP,F ;LIMITA BCF STATUS,C ;DESLOCA P/ ESQUERDA (MULTIPLICA POR 2) RLF TEMP,F ;X2 BCF STATUS,C RLF TEMP,F ;X4 BCF STATUS,C RLF TEMP,F ;X8 MOVFW TEMP ADDWF ADDRESS1,F ;CORRIGE ENDEREÇO CONFORME NUMERO DA MEMORIA DECF ADDRESS1,F ;PRÉ-AJUSTA ADDRESS COM ENDEREÇO INICIAL DA EEPROM A GRAVAR BSF FLAG_DISCAR ;HABILITA DISCAGEM COM INICIO DE ENDEREÇO EM 'ADDRESS' BCF FLAG_DISC_T1 ;LIBERA FLAGS TRAVAS PARA CONTINUAÇÃO DE DISCAGEM BCF FLAG_DISC_T2 BCF FLAG_DISC_T3 BSF FLAG_SETDISC ;LIBERA FLAG DE FIM DE SETUP MOVLW .1 MOVWF GER1 ;ACENA PARA PRÓXIMA ETAPA MOVLW CBYTES_A_DISCAR MOVWF CTD1 ;CARGA DO NÚMERO MÁXIMO DE 'BYTES /2' A DISCAR GOTO SAI_TECLADO TESTA_FIM_DISCAGEM BTFSC FLAG_DISCAR GOTO SAI_TECLADO ;AINDA NÃO DISCOU TODO O NÚMERO BCF RELE_LINHA GOTO SAI_MOD1 ;JÁ ACABOU ERRO_DIGITAC CALL BIP_LONGO ;BIP LONGO PARA INDICAR ERROS DE DIGITAÇÃO GOTO SAI_MOD1 ;================================================================================ ; PASSO 3 - PROGRAMAR NÚMEROS DE TELEFONES (4 MEMÓRIAS DE 16 DIGITOS CADA) ;================================================================================ PASSO_3 ; MP + 1 + 1...4 ;SETA BITS DE S0...S15 MOVF GER1,F BTFSS STATUS,Z GOTO PULAFF ;================================================================================= ; PREPARAÇÃO PARA APAGAMENTO DE UMA MEMÓRIA DE DISCAGEM ;================================================================================= ;REINICIA BUFFER S0...S15 COM 0XFF MOVLW .16 MOVWF TEMP MOVLW S0 -1 ;APONTA PARA S0 - 1 MOVWF FSR LOOPS015 INCF FSR,F MOVLW 0XFF ;COLOCA 0XFF EM S0 ..S15 MOVWF INDF DECFSZ TEMP,F GOTO LOOPS015 ;===================================================== ;OBS. XTECLA JÁ ESTÁ COM O NÚMERO DA MEMÓRIA A ESCREVER MOVLW S0 -1 ;APONTA PARA S0 - 1 MOVWF FSR MOVLW INIT_TELEFONE ;INICIO DA EEPROM PARA NÚMEROS TELEFONICOS MOVWF ADDRESS MOVF XTECLA,F ;SE XTECLA= 0 ; ERRO BTFSC STATUS,Z GOTO N_ERR MOVFW XTECLA ;SE XTECLA > 4 = ERRO SUBLW 0X04 BTFSC STATUS,C GOTO X91 N_ERR CALL BIP_LONGO ;ERRO GOTO SAI_MOD1 ;SAI DO MODO DE PROGRAMAÇÃO X91 MOVFW XTECLA MOVWF TEMP DECF TEMP,F ;ACERTA JÁ QUE NÃO TEM MEMÓRIA '0'! MOVLW 0X03 ;LIMITA A 2 BITS ANDWF TEMP,F BCF STATUS,C ;MULTIPLICA POR 8 RLF TEMP,F ;X2 BCF STATUS,C RLF TEMP,F ;X4 BCF STATUS,C RLF TEMP,F ;X8 MOVFW TEMP ADDWF ADDRESS,F ;CORRIGE ENDEREÇO CONFORME NUMERO DA MEMORIA DECF ADDRESS,F ;PRÉ-AJUSTA ADDRESS COM ENDEREÇO INICIAL DA EEPROM A GRAVAR MOVLW .1 ;CARREGA O PRÓXIMO PASSO MOVWF GER1 MOVLW .16 ;CARGA DE NÚMEROS MÁXIMOS A SEREM DIGITADOS POR MEMÓRIA MOVWF NTD BSF FLAG_NP ;PERMITE GRAVAR GOTO SAI_TECLADO ;SAI DA ROTINA DO TECLADO ;======================= PULAFF ;RECEBE NÚMERO TELEFONICO A GRAVAR NA MEMÓRIA INCF FSR,F MOVFW XTECLA ;OBTEM TECLAS DIGITADAS MOVWF INDF ;GRAVA NO BUFFER S0..S15 DECFSZ NTD,F GOTO SAI_TECLADO ;SAI DA ROTINA DO TECLADO GRAVA_NUMEROS_EEPROM BTFSS FLAG_NP ;TESTA BLOQUEIO DE PROGRAMAÇÃO GOTO N_ERR ;ERRO DE DIGITAÇÃO MOVLW .8 ;CARGA DE NUMERO DE BYTES PARA 16 NÚMEROS MOVWF TEMP ;EM TEMP MOVLW S0 - 1 ;MIRA O PONTEIRO DE DADOS MOVWF FSR ;APONTA PARA POSIÇÃO DE S0 LOOP_G1 INCF ADDRESS,F ;INCREMENTA ENDEREÇO DA EEPROM INCF FSR,F ;INCREMENTA PONTEIRO DOS DADOS SWAPF INDF,W ;PEGA VALOR, INVERTE ANDLW 0XF0 ;USA SOMENTE O NIBLE HIGH MOVWF S0A ;E SALVA EM 'S0A' INCF FSR,F ;INCREMENTA PONTEIRO DOS DADOS MOVFW INDF ;PEGA DADO ANDLW 0X0F ;USA SOMENTE O NIBLE LOW ADDWF S0A,W ;CONCATENA 2 NIBLES MOVWF TMP ;COLOCA NO BUFFER DE ESCRITA MOVFW ADDRESS ;COLOCA ENDEREÇO DA ESCRITA CALL EEWRITE ;ESCREVE EM UM ÚNICO BYTE DECFSZ TEMP,F ;DECREMENTA CONTADOR DE BYTES ESCRITOS GOTO LOOP_G1 ;VOLTA PARA O PRÓXIMO A ESCREVER CALL DOIS_BIPS ;ACABOU ESCRITA, AVISA COM 2 BIPS BCF FLAG_NP ;DESBLOQUEIA PROGRAMAÇÃO GOTO SAI_MOD1 ;SAI DO MODO DE PROGRAMAÇÃO ;================================================================================ ; PASSO 2 - TROCA DE SENHA --> # XXXX 0 YYYY YYYY ONDE:X=SENHA ANT. Y=SENHA NOVA ;================================================================================ PASSO_2 ; MP + 0 + SENHA NOVA +SENHA NOVA MOVFW XTECLA MOVLW S3 +1 MOVWF FSR ;APONTA PARA INICIO DOS DADOS MOVFW NTD SUBWF FSR,F ;APONTA PARA O PRÓXIMO REGISTRADOR MOVFW XTECLA MOVWF INDF ;ESCREVE EM S0...3 AS TECLAS RECEBIDAS DECFSZ NTD,F GOTO SAI_TECLADO CALL CARGA_NTD ;CARGA PARA 4 DIGITOS NOVAMENTE BTFSC FLAG_CONF GOTO COMP_2D BSF FLAG_CONF ;SETA FLAG PARA CONFIRMAÇÃO DE NOVA SENHA MOVFW S0 ;SALVA PRIMEIRA DIGITAÇÃO S0...3 EM S0A...3A MOVWF S0A MOVFW S1 MOVWF S1A MOVFW S2 MOVWF S2A MOVFW S3 MOVWF S3A CALL DOIS_BIPS ;AVISA QUE TUDO ESTÁ BEM, PARA PROSSEGUIR GOTO SAI_TECLADO ;SAI DO TECLADO COMP_2D BCF FLAG_CONF ;RESETA FLAG DE CONFERENCIA MOVFW S0 XORWF S0A,W BTFSS STATUS,Z GOTO ERR_TROCA_SENHA ;ERRO NA COMPARAÇÃO MOVFW S1 XORWF S1A,W BTFSS STATUS,Z GOTO ERR_TROCA_SENHA ;ERRO NA COMPARAÇÃO MOVFW S2 XORWF S2A,W BTFSS STATUS,Z GOTO ERR_TROCA_SENHA ;ERRO NA COMPARAÇÃO MOVFW S3 XORWF S3A,W BTFSS STATUS,Z GOTO ERR_TROCA_SENHA ;ERRO NA COMPARAÇÃO SWAPF S0,W ;CONCATENA OS NIBLES DE 2 REGISTRADORES ADDWF S1,F MOVFW S1 MOVWF TMP MOVLW 0X7E CALL EEWRITE ;GRAVA NOVA SENHA NA EEPROM SWAPF S2,W ;CONCATENA OS NIBLES DE 2 REGISTRADORES ADDWF S3,F MOVFW S3 MOVWF TMP MOVLW 0X7F ;GRAVA NOVA SENHA NA EEPROM CALL EEWRITE CALL DOIS_BIPS ;2 BIPS GOTO SAI_MOD1 ;SAI DO MODO DE PROGRAMAÇÃO ERR_TROCA_SENHA CALL BIP_LONGO ;BIP LONGO (ERRO) GOTO SAI_MOD1 ;SAI DO MODO DE PROGRAMAÇÃO ;================================================================================ ; PASSO 1 - MODO DE PROGRAMAÇÃO - RECEBE O PRIMEIRO DIGITO INDICADOR DE FUNÇÃO ;================================================================================ PASSO_1 MOVFW XTECLA ADDLW .2 ;SOMA 2 MOVWF GER CALL CARGA_NTD ;CARGA INICIAL DO REGISTRADOR DE RECEPÇÃO DE TECLADO CLRF GER1 GOTO SAI_TECLADO ;SAI DA ROTINA DE TECLADO ;================================================================================ ; PASSO 0 - RECEBE SENHA 'XXXX' PARA ON/OFF OU P/ MODO DE PROGRAMAÇÃO '#XXXX' ;================================================================================ PASSO_0 MOVLW .11 ;TECLA '#' XORWF XTECLA,W BTFSS STATUS,Z GOTO PEGA_TEC MOVFW NTD XORLW .4 BTFSS STATUS,Z GOTO SAI_MOD1 BSF FLAG_SUST ;PRIMEIRA TECLA FOI '#' ; CALL CARGA_NTD GOTO SAI_TECLADO PEGA_TEC MOVLW S3 +1 MOVWF FSR ;APONTA PARA INICIO DO BUFFER MOVFW NTD SUBWF FSR,F MOVFW XTECLA MOVWF INDF ;ESCREVE EM S0...3 AS TECLAS RECEBIDAS DECFSZ NTD,F GOTO SAI_TECLADO COMPARA_SENHA MOVLW 0X7E CALL EEREAD MOVWF TEMP SWAPF TEMP,W ;INVERTE TEMP ANDLW 0X0F ;DEIXA A PARTE BAIXA XORWF S0,W BTFSS STATUS,Z GOTO SENHA_ERR MOVFW TEMP ANDLW 0X0F XORWF S1,W BTFSS STATUS,Z GOTO SENHA_ERR MOVLW 0X7F CALL EEREAD MOVWF TEMP SWAPF TEMP,W ;INVERTE TEMP ANDLW 0X0F ;DEIXA A PARTE BAIXA XORWF S2,W BTFSS STATUS,Z GOTO SENHA_ERR MOVFW TEMP ANDLW 0X0F XORWF S3,W BTFSS STATUS,Z GOTO SENHA_ERR ;SAI POR SER SENHA ERRADA CALL CARGA_NTD BTFSS FLAG_SUST GOTO LIMPA_Z ;APAGA LEDS DE ZONAS, SE VIOLADOS ;================================================================================= ; ENTROU EM MODO DE PROGRAMAÇÃO ;================================================================================= BSF FLAG_ARM_PROG ;COMEÇA A PISCAR O LED ARM/PROG MOVLW .1 ;ACENA PARA O PRÓXIMO PASSO MOVWF GER CALL BIP BCF FLAG_SUST ;RESETA FLAG DE '#' INICIAL GOTO SAI_TECLADO ;SAI DA ROTINA DO TECLADO ;================================================================================= ; LIMPAR MEMÓRIA DE VIOLAÇÃO ;================================================================================= LIMPA_Z BCF FLAG_VZ1 ;PARA DE PISCAR OS LEDS DE VIOLAÇÃO DE ZONAS BCF FLAG_VZ2 BCF FLAG_VZ3 BCF FLAG_VZ1A ;LIMPA FLAGS AUXILIARES DE VIOLAÇÃO DE ZONAS BCF FLAG_VZ2A BCF FLAG_VZ3A BCF LED_Z3 ;=============================== BSF FLAG_TEMPOR ;* ACIONA FLAG DE TEMPORIZAÇÃO AO LIGAR PELO TECLADO BCF FLAG_TEMPOR_ON ;* RESETA FLAG AUXILIAR DE ON AFTER TIME BCF FLAG_TEMPOR_T1 ;* RESETA FLAG TRAVA DE TEMPORIZAÇÃO BCF FLAG_INIT_T1 ;* BCF FLAG_INIT_TD ;* CLRF T0C ;RESETA TEMPORIZADORES DE TEMPO DE TEMPORIZAÇÃO CLRF T1C CLRF T2C ;=============================== GOTO ON_OFF_ALARME ;VERIFICA SE LIGA OU DESLIGA ALARME ;================================================================================= ; DIGITAÇÃO ERRADA DA SENHA ;================================================================================= SENHA_ERR ;EM CASO DE SENHA ESTAR ERRADA CLRF GER ;RESETA GERENCIADOR DE PASSOS CLRF GER1 ;IDEM COM GERENCIADOR AUXILIAR CALL CARGA_NTD ;CARGA DE NÚMERO DE TECLAS DA SENHA CALL BIP_LONGO ;INDICA ERRO COM BIP LONGO BCF FLAG_RTEC ;APAGA FLAG DE RECEPÇÃO DE TECLADO SAI_TECLADO BTFSS FLAG_ARM_PROG ;SE ESTIVER EM MODO DE PROGRAMAÇÃO GOTO SAI_ROT_TECLADO ;NÃO ESTÁ EM MODO DE PROGRAMAÇÃO BTFSS T2,2 ;TESTA O TEMPO MÁXIMO EM MODO DE PROGRAMAÇÃO GOTO SAI_ROT_TECLADO ;AINDA NÃO ATINGIU O TEMPO SAI_MOD1 ;SAI DO MODO DE PROGRAMAÇÃO POR TEMPO BCF FLAG_ARM_PROG ;SAI DE MODO DE PROGRAMAÇÃO BCF LED_ARM_PROG ;APAGA LED ARM_PROG BCF FLAG_SUST ;RESETA FLAG DE '#" INICIAL CLRF GER ;ZERA GERENCIADOR DE ESTADOS CLRF GER1 ;RESETA GERENCIADOR DE PASSOS BCF FLAG_BLOQ_RX BCF FLAG_RTEC ;ZERA CALL CARGA_NTD ;CARGA INICIAL DO REGISTRADOR DE RECEPÇÃO DE TECLADO ;SAI DA ROTINA DE TECLADO APÓS CONTADOR DE TEMPO SAI_ROT_TECLADO ; FIM DA ROTINA DE TECLADO ;=================================================================================== ;================================================================================ ; ROTINA DE PROGRAMAÇÃO DOS CONTROLES E SENSORES REMOTOS ('APRENDIZADO') ;================================================================================ BTFSC PROG ;BOTÃO DE PROGRAMAÇÃO 'PROG' NA PLACA, FOI APERTADO? GOTO SAI_B_PROG ;NÃO APERTADO ;======================================================================================B= ; TESTA SE ESTAVA EM MODO DE PROGRAMAÇÃO VIA TECLADO E SE ESTIVER ,SAI DESTE MODO BTFSC FLAG_ARM_PROG GOTO SAI_B_PROG_ERRO ;AVISA COM BIP LONGO E SAI DO MODO DE PROG VIA TECLADO ;======================================================================================B= MOVLW .100 ;TEMPO ENTRE BIPS CALL DELAY BTFSS PROG ;AGUARDA SOLTAR BOTÃO GOTO $-3 ;======================================================================================P= BSF FLAG_ARM_PROG ;SIM,COMEÇA A PISCAR CALL BIP ;INDICA COM UM 'BIP' CLRF T2 ;APERTADO, INICIAR APRENDIZADO AGUARDA_TECLA BTFSS FLAG_RTEC ;RECEBEU ALGUMA TECLA? GOTO TESTA_TEMPO ;AINDA NÃO BCF FLAG_RTEC ;RECEBEU, APAGA FLAG DE RECEPÇÃO DE TECLA CALL BIP ;PRODUZ 2 BIPS PARA SINALIZAR A RECEPÇÃO MOVLW .1 ;TEMPO ENTRE BIPS CALL DELAYW CALL BIP MOVFW XTECLA ;TESTA O NÚMERO DA TECLA APERTADA XORLW .1 BTFSC STATUS,Z GOTO PROG_CONTROLES ;SE FOR '1', PROGRAMARÁ CONTROLE MOVFW XTECLA XORLW .2 BTFSC STATUS,Z GOTO PROG_SENSORES ;SE FOR '2', PROGRAMARÁ SENSOR GOTO SAI_B_PROG_ERRO ;TECLA COM NÚMERO INVALIDO, ERRO!!! TESTA_TEMPO BTFSS T2,2 ;TESTA O TEMPO MÁXIMO NESTE MODO DE PROGRAMAÇÃO GOTO AGUARDA_TECLA GOTO SAI_B_PROG_ERRO ;LIMITE DE 30 SEGUNDOS MÁXIMO SEM TECLAR PROG_CONTROLES ;PROGRAMA CONTROLES NA EEPROM (LEARN) BSF FLAG_CONTROL ;SETA FLAG P/ CONTROLE MOVLW CTRL_END_MAX -2 ;CARGA DE LIMITES DE ENDEREÇO PARA A GRAVAÇÃO MOVWF R_END_MAX ;CARREGA NO REGISTRADOR PARA FUTURA COMPARAÇÃO MOVLW CTRL_END_MIN ;ASSIM COMO O ENDEREÇO INICIAL PARA CONTROLES MOVWF R_END_MIN ;CARREGA EM OUTRO REGISTRADOR PARA FUTURA COMPARAÇÃO GOTO REST_TX ;VAI AGUARDA O USUÁRIO APERTAR O BOTÃO DO CONTROLE PROG_SENSORES BCF FLAG_CONTROL ;RESETA FLAG P/ SENSOR MOVLW SENS_END_MAX -2 ;CARGA DE LIMITES DE ENDEREÇO PARA A GRAVAÇÃO MOVWF R_END_MAX ;CARREGA NO REGISTRADOR PARA FUTURA COMPARAÇÃO MOVLW SENS_END_MIN ;ASSIM COMO O ENDEREÇO INICIAL PARA SENSORES SEM FIO MOVWF R_END_MIN ;CARREGA EM OUTRO REGISTRADOR PARA FUTURA COMPARAÇÃO REST_TX BCF FLAG_ROK ;LIMPA RECEPÇÃO ANTIGA AGUARDA_TX BTFSS FLAG_ROK ;AGUARDA RECEPÇÃO GOTO TESTA_TEMPO1 ;TESTA O TEMPO CALL GRAVAR_CONTROLE_SENSOR ;GRAVA SENSOR/CONTROLE NA EEPROM CALL TRES_BIPS ;BIPA 3 VEZES PARA CONFIRMAR GOTO SAI_PROG_OK ;SAI TESTA_TEMPO1 ;============================================ ;TESTA POR TECLA DE SAIR ANTECIPADO '#' BTFSS FLAG_RTEC GOTO SEGH7 BCF FLAG_RTEC MOVFW XTECLA XORLW .11 ;TECLA '#' FOI APERTADA? BTFSC STATUS,Z GOTO SAI_B_PROG_ERRO ;SIM, SAI DA PROGRAMAÇÃO ;================================================ SEGH7 BTFSS T2,2 GOTO AGUARDA_TX ;RETORNA PARA VER SE HOUVE RECEPÇÃO DE SENSOR/CONTROLE SAI_B_PROG_ERRO CALL BIP_LONGO ;LIMITE DE 30 SEGUNDOS MÁXIMO SEM TECLAR SAI_PROG_OK CALL BIP ;BIPA BCF FLAG_ROK ;CANCELA QUALQUER RECEPÇÃO RF BCF FLAG_RTEC ;CANCELA QUALQUER TECLA DIGITADA ERRADA BCF FLAG_ARM_PROG ;PARA DE PISCAR O LED DE ARM_PROG BCF LED_ARM_PROG ;APAGA LED ARM_PROG CLRF GER ;RESETA GERENCIADORES DE PASSO CLRF GER1 ;IDEM COM GERENCIADOR AUXILIAR CALL CARGA_NTD ;CARGA DE NÚMERO DE TECLAS DA SENHA BCF FLAG_ON ;SEMPRE DEIXA DESLIGADO O ALARME SAI_B_PROG ; FIM DA ROTINA DE PROGRAMAÇÃO DE CONTROLES E SENSORES (APRENDIZADO) ;======================================================================================= ; TESTA POR RECEPÇÃO DE CONTROLE REMOTO / SENSORES SEM FIO ;======================================================================================= REC_CTRL1 BTFSS FLAG_ROK ;AGUARDA RECEPÇÃO DE RF GOTO SEGP1 ;AINDA NÃO RECEBEU, SAI DA ROTINA ;=============================================B= ;BLOQUEIA RECEPÇÃO POR MODO DE TESTE DE DISCAGEM MOVFW GER ;CARREGA 'W' COM VALOR DO GERENCIADOR DE PASSOS XORLW .6 ;COMPARA COM PASSO 6 - MODO TESTE DE SENSORES BTFSC STATUS,Z GOTO PULA_BLOQUEIO ;PERMITE RECEPÇÃO EM MODO DE TESTE DE SENSORES BTFSC FLAG_BLOQ_RX ;VERIFICA SE ESTA OPERAÇÃO ESTÁ BLOQUEADA GOTO SEGP1 ;ESTÁ BLOQUEADA ,SAI DA ROTINA DE RECEPÇÃO ;=============================================B= PULA_BLOQUEIO CALL PROCURA_TX ;RECEBEU, VERIFICA SE ESTÁ PROGRAMADO NA EEPROM ADDLW .1 ;TESTA O RESULTADO DA PROCURA BTFSC STATUS,Z GOTO SEGP1 ; NÃO CADASTRADO SUBLW CTRL_END_MAX ;VERIFICA SE O TX RECEBIDO É CONTROLE OU SENSOR SEM FIO BTFSC STATUS,C GOTO E_CONTROLE ;É CONTROLE ;====================================================================================== ; RECEBEU SENSOR SEM FIO: DISPARA ALARME E PISCA LED DO SETOR 3 ;====================================================================================== E_SENSOR ;É SENSOR MOVFW GER ;TESTA SE ESTÁ EM MODO DE TESTE DE SENSORES XORLW .6 BTFSS STATUS,Z GOTO MODO_NORMAL ;NÃO ESTÁ CALL HUM_TOQUE_SIRENE_TESTE ;SINALIZA RECEPÇÃO COM BREVE TOQUE DA SIRENE CLRF T2 ;DÁ MAIS TEMPO PARA O TESTE GOTO SEGP1 ;SEGUE PARA FIM DESTA ROTINA MODO_NORMAL BTFSS FLAG_ON ;TESTA SE ALARME ESTÁ ARMADO GOTO SEGP1 ;=========================== IFDEF BLOQUEAR_Z ;SE FOI OPTADO POR BLOQUEIO DE SETORES APÓS DISPARO BTFSC FLAG_VZ3A ;TESTA SE FLAG AUX DA Z3 ESTÁ SETADO GOTO SEGP1 ;SE ESTIVER, NÃO DISPARA MAIS (ÚNICO DISPARO POR SETOR) ENDIF ;=========================== ;=========================== IFDEF TEMPORIZA_Z3 BTFSS FLAG_TEMPOR ;* SE FLAG DE TEMPORIZAÇÃO ESTIVER ACIONADO GOTO VIOL_Z3 ;* NÃO ESTÁ ACIONADO, OCORRENDO O DISPARO IMEDIATO BTFSS FLAG_TEMPOR_ON ;* TESTA O FIM DO TEMPO DE SAÍDA DO INTERIOR DA CASA GOTO SEGP1 ;* DESPREZA DISPARO BSF FLAG_VIOL_Z3 ;* ACIONA FLAG DE DISPARO NA ZONA 3 GOTO SEGP1 ;* AINDA NÃO ACABOU ENDIF ;============================ VIOL_Z3 BTFSC SIRENE ;TESTA SE A SIRENE ESTÁ LIGADA GOTO SEGP1 ;JÁ ESTÁ, SAI DA ROTINA BSF FLAG_VZ3 ;NÃO ESTÁ, ENTÃO AVISA QUE ZONA 3 FOI VIOLADA BSF FLAG_VZ3A ;SETA FLAG AUX CLRF T0 ;RESETA TEMPO QUE SIRENE FICARÁ LIGADA CLRF T1 CLRF T2A BSF SIRENE ;LIGA SIRENE GOTO SEGP1 ;SAI DA ROTINA ;================================================================================ ; RECEBEU UM CONTROLE REMOTO ;================================================================================ E_CONTROLE ;É CONTROLE REMOTO,ENTÃO TESTA FUNÇÃO PÁNICO MOVFW GER ;CARREGA 'W' COM VALOR DO GERENCIADOR DE PASSOS XORLW .6 ;ESTÁ EM MODO DE TESTE DE SENSORES? BTFSC STATUS,Z ;NÃO, SEGUIRA PARA TESTE DE 'PANICO' GOTO SEGP1 ;SIM, ENTÃO REJEITA CONTROLE , POIS DEVE RECEBER ;SOMENTE SENSORES NESTA ETAPA ;================================================================================ ; FUNÇÃO PANICO ;================================================================================ ;TESTA ACIONAMENTO CONTINUO DE BOTÃO DO CONTROLE REMOTO (ACIMA DE 5 SEG) BCF FLAG_ROK ;APAGA FLAG DE RECEPÇÃO TX CLRF T0 ;RESETA TEMPORIZADORES CLRF T1 BTFSS T1,3 GOTO $-1 ;AGUARDA 266 MS BTFSS FLAG_ROK ;TESTA POR NOVA RECEPÇÃO ( SE BOTÃO APERTADO DIRETO) GOTO SEG8F ;NENHUMA RECEPÇÃO (SOLTOU O BOTÃO) INCFSZ R_PANICO,F ;HOUVE MAIS UMA RECEPÇÃO GOTO REC_CTRL1 ;VAI TESTAR SE RECEPÇÃO MOVLW V_PANICO ;PEGA VALOR DE CARGA PARA REGISTRADOR 'R_PANICO' MOVWF R_PANICO ;CARREGA BSF FLAG_ON ;LIGA ALARME BSF LED_ARM_PROG ;INDICA ALARME LIGADO BSF SIRENE ;DISPARA SIRENE BCF FLAG_ROK ;APAGA FLAG DE RECEPÇÃO TX CLRF T2A ;ZERA PARA TEMPO MÁXIMO DE SIRENE CLRF T0 CLRF T1 BTFSS T1,5 ;AGUARDA TEMPO 1 MSEG ANTES DE SAIR GOTO $-1 GOTO SEGP1 ;SAI DA ROTINA SEG8F BCF FLAG_TEMPOR ;DESABILITA TEMPORIZAÇÃO DE ENTRADA/SAIDA BCF FLAG_TEMPOR_T1 ;RESETA FLAGS AUXILIARES DE TEMPORIZAÇÃO BCF FLAG_TEMPOR_ON BCF FLAG_INIT_T1 BCF FLAG_INIT_TD PULA2 ;================================================================================ ; RECEBEU CONTROLE REMOTO: LIGA / DESLIGA ALARME ;================================================================================ ON_OFF_ALARME SEG8E BTFSS FLAG_ON ;TESTA SE ESTÁ LIGADO O ALARME GOTO LIG_AL ;NÃO ESTÁ, VAI LIGAR BCF FLAG_ON ;JÁ ESTÁ, VAI DESLIGAR BCF LED_ARM_PROG ;APAGA FLAG DE PISCADA DO LED ARM/PROG BCF SIRENE ;DESLIGA A SIRENE BCF RELE_LINHA ;DESLIGA RELE DE CONEXÃO TELEFONICA (CASO ESTEJA LIGADO) BCF FLAG_JADISCOU ;LIBERA FLAG DE UMA RODADA DE DISCAGEM BCF FLAG_DISCAR ;DESLIGA QUALQUER DISCAGEM BCF FLAG_VZ3A ;SETA FLAG AUX BCF FLAG_VZ2A ;SETA FLAG AUX BCF FLAG_VZ1A ;SETA FLAG AUX BCF FLAG_BLOQ_RX ;PERMITE RECEPÇÃO RF CALL HUM_TOQUE_SIRENE ;1 TOQUE DE SIRENE (OFF) CALL RESETA_FLAGS_DISC ;RESETA FLAGS PARA DISCAGEM GOTO SEGP1 ;SAI DA ROTINA LIG_AL ;VAI LIGAR O ALARME ;=================================== ; TESTAS SE SETORES ESTÃO FECHADOS ANTES DE ARMAR ALARME BTFSC FLAG_INZ1 ;TESTA FLAG DE SITUAÇÃO DA ZONA 1 GOTO ABERTO_PORTA_JANELAS ;ALGUM SENSOR ABERTO BTFSC FLAG_INZ2 ;TESTA FLAG DE SITUAÇÃO DA ZONA 2 GOTO ABERTO_PORTA_JANELAS ;ALGUM SENSOR ABERTO BSF FLAG_ON ;TODOS SENSORES FECHADOS, ENTÃO LIGA O ALARME BSF LED_ARM_PROG ;ACENDE O LED ARM/PROG BCF FLAG_BLOQ_RX ;PERMITE RECEPÇÃO RF BTFSC FLAG_TEMPOR ;* ACIONA FLAG DE TEMPORIZAÇÃO AO LIGAR PELO TECLADO GOTO SO_2_TOQUES ;SE TIVER SIDO ACIONADO PELO TECLADO, DÁ 2 TOQUES APENAS CALL TRES_TOQUES_SIRENE ;3 TOQUES DE SIRENE (ON),POIS FOI ACIONADO PELO CONTROLE REMOTO SEGM4R CALL RESETA_FLAGS_DISC ;PREPARA FLAGS PARA UMA FUTURA DISCAGEM GOTO SEGP1 ;SAI DA ROTINA SO_2_TOQUES CALL DOIS_TOQUES_SIRENE ;2 TOQUES DE SIRENE GOTO SEGM4R ;VAI PARA ATALHO DE SAIDA DE ROTINA ABERTO_PORTA_JANELAS ;ALGUM SENSOR ABERTO, IMPEDINDO ACIONAMENTO DO ALARME CALL PJ_ABERTA_SIRENE ; 5 BREVES TOQUES DE SIRENE ;PARA INDICAR SENSORES NÃO FECHADOS CALL RESETA_FLAGS_DISC ;PREPARA FLAGS PARA UMA FUTURA DISCAGEM ;================================================================================ ; CONTA TEMPO DE DESLIGAMENTO DA SIRENE ;================================================================================ SEGP1 BCF FLAG_ROK ;RESETA FLAG DE RECEPÇÃO BTFSS SIRENE ;SE A SIRENE ESTIVER LIGADA? GOTO PUL_SIR ;NÃO ESTÁ, SAI DESTA ROTINA IFDEF TEMPO_2MIN ;VERIFICA QUAL É A ESCOLHA DO USUÁRIO BTFSS T2A,4 ;TEMPO DE 2MIN E 30SEG COM SIRENE LIGADA ENDIF IFDEF TEMPO_5MIN ;VERIFICA QUAL É A ESCOLHA DO USUÁRIO BTFSS T2A,5 ;TEMPO DE 5 MINUTOS COM SIRENE LIGADA ENDIF IFDEF TEMPO_10MIN ;VERIFICA QUAL É A ESCOLHA DO USUÁRIO BTFSS T2A,6 ;TEMPO DE 10 MINUTOS COM SIRENE LIGADA ENDIF GOTO PUL_SIR BCF SIRENE ;DESLIGA SIRENE BCF FLAG_VIOL_Z3 ;FLAG DE VIOLAÇÃO EM MODO TEMPORIZADO Z3 BCF FLAG_VIOL_Z2 ;FLAG DE VIOLAÇÃO EM MODO TEMPORIZADO Z2 BCF FLAG_VIOL_Z1 ;FLAG DE VIOLAÇÃO EM MODO TEMPORIZADO Z1 PUL_SIR ;================================================================================ ;================================================================================ ; TESTA SITUAÇÃO DAS ENTRADAS DAS ZONAS 1 E 2 ;================================================================================ BTFSS FLAG_ON ;ALARME ESTÁ LIGADO? GOTO SAI_TZ1_Z2 ;NÃO ESTÁ, SAI DESTA ROTINA BTFSS FLAG_INZ1 ;ESTÁ LIGADO; TESTA ENTRADA DA Z1 GOTO OUTRA_Z ;NÃO ESTÁ, TESTA A PRÓXIMA ZONA ; INICIO DA PARTE OPCIONAL AO COMPILAR ;=========================== IFDEF BLOQUEAR_Z ;SE FOI OPTADO POR BLOQUEIO DE SETORES APÓS DISPARO BTFSC FLAG_VZ1A ;TESTA SE FLAG AUX DA Z1 ESTÁ SETADO GOTO OUTRA_Z ;SE ESTIVER, NÃO DISPARA MAIS (ÚNICO DISPARO) ;E TESTA A OUTRA ZONA ENDIF ;=========================== ;=========================== IFDEF TEMPORIZA_Z1 ;VERIFICA A OPÇÃO DO USUÁRIO PARA TEMPORIZAR ZONA 1 BTFSS FLAG_TEMPOR ;* SE FLAG DE TEMPORIZAÇÃO ESTIVER ACIONADO GOTO VIOL_Z1 ;* NÃO ESTÁ, ENTÃO OCORRE DISPARO IMEDIATO BTFSS FLAG_TEMPOR_ON GOTO OUTRA_Z ;* DESPREZA DISPARO BSF FLAG_VIOL_Z1 ;* ESTÁ. TESTA FIM DA TEMPORIZAÇÃO GOTO OUTRA_Z ;* SAI DA ROTINA ENDIF ;========================== ;FIM DA PARTE OPCIONAL AO COMPILAR VIOL_Z1 ; BTFSC FLAG_VZ1 ;TESTA SE JÁ HOUVE DISPARO NESTA ZONA ; GOTO OUTRA_Z ;JÁ ESTÁ DISPARADO POR ESTA ZONA BSF FLAG_VZ1 ;AINDA NÃO, SINALIZA NO LED E DISPARA BSF FLAG_VZ1A ;SETA O AUXILIAR TAMBÉM GOTO DISP_SIR ;VAI DISPARAR A SIRENE OUTRA_Z BTFSS FLAG_INZ2 ;TESTA ZONA 2 GOTO SAI_TZ1_Z2 ;NÃO ESTÁ ACIONADA. SAI DA ROTINA ; INICIO DA PARTE OPCIONAL AO COMPILAR ;=========================== IFDEF BLOQUEAR_Z ;SE FOI OPTADO POR BLOQUEIO DE SETORES APÓS DISPARO BTFSC FLAG_VZ2A ;TESTA SE FLAG AUX DA Z2 ESTÁ SETADO GOTO SAI_TZ1_Z2 ;SE ESTIVER, NÃO DISPARA MAIS (ÚNICO DISPARO POR SETOR) ENDIF ;=========================== ;=========================== IFDEF TEMPORIZA_Z2 ;VERIFICA A OPÇÃO DO USUÁRIO PARA TEMPORIZAR ZONA 2 BTFSS FLAG_TEMPOR ;* SE FLAG DE TEMPORIZAÇÃO ESTIVER ACIONADO GOTO VIOL_Z2 ;* NÃO ESTÁ, ENTÃO OCORRE DISPARO IMEDIATO BTFSS FLAG_TEMPOR_ON GOTO SAI_TZ1_Z2 ;* DESPREZA DISPARO BSF FLAG_VIOL_Z2 ;* ESTÁ, TESTA FIM DA TEMPORIZAÇÃO GOTO SAI_TZ1_Z2 ;* SAI DA ROTINA ENDIF ;===================== ; FIM DA PARTE OPCIONAL VIOL_Z2 BSF FLAG_VZ2 ;ACIONA FLAG DE VIOLAÇÃO BSF FLAG_VZ2A ;TAMBÉM O AUXILIAR DISP_SIR BTFSC SIRENE ;TESTA A SIRENE GOTO SAI_TZ1_Z2 ;JÁ ESTÁ LIGADA, ENTÃO SAI DA ROTINA CLRF T0 ;NÃO ESTÁ LIGADA CLRF T1 ;ZERA TEMPORIZADORES PARA TEMPO DE SIRENE LIGADA CLRF T2A BCF FLAG_JADISCOU ;RESETA FLAG DE UNICA DISCAGEM BCF FLAG_SETDISC ;RESETA FLAG DE SETUP INICIAL DE DISCAGEM BSF SIRENE ;LIGA SIRENE SAI_TZ1_Z2 ;SAIDA DA ROTINA ;=================================================================================================== ; ROTINA DE TEMPORIZAÇÃO AO SAIR LIGANDO ALARME VIA TECLADO ;=================================================================================================== BTFSS FLAG_ON ;ALARME ESTÁ LIGADO? GOTO SAI_TEMPOR ;NÃO ESTÁ LIGADO BTFSS FLAG_TEMPOR ;FLAG DE TEMPORIZAÇÃO GOTO SAI_TEMPOR ;PULA SE=0 BTFSC FLAG_TEMPOR_T1 ;TESTA TRAVA SE = 0 GOTO SEGHL1 ;JÁ FOI SETADO, PULA BSF FLAG_TEMPOR_T1 ;NÃO ESTAVA, MAS AGORA É SETADO CLRF T0C ;RESETA TEMPORIZADORES PARA INICIO DA CONTAGEM DE TEMPO CLRF T1C CLRF T2C BCF FLAG_TEMPOR_ON ;RESETA FLAG DE FIM DE TEMPORIZAÇÃO SEGHL1 BTFSC FLAG_TEMPOR_ON ;TESTA FLAG DE FIM DE TEMPORIZAÇÃO GOTO SAI_TEMPOR ;SAI DIRETO DA ROTINA DE TEMPORIZAÇÃO BTFSS T1C,3 ;SE = 1 ,TESTA SE JÁ SE PASSOU 1 MINUTO GOTO SAI_TEMPOR ;AINDA NÃO PASSOU O TEMPO DE TEMPORIZAÇÃO BSF FLAG_TEMPOR_ON ;JÁ PASSOU 1 MIN, ENTÃO SETA FLAG E INICIA ALARME ON BCF FLAG_VZ1 ;RESETA DISPAROS DA PESSOA QUE ARMOU O ALARME VIA TECLADO BCF FLAG_VZ2 ;LIMPA MEMÓRIA DE VIOLAÇÃO BCF FLAG_VZ3 BCF FLAG_VZ1A BCF FLAG_VZ2A ;LIMPA FLAGS AUXILIARES DE VIOLAÇÃO BCF FLAG_VZ3A BCF FLAG_INZ1 ;FLAG DE ESTADO DA ENTRADA Z1 BCF FLAG_INZ2 ;FLAG DE ESTADO DA ENTRADA Z1 BCF FLAG_VIOL_Z3 ;FLAG DE VIOLAÇÃO EM MODO TEMPORIZADO Z3 BCF FLAG_VIOL_Z2 ;FLAG DE VIOLAÇÃO EM MODO TEMPORIZADO Z2 BCF FLAG_VIOL_Z1 ;FLAG DE VIOLAÇÃO EM MODO TEMPORIZADO Z1 CALL HUM_TOQUE_SIRENE ; 1 TOQUE DE SIRENE PARA AVISAR O FIM DA TEMPORIZAÇÃO SAI_TEMPOR ;=================================================================================================== ; TESTA POR DISPAROS EM MODO TEMPORIZADO ;=================================================================================================== BTFSS FLAG_TEMPOR ;ALARME FOI LIGADO PELO TECLADO? GOTO SAI_TESTE_TEMP ;NÃO, ENTÃO SAI DA ROTINA BTFSS FLAG_TEMPOR_ON ;TESTA FLAG PARA TEMPORIZAÇÃO DE ENTRADA GOTO SAI_TESTE_TEMP ;NÃO ACIONADO AINDA, ENTÃO SAI DA ROTINA BTFSS FLAG_VIOL_Z3 ;ACABOU TEMPO PARA ENTRADA, TESTA FLAGS DE VIOLAÇÃO GOTO SEGSL1 BSF FLAG_VZ3 ;PISCA LED DA ZONA 3 BSF FLAG_VZ3A ;SETA AUXILIAR BSF FLAG_INIT_TD ;ZONA 3 VIOLADA SEGSL1 BTFSS FLAG_VIOL_Z2 GOTO SEGSL2 ;TESTA A PRÓXIMA ZONA BSF FLAG_VZ2 ;PISCA LED DA ZONA 2 BSF FLAG_VZ2A ;SETA O AUXILIAR BSF FLAG_INIT_TD ;ZONA 2 VIOLADA SEGSL2 BTFSS FLAG_VIOL_Z1 GOTO SEGSL3 ;TESTA A PRÓXIMA ZONA BSF FLAG_VZ1 ;PISCA LED DA ZONA 1 BSF FLAG_VZ1A ;SETA O AUXILIAR BSF FLAG_INIT_TD ;ZONA 1 VIOLADA SEGSL3 BTFSS FLAG_INIT_TD ;ESTÁ O FLAG SETADO? GOTO SAI_TESTE_TEMP ;NÃO, NENHUMA INVASÃO, SAI DESTA ROTINA BTFSC FLAG_INIT_T1 ;HOUVE UMA INVASÃO GOTO TESTA_TIME3 ;SE FLAG TRAVA =1 ,TESTARA O TEMPO BSF FLAG_INIT_T1 ;SE =0 , RESETARÁ CONTADORES DE TEMPO CLRF T0C ;RESETA PARA COMEÇAR A CONTAR TEMPO NA ENTRADA DA CASA CLRF T1C CLRF T2C TESTA_TIME3 BTFSS FLAG_INIT_TD ;ALGUMA ZONA FOI VIOLADA? GOTO SAI_TESTE_TEMP ;NÃO, ENTÃO SAI DA ROTINA BTFSS T1C,2 ;SIM, ENTÃO TESTA TEMPO DE ENTRADA GOTO SAI_TESTE_TEMP ;AINDA NÃO,ENTÃO SAI DA ROTINA BTFSS FLAG_VIOL_Z3 ;FOI ZONA 3? GOTO SG5Y ;NÃO, TESTA A PRÓXIMA BTFSC SIRENE ;SIM, E ESTÁ LIGADA A SIRENE? GOTO SG5Y ;SIM, JÁ ESTÁ. ENTÃO APENAS SEGUE A ROTINA GOTO VIOL_Z3 ;SIRENE ESTA DESLIGADA, ENTÃO DISPARA POR Z3 SG5Y BTFSS FLAG_VIOL_Z2 ;FOI A ZONA 2? GOTO SG6Y ;NÃO, TESTA A PRÓXIMA BTFSC SIRENE ;SIM, E ESTÁ LIGADA A SIRENE? GOTO SG6Y ;SIM, JÁ ESTÁ. ENTÃO APENAS SEGUE A ROTINA GOTO VIOL_Z2 ;SIRENE ESTÁ DESLIGADA, ENTÃO DISPARA POR Z2 SG6Y BTFSS FLAG_VIOL_Z1 ;FOI A ZONA 32? GOTO SG7Y ;NÃO, TESTA A PRÓXIMA BTFSC SIRENE ;SIM, E ESTÁ LIGADA A SIRENE? GOTO SG7Y ;SIM, JÁ ESTÁ. ENTÃO APENAS SEGUE A ROTINA GOTO VIOL_Z1 ;SIRENE ESTÁ DESLIGADA, ENTÃO DISPARA POR Z1 SG7Y SAI_TESTE_TEMP ;=================================================================================================== ; ROTINAS DE DISCAGEM SET UP ;=================================================================================================== BTFSC FLAG_JADISCOU ;VERIFICA SE JÁ HOUVE UMA DISCAGEM NESTE DISPARO GOTO FIM_SETUP ;JÁ HOUVE,ENTÃO SAI DA ROTINA BTFSS SIRENE ;TESTA SIRENE GOTO FIM_SETUP ;DESLIGADA, SAI DA ROTINA BTFSC FLAG_SETDISC ;LIGADA, SETUP JÁ FOI FEITO? GOTO FIM_SETUP ;JÁ FOI FEITO, ENTÃO SAI DA ROTINA BTFSS T1,7 ;NÃO FOI FEITO, ENTÃO AGUARDA 5 SEGUNDOS PARA INICIAR A LIGAÇÃO ;(FALSOS DISPAROS AO MANUSEAR O CONTROLE REMOTO) GOTO FIM_SETUP ;SAI, POIS AINDA NÃO COMPLETOU O TEMPO CLRF T0 ;RESETA CONTADORES DE TEMPO CLRF T1 VAI_DISC_M1 BTFSC FLAG_DISC_M1 GOTO VAI_DISC_M2 MOVLW INIT_TELEFONE ;INICIO DA EEPROM M1 PARA NÚMEROS TELEFONICOS GOTO SEGFG1 VAI_DISC_M2 BTFSC FLAG_DISC_M2 GOTO VAI_DISC_M3 MOVLW INIT_TELEFONE + .8 ;INICIO DA EEPROM M2 PARA NÚMEROS TELEFONICOS GOTO SEGFG1 VAI_DISC_M3 BTFSC FLAG_DISC_M3 GOTO VAI_DISC_M4 MOVLW INIT_TELEFONE + .16 ;INICIO DA EEPROM M3 PARA NÚMEROS TELEFONICOS GOTO SEGFG1 VAI_DISC_M4 BTFSC FLAG_DISC_M4 GOTO FIM_SETUP MOVLW INIT_TELEFONE + .24 ;INICIO DA EEPROM M4 PARA NÚMEROS TELEFONICOS SEGFG1 MOVWF ADDRESS1 ;CARREGA ENDEREÇO INICIAL DA EEPROM COM INICIO DA DISCAGEM MOVLW CBYTES_A_DISCAR MOVWF CTD1 ;CARGA DO NÚMERO MÁXIMO DE 'BYTES /2' A DISCAR BSF FLAG_DISCAR BSF FLAG_SETDISC GOTO FIM_SETUP FIM_SETUP ;FIM DA ROTINA DE SETUP INICIAL PARA DISCAGEM ;=================================================================================================== ; ROTINAS DE DISCAGEM ;=================================================================================================== DISCAR_NUM BTFSS FLAG_DISCAR ;TESTA SE DEVE DISCAR OU NÃO GOTO SAI_DISC BTFSS FLAG_SETDISC ;TESTA SE ACABOU O SETUP GOTO SAI_DISC BTFSC FLAG_DISC_T3 GOTO SINAL_DISP ;INICIA SINAL DE DISPARO NA LINHA TELEFONICA BTFSC FLAG_DISC_T2 GOTO AGUARDA_COMPL_LIG ;INICIA TEMPO PARA COMPLETAR A LIGAÇÃO BTFSC FLAG_DISC_T1 GOTO PULA_CONT_DISC ;INICIA DISCAGEM DE TODOS OS NÚMEROS DE UMA MEMÓRIA CALL CONECTANDO_LINHA ;INICIA A CONEXÃO DA LINHA TELEFONICA BSF FLAG_DISC_T1 GOTO SAI_DISC PULA_CONT_DISC MOVFW ADDRESS1 CALL EEREAD MOVWF SAUX ;SALVA NÚMERO A DISCAR BTFSC FLAG_N_VAZ ;TESTA SE TEM CONTEUDO GRAVADO NA MEMÓRIA GOTO PULA_R3 XORLW 0XFF ;COMPARA COM 0XFF BTFSC STATUS,Z GOTO FIM_SOM_DISP ;NADA GRAVADO, ENTÃO VAI PARA A PROXIMA MEMÓRIA A DISCAR BSF FLAG_N_VAZ ;SINALIZA POIS ESTÁ GRAVADA PULA_R3 SWAPF SAUX,W ANDLW 0X0F XORLW 0X0F BTFSC STATUS,Z GOTO FIM_DISCAGEM SWAPF SAUX,W ANDLW 0X0F BTFSS FLAG_MODO_TOM ;TESTA SE É TOM=1 OU PULSO=0 CALL SEND_PULSO BTFSC FLAG_MODO_TOM ;TESTA SE É TOM=1 OU PULSO=0 CALL SEND_DTMF MOVFW SAUX ANDLW 0X0F XORLW 0X0F BTFSC STATUS,Z GOTO FIM_DISCAGEM MOVFW SAUX ANDLW 0X0F BTFSS FLAG_MODO_TOM ;TESTA SE É TOM=1 OU PULSO=0 CALL SEND_PULSO BTFSC FLAG_MODO_TOM ;TESTA SE É TOM=1 OU PULSO=0 CALL SEND_DTMF DECFSZ CTD1,F GOTO SEGY7 GOTO FIM_DISCAGEM ;NÚMERO MAXIMO DE BITS ENVIADOS SEGY7 INCF ADDRESS1,F GOTO SAI_DISC FIM_DISCAGEM BSF FLAG_DISC_T2 CLRF T0 CLRF T1 CLRF T2A GOTO SAI_DISC ;==================================================================== ; AGUARDANDO COMPLETAR LIGAÇÃO TELEFONICA ;==================================================================== AGUARDA_COMPL_LIG BTFSS T1,7 ;AGUARDA 5 SEGUNDOS PARA COMPLETAR A LIGAÇÃO GOTO SAI_DISC CLRF T0 CLRF T1 CLRF T2A BSF FLAG_DISC_T3 GOTO SAI_DISC ;=================================================================== ;GERA SINAL INDICADOR DE DISPARO DO ALARME NA LINHA TELEFONICA ;SENDO AUDÍVEL PARA QUEM ATENDER O NÚMERO DISCADO ;=================================================================== SINAL_DISP BTFSS T1,3 ;0,5 SEG GOTO TOM_N2 TOM_N1 ;500 HZ=T0,2 1KHZ=T0,1 BTFSC T0,1 GOTO $-1 BTFSS T0,1 GOTO $-1 V_TOM1 BTFSS TOM1 GOTO LIGUE_TOM1 BCF TOM1 GOTO AG_TEMPO LIGUE_TOM1 BSF TOM1 AG_TEMPO BTFSS T2A,1 ;AVISA POR 20 SEGUNDOS GOTO SAI_DISC GOTO FIM_SOM_DISP ;FIM DO SINAL SONORO TOM_N2 BTFSC T0,0 ;1KHZ =T0,1 2KHZ=T0,0 GOTO $-1 BTFSS T0,0 GOTO $-1 GOTO V_TOM1 ;====================================================================== ; DECIDE QUAL MEMÓRIA SERÁ DISCADA ;====================================================================== FIM_SOM_DISP BTFSC FLAG_DISC_M1 ;JÁ FOI DISCADO A MEMÓRIA 1? GOTO SEGR2 ;VAI ENTÃO DISCAR A MEMÓRIA 2 BSF FLAG_DISC_M1 ;AINDA NÃO, ENTÃO DISCA MEMÓRIA 1 GOTO SEG_DES_CON ;VAI PARA ROTINA DE DISCAGEM SEGR2 BTFSC FLAG_DISC_M2 ;JÁ FOI DISCADO A MEMÓRIA 2? GOTO SEGR3 ;VAI ENTÃO DISCAR A MEMÓRIA 3 BSF FLAG_DISC_M2 ;AINDA NÃO, ENTÃO DISCA MEMÓRIA 2 GOTO SEG_DES_CON ;VAI PARA ROTINA DE DISCAGEM SEGR3 BTFSC FLAG_DISC_M3 ;JÁ FOI DISCADO A MEMÓRIA 3? GOTO SEGR4 ;VAI ENTÃO DISCAR A MEMÓRIA 4 BSF FLAG_DISC_M3 ;AINDA NÃO, ENTÃO DISCA MEMÓRIA 3 GOTO SEG_DES_CON ;VAI PARA ROTINA DE DISCAGEM SEGR4 BSF FLAG_DISC_M4 ;VAI ENTÃO DISCAR A MEMÓRIA 4 ;=============================================================================== ; ROTINA DE SAÍDA DE DISCAGEM E PREPARAÇÃO PARA A PRÓXIMA ;=============================================================================== SEG_DES_CON CALL DESCONECTANDO_LINHA ;DESCONETA DA LIGAÇÃO ANTERIOR BCF FLAG_N_VAZ CALL RESETA_T123SET ;RESETA FLAGS T1,2,3 E SETDISC BCF TOM1 ; RESETA TOM1 BTFSS FLAG_ARM_PROG ;SE ESTIVER EM MODO DE TESTE DE DISCAGEM GOTO PUL_K93 ;NÃO ESTÁ , PULA BCF FLAG_ARM_PROG ;ESTÁ, ENTÃO SAI DO MODO DE PROGRAMAÇÃO BCF LED_ARM_PROG ;APAGA LED ARM_PROG BCF FLAG_DISCAR ;FINALIZA A DISCAGEM DE 1 MEMÓRIA BCF FLAG_SUST ;RESETA FLAG DE '#" INICIAL BCF FLAG_RTEC ;ZERA CALL CARGA_NTD ;CARGA INICIAL DO REGISTRADOR DE RECEPÇÃO DE TECLADO CLRF GER1 ;ZERA REGISTRADORES DE PASSO CLRF GER PUL_K93 BTFSS FLAG_DISC_M4 ;TESTA SE FOI FEITA A DISCAGEM DA ULTIMA MEMÓRIA GOTO SAI_DISC ;AINDA NÃO, ENTÃO SAI DA ROTINA CALL RESETA_FLAGS_DISC ;JÁ FOI FEITA, ENTÃO RESETA TODOS OS FLAGS DE DISCAGEM BCF FLAG_DISCAR ;FINALIZA A DISCAGEM DAS 4 MEMÓRIAS BSF FLAG_JADISCOU ;INFORMA QUE JÁ OCORREU UMA DISCAGEM NESTE DISPARO BCF RELE_LINHA ;DESCONECTA A LINHA TELEFONICA E SAI DA ROTINA SAI_DISC ;===================================================================================== ;SAIDA ANTECIPADA DO MODO DE TESTE DE DISCAGEM POR APERTAR A TECLA "#" ;===================================================================================== MOVFW GER XORLW .4 ;TESTA SE ESTÁ EM MODO DE DISCAGEM PARA TESTE BTFSS STATUS,Z GOTO SAI_DISC1 ;NÃO ESTÁ, ENTÃO SAI DA ROTINA BTFSS FLAG_RTEC ;ESTÁ, ENTÃO TESTA POR UMA TECLA RECEBIDA GOTO SAI_DISC1 ;AINDA NÃO RECEBEU NENHUMA E SAI DA ROTINA MOVFW XTECLA ;RECEBEU XORLW .11 BTFSS STATUS,Z ;TESTA SE É TECLA '#' GOTO SAI_DISC1 ;NÃO, DESPREZA E SAI DA ROTINA BCF FLAG_RTEC ;É TECLA '#",APAGA FLAG DE RECEPÇÃO DE TECLADO GOTO SEG_DES_CON ;E VAI PARA O FIM ANTECIPADO DA ROTINA DE DISCAGEM SAI_DISC1 GOTO MAIN ;VOLTA AO LOOP PRINCIPAL ;FIM DO PROGRAMA PRINCIPAL ;********************************************************************************* ; SUB - ROTINAS ;================================================================================ ; INICIALIZAÇÃO DE PORTAS E REGISTRADORES ;================================================================================ START MOVLW 0X07 MOVWF CMCON ;DESLIGA COMPARADORES22 CLRF PORTA ; RESETA PORTB CLRF PORTB ; RESETA PORTB BANK1 MOVLW B'10011110' ; SETUP DA DIREÇÃO PORTB MOVWF TRISB MOVLW B'11100011' ; SETUP DA DIREÇÃO PORTA MOVWF TRISA BANK0 CLRF FLAGS ;ZERA FLAGS CLRF FLAGS1 CLRF FLAGS2 CLRF FLAGS3 CLRF FLAGS4 CLRF FLAGS5 MOVLW V_PANICO ;VALOR INICIAL PARA TEMPO DO BOTÃO EM MODO PANICO MOVWF R_PANICO CLRF GER ;RESETA GERENCIAMENTO DE PASSOS CLRF GER1 ;IDEM CALL CARGA_NTD ;4 TECLAS A RECEBER BCF LED_ARM_PROG ;DESLIGA LED_ARM_PROG CALL SET_UP_NORMAL ;ACERTA OPTION_REG E LIGA INTERRUPÇÕES ;============================================================================== ; BUSCA NA EEPROM O MODO DE DISCAGEM GRAVADO (TOM/PULSO) ;============================================================================== MOVLW 0X7D CALL EEREAD ;LE O MODO DE DISCAGEM NA EEPROM ANDLW 0X01 ADDLW 0XFF BSF FLAG_MODO_TOM ;ACERTA O FLAG ORIENTADOR DE MODO DE DISCAGEM BTFSS STATUS,Z BCF FLAG_MODO_TOM ;=============================================================================== ; ROTINA DE RESET DE SENHA (EM SITUAÇÃO DE ESQUECIMENTO PELO USUÁRIO) ;=============================================================================== ; DESLIGAR A ALIMENTAÇÃO, MANTER APERTADO BOTÃO 'PROG' E RELIGAR ALIMENTAÇÃO ; UM APITO LONGO CONFIRMARÁ A MUDANÇA. ; ATENÇÃO: TODOS OS CONTROLES E SENSORES SERÃO APAGADOS. A SENHA VOLTARA A SER ; O PADRÃO '1234'. BTFSC PROG ;TESTA BOTÃO 'PROG' GOTO SAI_RESET_SENHA ;NÃO ESTÁ APERTADO, SEGUE A ROTINA NORMAL BSF LED_ARM_PROG ;ESTÁ APERTADO, ENTÃO VAI TROCAR A SENHA PARA A PADRÃO BSF FLAG_ARM_PROG ;LIGA LEDS PARA INDICAR A AÇÃO CALL RESETA_SENHA ;CHAMA A ROTINA QUE GRAVA A SENHA PADRÃO CALL APAGAEEPROM ;APAGA TODOS CONTROLES E SENSORES GRAVADOS CALL BIP_LONGO ;AVISA O FIM DA OPERAÇÃO COM UM BIP LONGO MOVLW .1 ;PEQUENO DELAY CALL DELAYW BTFSS PROG ;TESTA SE O BOTÃO 'PROG' AINDA ESTÁ APERTADO GOTO $-3 ;AINDA ESTÁ, E AGUARDA A SOLTURA PELO USUÁRIO BCF LED_ARM_PROG ;DESLIGA OS LEDS ACIONADOS NA OPERAÇÃO BCF FLAG_ARM_PROG ; FIM DA ROTINA DE RESET DE SENHA, PULANDO O APITO INICIAL, E INDO PARA ; O PROGRAMA PRINCIPAL RETURN ;RETORNA AO PROGRAMA PRINCIPAL SAI_RESET_SENHA CALL BIP ;BIP INICIAL AO LIGAR ; FIM DA ROTINA DE INICIALIZAÇÃO DE PORTAS E REGISTRADORES RETURN ;RETORNA AO PROGRAMA PRINCIPAL ;=================================================================================== ; ROTINA DE INICIO DA CONEXÃO TELEFONICA ;=================================================================================== CONECTANDO_LINHA BSF RELE_LINHA ;LIGA RELE DA LINHA TELEFONICA CLRF T0 ;ESPERA PARA DISCAR CLRF T1 ;ZERA TEMPORIZADORES BTFSS T1,5 ;TESTA BIT PELO TEMPO DESEJADO GOTO $-1 RETURN ;===================================================================================== ; ROTINA DE FIM DA CONEXÃO TELEFONICA ;===================================================================================== DESCONECTANDO_LINHA BCF RELE_LINHA ;DESLIGA RELE CLRF T0 ;TEMPO DE ESPERA DESCONECTADO CLRF T1 BTFSS T1,5 GOTO $-1 RETURN ;====================================================================================== ; ROTINA GERADORA DE PULSO ;====================================================================================== SEND_PULSO MOVWF S_VAL ;SALVA NÚMERO A DISCAR MOVF S_VAL,F BTFSS STATUS,Z GOTO NOVO_PULSO MOVLW 0X0A ;SE '0' = 10 PULSOS MOVWF S_VAL NOVO_PULSO BCF RELE_LINHA CALL PULSO_66MS ;MAKE PERIOD 66,6 MSEG ;LINHA TELEFONICA FICA COM 48V BSF RELE_LINHA CALL PULSO_33MS ;BREAK PERIOD 33,3 MSEG ;LINHA FICA COM = +-8 VOLTS (CONECTADA) DECFSZ S_VAL,F GOTO NOVO_PULSO 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 RETURN ;======================================================================================== ; DELAYS PARA DISCAGEM EM MODO PULSO ;======================================================================================== PULSO_66MS CLRF T0 ;DELAY DE 66 MS CLRF T1 BTFSS T1,1 GOTO $-1 RETURN PULSO_33MS CLRF T0 ;DELAY DE 33 MS CLRF T1 BTFSS T1,0 GOTO $-1 RETURN ;======================================================================================= ; ROTINA GERADORA DE DTMF ;======================================================================================= ; ENVIA NÚMERO A DISCAR PARA SAIDA DTMF S1,S2 ; EM FORMATO DE DUPLO TOM CORRESPONDENTE SEND_DTMF MOVWF S1A ;SALVA NUMERO ;======================================================================================== ; INICIO DO PERIODO SEM INTERRUPÇÃO DE TECLADO E TX BCF INTCON,GIE ;DESLIGA INTERRUPÇÕES BTFSC INTCON,GIE ;GARANTE O DESLIGAMENTO DAS INTERRUPÇÕES GOTO $-2 CALL SET_UP_TOM ;ACERTA PARA ENVIAR APENAS TOM NA INTERRUPÇÃO BSF FLAG_GTOM ;SETA PARA ACERTAR CAMINHO CORRETO DA ROTINA DE TOM MOVFW S1A ;RECUPERA NUMERO ANDLW 0X0F ;LIMITA O JUMP MOVWF AUX ;SALVA O VALOR EM AUX MOVLW TABH ;PEGA ENDEREÇO DA TABELA ADDWF AUX,W ;SOMA COM O VALOR CALL GET ;VAI BUSCAR VALOR NA TABELA HIGH MOVWF FREQH ; 'W' RETORNA O VALOR , COLOCAMOS EM FREQH SWAPF FREQH,F ;INVERTEMOS MOVLW TABL ;BUSCAMOS AGORA O ENDEREÇO DA TABELA LOW ADDWF AUX,W ;SOMA COM O VALOR EM AUX CALL GET ;VAI BUSCAR VALOR NA TABELA LOW MOVWF FREQL ; 'W' RETORNA O VALOR E COLOCAMOS EM FREQL SWAPF FREQL,F ;TAMBÉM INVERTEMOS ELE MOVLW 0XFF ;COMO A PARTE ALTA NÃO INTERESSA (CONTADOR DE 8 BITS) MOVWF TMR1H ;COLOCAMOS 0XFF, POIS ENTÃO IRÁ DISPARAR INTERRUPÇÃO ; AO CONTAR 255+1 BSF INTCON,GIE ;LIGA INTERRUPÇÃO ;============================================================================ ; DELAY PARA ENVIO DO TOM ;============================================================================ MOVLW .2 ;TEMPO DO TOM SENDO ENVIADO MOVWF X3 REC_X2 MOVLW .255 ;TEMPO DO TOM COM TESTE DE TECLADO E TX MOVWF X2 REC_X1 MOVLW .100 MOVWF X1 DECFSZ X1,F GOTO $-1 CALL DESV_INT_TMR0 ;REALIZA A VARREDURA POR CAMINHO ALTERNATIVO DECFSZ X2,F GOTO REC_X1 DECFSZ X3,F GOTO REC_X2 ;FIM DO TEMPO QUE O TOM ESTAVA SENDO ENVIADO ;=========================================================================== BCF TOM1 ;RESETA SAÍDA DE TOM 1 BCF TOM2 ;RESETA SAÍDA DE TOM 2 BCF INTCON,GIE ;DESLIGA INTERRUPÇÕES BTFSC INTCON,GIE ;CONFERE DESLIGAMENTO GOTO $-2 BCF FLAG_GTOM ;ACERTA CAMINHO DA INTERRUPÇÃO PARA NORMAL CALL SET_UP_NORMAL ;SETUP NORMAL E RELIGA INTERRUPÇÕES ;FIM DO PERIODO SEM INTERRUPÇÃO DE TECLADO E TX ;======================================================= MOVLW .1 ;TEMPO MORTO ENTRE ENVIOS 97 MSEG CALL DELAYW RETURN ;=================================================================================================== ; ROTINAS AUXILIARES DE TECLADO ;=================================================================================================== CARGA_NTD MOVLW .4 ;CARGA PARA RECEBER 4 TECLAS MOVWF NTD RETURN ;**************************************************************************************************** SET_UP_NORMAL ;ROTINA DE SET-UP DE OPTION_REG E INTERRUPÇÕES PARA MODO NORMAL BANK1 MOVLW B'10000000' ;TMR0/2 MOVWF OPTION_REG BANK0 BCF INTCON,T0IF MOVLW B'10100001' MOVWF INTCON ;LIGA GERAL E INTERRUPÇÃO DO TMR0 RETURN ;==================================================================================================== SET_UP_TOM ;ROTINA PARA SET-UP DE OPTION_REG E INTERRUPÇÕES PARA GERAR TONS (DTMF) BANK1 MOVLW B'10000010' MOVWF OPTION_REG MOVLW B'00000001' MOVWF PIE1 BANK0 MOVLW B'00110001' MOVWF T1CON MOVLW B'1100000' MOVWF INTCON RETURN ;=================================================================================================== ; ROTINAS DE TOQUES DE SIRENE ;=================================================================================================== ;UM TOQUE EM MODO DE TESTE DE SENSORES - PASSO 6 HUM_TOQUE_SIRENE_TESTE BSF SIRENE CALL M_TOQUE CALL M_TOQUE BCF SIRENE RETURN ;UM TOQUE DE SIRENE HUM_TOQUE_SIRENE BSF SIRENE CALL TEMPO_INT_SIRENE BCF SIRENE RETURN ;TRES TOQUES DE SIRENE TRES_TOQUES_SIRENE CALL HUM_TOQUE_SIRENE CALL TEMPO_INT_SIRENE ;DOIS TOQUES DE SIRENE DOIS_TOQUES_SIRENE CALL HUM_TOQUE_SIRENE CALL TEMPO_INT_SIRENE CALL HUM_TOQUE_SIRENE ;ROTINA DE TEMPO PARA OS TOQUES EM MODO NORMAL TEMPO_INT_SIRENE CLRF T1 CLRF T0 BTFSS T1,3 GOTO $-1 RETURN ; TOQUE PARA QUANDO HOUVER SETORES NÃO FECHADOS AO TENTAR ARMAR O ALARME PJ_ABERTA_SIRENE MOVLW .5 MOVWF X3 N_COM BSF SIRENE CALL M_TOQUE BCF SIRENE CALL M_TOQUE DECFSZ X3,F GOTO N_COM RETURN ;TEMPO MAIS REDUZIDO PARA DIFERENCIAR OS TOQUES M_TOQUE CLRF T1 CLRF T0 BTFSS T1,1 GOTO $-1 RETURN ;=================================================================================================== ; ROTINAS DE GRAVAÇÃO DE CONTROLES E SENSORES ;=================================================================================================== GRAVAR_CONTROLE_SENSOR ;FLAG_CONTROL=1 CONTROLES / FLAG_CONTROL=0 SENSORES CALL PROCURA_TX ;VERIFICA SE JÁ FOI GRAVADO NA EEPROM ADDLW .1 ;TESTA RETORNO DA ROTINA BTFSC STATUS,Z GOTO LOOPU8 ;SEGUE A GRAVAÇÃO CALL BIP ;BIP BSF LED_Z3 ;ACENDE LED DA ZONA 3 PARA INDICAR QUE JÁ FOI GRAVADO MOVLW .5 ;DELAY CALL DELAYW BCF LED_Z3 ;DESLIGA LED DA ZONA 3 GOTO FIM_GRAV ;APENAS SINALIZA COM BIP POIS, JÁ ESTA GRAVADO LOOPU8 MOVFW R_END_MIN CALL EEREAD ;LE ENDEREÇO INICIAL RESERVADO A CONTROLES MOVWF RES0A ;SALVA EM RES0A INCF R_END_MIN,F MOVFW R_END_MIN CALL EEREAD MOVWF RES1A ;SALVA EM RES1A INCF R_END_MIN,F MOVFW R_END_MIN CALL EEREAD XORLW 0XFF ;VERIFICA SE ALGUM BYTE FOI GRAVADO BTFSS STATUS,Z ;COMPARANDO COM 0XFF GOTO JA_GRAV MOVFW RES1A XORLW 0XFF BTFSS STATUS,Z GOTO JA_GRAV MOVFW RES0A XORLW 0XFF BTFSS STATUS,Z GOTO JA_GRAV ;JÁ FOI GRAVADO GRAVAR_C MOVFW RES0 ;PEGA VALOR RECEBIDO DO CONTROLE MOVWF TMP ;COLOCA NO BUFFER MOVFW R_END_MIN CALL EEWRITE ;ESCREVE NA EEPROM MOVFW RES1 MOVWF TMP ;COLOCA NO BUFFER DECF R_END_MIN,F MOVFW R_END_MIN CALL EEWRITE ;ESCREVE NA EEPROM MOVFW RES2 MOVWF TMP ;COLOCA NO BUFFER DECF R_END_MIN,F MOVFW R_END_MIN CALL EEWRITE ;ESCREVE NA EEPROM FIM_GRAV CALL BIP ;SINALIZA SUCESSO NA GRAVAÇÃO COM UM BIP RETURN ;SAI DA ROTINA JA_GRAV MOVFW R_END_MIN ;COMPARA COM ENDEREÇO FINAL PARA CONTROLES SUBWF R_END_MAX,W BTFSS STATUS,C GOTO VAI_MEM_CHEIA ;NÃO HÁ COMO GRAVAR MAIS, EXCETO SE RESETAR A CENTRAL. INCF R_END_MIN,F GOTO LOOPU8 ;EXAMINA OS PRÓXIMOS 3 BYTES VAI_MEM_CHEIA ;TODAS AS POSIÇÕES JÁ FORAM GRAVADAS CALL BIP_LONGO ;SINALIZA ESTA CONDIÇÃO COM BIP LONGO CALL BIP_LONGO ;SINALIZA ESTA CONDIÇÃO COM BIP LONGO CALL BIP_LONGO ;SINALIZA ESTA CONDIÇÃO COM BIP LONGO RETURN ;====================================================================================== ; PROCURA POR SENSOR/CONTROLE SE ESTÁ GRAVADO NA MEMÓRIA EEPROM ;====================================================================================== PROCURA_TX CLRF TEMP LOOPU7 MOVFW TEMP CALL EEREAD ;LE ENDEREÇO INICIAL RESERVADO A CONTROLES MOVWF RES2A ;SALVA EM RES0A INCF TEMP,F MOVFW TEMP CALL EEREAD MOVWF RES1A INCF TEMP,F MOVFW TEMP CALL EEREAD XORWF RES0,W BTFSS STATUS,Z GOTO N_ACHOU MOVFW RES1A XORWF RES1,W BTFSS STATUS,Z GOTO N_ACHOU MOVFW RES2A XORWF RES2,W BTFSS STATUS,Z GOTO N_ACHOU MOVFW TEMP RETURN ;ACHOU TX E RETORNA 'TEMP'( O ENDEREÇO) EM 'W' N_ACHOU INCF TEMP,F MOVFW TEMP SUBLW MEM_MAX ;TAMANHO MAXIMO RESERVADO PARA CONTROLES BTFSC STATUS,C GOTO LOOPU7 ;VAI PROCURAR NOS 3 ENDEREÇOS ACIMA RETLW 0XFF ;NÃO ACHOU EM TODOS ESPAÇOS RESERVADOS ;=================================================================================================== ; ESCRITA DA EEPROM ;=================================================================================================== EEWRITE ;'W'= ENDEREÇO ; TMP = DADO A ESCREVER BANK1 movwf EEADR BANK0 MOVFW TMP ;PEGA PRIMEIRO DADO BANK1 movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; habilita a escrita bcf INTCON,GIE btfsc INTCON,GIE ;veja AN 576 goto $-2 movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR WRITE_SN_A clrwdt btfsc EECON1, WR ; acabou de escrever? goto WRITE_SN_A bcf EECON1, WREN ; desabilita a escrita BANK0 BSF INTCON,GIE BTFSS INTCON,GIE GOTO $-2 RETURN ;=================================================================================================== ; LEITURA DA EEPROM ;=================================================================================================== EEREAD ; 'W'= ENDEREÇO DA LEITURA ; RETORNANDO EM 'W' O DADO E EM 'TMP' BANK1 movwf EEADR bsf EECON1, RD ; do a read\par clrwdt btfsc EECON1, RD ; Read done ?\par goto $-2 movf EEDATA,W BANK0 MOVWF TMP ;RECUPERA PRIMEIRO NUMERO DA EEPROM RETURN ;------------------------------------------------------------------------------ APAGAEEPROM ; ROTINA PARA APAGAR TODOS OS CONTROLES/ SENSORES DA EEPROM MOVLW MEM_MAX ;LIMITE MÁXIMO MOVWF AUX RET6 CLRWDT MOVFW AUX MOVLW .1 ;ACERTA ENDEREÇO TIRANDO 1 SUBWF AUX,W BANK1 movwf EEADR MOVLW 0XFF movwf EEDATA bcf EECON1, EEIF bsf EECON1, WREN ; HABILITA ESCRITA bcf INTCON,GIE btfsc INTCON,GIE ;VEJA AN 576 goto $-2 movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR clrwdt btfsc EECON1, WR ; COMPLETOU A ESCRITA? goto $-2 bcf EECON1, WREN ; DESABILITA ESCRITA BANK0 DECFSZ AUX,F GOTO RET6 bsf INTCON,GIE ;HABILITA INTERRUPÇÕES RETURN ;=================================================================================================== ; RETORNA SENHA AO VALOR ORIGINAL = '1234' ;=================================================================================================== RESETA_SENHA MOVLW 0X12 ;CARREGA 12 MOVWF TMP ;NO BUFFER MOVLW 0X7E ;APONTA ONDE GRAVAR CALL EEWRITE ;ESCREVE NA EEPROM MOVLW 0X34 ;CARREGA 34 MOVWF TMP ;NO BUFFER MOVLW 0X7F ;APONTA PARA O PRÓXIMO ENDERECO CALL EEWRITE ;ESCREVE NA EEPROM RETURN ;RETORNA DA ROTINA ;====================================================================================== ; ROTINAS DE SOM - GERAÇÃO DE BIPS PARA O TECLADO ;====================================================================================== ;COMPARTILHAMENTO DO MESMO PINO DO LED ARM/PROG COM A CAPSULA DE CRISTAL PARA SOM DE BIP DE TECLADO ;====================================================================================== ; ÚNICO BIP ;====================================================================================== BIP ;GERA BIP E MANTÉM ESTADO DO PINO BUZZER/ARM_PROG NO MESMO NIVEL ANTERIOR MOVLW .255 MOVWF TEMP DNV1 BTFSS T0,0 GOTO $-1 BTFSC BUZZER GOTO D_BUZ BSF BUZZER GOTO SAI8 D_BUZ BCF BUZZER SAI8 BTFSC T0,0 GOTO $-1 BTFSC BUZZER GOTO D_BUZ1 BSF BUZZER GOTO SAI9 D_BUZ1 BCF BUZZER SAI9 DECFSZ TEMP,F GOTO DNV1 RETURN ;====================================================================================== ; TRES BIPS SEGUIDOS ;====================================================================================== TRES_BIPS CALL BIP ;====================================================================================== ; DOIS BIPS SEGUIDOS ;====================================================================================== DOIS_BIPS CALL DELAY_INT CALL BIP CALL DELAY_INT CALL BIP RETURN ;====================================================================================== ; BIP LONGO ;====================================================================================== BIP_LONGO CALL BIP ; BIP LONGO CALL BIP CALL BIP CALL BIP CALL BIP CALL BIP CALL BIP CALL BIP RETURN ;====================================================================================== ; DELAY ENTRE BIPS ;====================================================================================== DELAY_INT CLRF T0 CLRF T1 BTFSS T1,2 ;2 GOTO $-1 RETURN ;===================================================================================== ; DELAY ;===================================================================================== DELAYW MOVWF TEMP VJ1 CALL DELAY1 DECFSZ TEMP,F GOTO VJ1 DELAY1 MOVLW .255 CLRF X1 DELAY MOVWF X2 Lp CLRWDT DECFSZ X1,F GOTO Lp DECFSZ X2,F GOTO Lp RETURN ;============================================================================= ; DELAY_L ;============================================================================= DELAY_L GOTO $+1 ;CARREGAR CAPACITANCIAS PARASITAS NOS FIOS GOTO $+1 ; E ESTABILIZAR O NIVEL ANTES DE TESTA-LO GOTO $+1 GOTO $+1 RETURN ;============================================================================= RESETA_FLAGS_DISC BCF FLAG_DISC_M1 ;RESETA FLAG TRAVA DE CONTINUAÇÃO DE DISCAGEM BCF FLAG_DISC_M2 BCF FLAG_DISC_M3 BCF FLAG_DISC_M4 RESETA_T123SET BCF FLAG_SETDISC BCF FLAG_DISC_T1 ;RESETA FLAG TRAVA DE CONTINUAÇÃO DE DISCAGEM BCF FLAG_DISC_T2 BCF FLAG_DISC_T3 RETURN ; FIM DAS SUB-ROTINAS ;*************************************************************************************************** ; ROTINA DE INTERRUPÇÃO ;*************************************************************************************************** INT_TMR0 MOVWF WTEMP ;SALVA 'W' SWAPF STATUS,W ;SALVA 'STATUS' MOVWF STATUSTEMP BANK0 BTFSC FLAG_GTOM ;TESTA FLAG DE MODO DE DISCAGEM POR TOM GOTO INT_TOM ;SOMENTE PARA GERAÇÃO DE TOM MOVLW .100 MOVWF TMR0 DESV_INT_TMR0 CLRWDT ;APAGA WDT (ANTI_TRAVAMENTOS) 18MS MÁX. INCFSZ T0,F GOTO SG1 INCF T1A,F INCFSZ T1,F ;BIT 2 = 0,2 SEG GOTO SG0 INCF T2,F ;T2,1=26 SEG INCF T2A,F ;T2A,4= 3MIN 30SEG SG0 INCFSZ T0C,F GOTO SG7 INCFSZ T1C,F GOTO SG7 INCF T2C,F SG7 ;==================================================================================================== ; TESTE DAS ENTRADA Z1 E Z2 ;==================================================================================================== BANK1 BSF TRIS_IN_Z1 ;VIRAM ENTRADAS BSF TRIS_IN_Z2 BANK0 CALL DELAY_L BTFSS IN_Z1 BCF FLAG_INZ1 BTFSC IN_Z1 BSF FLAG_INZ1 BTFSS IN_Z2 BCF FLAG_INZ2 BTFSC IN_Z2 BSF FLAG_INZ2 ;==================================================================================================== ; PISCA LEDS INDICADORES DE VIOLAÇÃO DAS ZONAS 1,2,3, E ARMADO/PROGRAMAÇÃO ;==================================================================================================== BTFSS T1A,2 ;TESTA POR 0,205 SEGUNDOS GOTO SGL1 BTFSC FLAG_TH GOTO SG1 BSF FLAG_TH BCF FLAG_TL PIS2 BTFSS FLAG_VZ1 GOTO IN_VZ1_X4 BANK1 BCF TRIS_IN_Z1 ;VIRA SAÍDA BANK0 BTFSC LED_Z1 GOTO DESLIGA_Z1 BSF LED_Z1 GOTO TESTA_VZ2 SGL1 BTFSC FLAG_TL GOTO SG1 BSF FLAG_TL BCF FLAG_TH GOTO PIS2 DESLIGA_Z1 BCF LED_Z1 GOTO TESTA_VZ2 IN_VZ1_X4 BANK1 BSF TRIS_IN_Z1 ;VIRA SAÍDA BANK0 TESTA_VZ2 BTFSS FLAG_VZ2 GOTO IN_VZ1_X5 BANK1 BCF TRIS_IN_Z2 ;VIRA SAÍDA BANK0 BTFSC LED_Z2 GOTO DESLIGA_Z2 BSF LED_Z2 GOTO TESTA_VZ3 DESLIGA_Z2 BCF LED_Z2 GOTO TESTA_VZ3 IN_VZ1_X5 BANK1 BSF TRIS_IN_Z2 ;VIRA ENTRADA BANK0 TESTA_VZ3 BTFSS FLAG_VZ3 GOTO TESTA_ARM_PROG BTFSC LED_Z3 GOTO DESLIGA_Z3 BSF LED_Z3 GOTO TESTA_ARM_PROG DESLIGA_Z3 BCF LED_Z3 TESTA_ARM_PROG BTFSS FLAG_ARM_PROG GOTO SG1 BTFSC LED_ARM_PROG GOTO DESLIGA_ARM_PROG BSF LED_ARM_PROG GOTO SG1 DESLIGA_ARM_PROG BCF LED_ARM_PROG SG1 ; FIM DA ROTINA DE PISCA DOS LEDS DE ZONAS ;=================================================================================================== ; TECLADO ;=================================================================================================== ; RETORNA VALOR EM XTECLA, QUANDO FLAG_RTEC = 1 ( OBS. APAGA-LO MANUALMENTE APÓS LEITURA DE XTECLA) MOVLW 0XFF BTFSC FLAG_RTEC ;CARACTER AINDA NO BUFFER XTECLA GOTO SAI_TEC ;SAI DA ROTINA DO TECLADO ; TESTA POR TECLAS 1,5,9 APERTADAS BANK1 BSF TRIS_LIN2 BSF TRIS_LIN3 BSF TRIS_LIN5 BCF TRIS_LIN7 BANK0 BSF LIN7 ;PORTB,2 LINHA 5 CALL DELAY_L BTFSC LIN2 MOVLW .1 BTFSC LIN3 MOVLW .5 BTFSC LIN5 MOVLW .9 MOVWF TECLA ; TESTA POR TECLAS 2,8 E 0 APERTADAS BANK1 BCF TRIS_LIN3 BSF TRIS_LIN7 BANK0 BSF LIN3 ;PORTB,1 LINHA 3 CALL DELAY_L BTFSC LIN2 MOVLW .2 BTFSC LIN5 MOVLW .8 BTFSC LIN7 MOVLW .0 ; ; TESTA POR TECLAS 3,6 E # APERTADAS BANK1 BSF TRIS_LIN3 BCF TRIS_LIN5 BANK0 BSF LIN5 ;PORTB,2 LINHA 5 CALL DELAY_L BTFSC LIN2 MOVLW .3 BTFSC LIN3 MOVLW .6 BTFSC LIN7 MOVLW .11 ;# SUSTENIDO ; TESTA POR TECLAS 4,7 E * APERTADAS BANK1 BCF TRIS_LIN2 BSF TRIS_LIN5 BANK0 BSF LIN2 ;PORTB,4 LINHA 2 CALL DELAY_L BTFSC LIN3 MOVLW .4 BTFSC LIN5 MOVLW .7 BTFSC LIN7 MOVLW .10 ;* ASTERISTICO MOVWF TECLA SH9 XORLW 0XFF BTFSC STATUS,Z GOTO SAI_DIR BTFSC FLAG_APERTADO GOTO C_CONT ;BOTÃO APERTADO, NÃO DECREMENTA TEMPO BTFSC FLAG_PL GOTO VAI_COMP_2L BSF FLAG_PL MOVFW TECLA MOVWF TECLA1 ;SALVA PRIMEIRA LEITURA GOTO SAI_TEC ;SAI DA ROTINA DO TECLADO ERRO_L BCF FLAG_PL ;PRIMEIRA LEITURA DIFERENTE DA SEGUNDA MOVLW 0XFF ;APAGA RESULTADOS MOVWF TECLA MOVWF TECLA1 GOTO SAI_TEC ;SAI DA ROTINA DO TECLADO VAI_COMP_2L MOVFW TECLA XORWF TECLA1,W BTFSS STATUS,Z GOTO ERRO_L BSF FLAG_APERTADO MOVFW TECLA MOVWF XTECLA ;CARREGA BUFFER DE RECEPÇÃO DE TECLA APERTADA C_CONT MOVLW .10 ;AGUARDA TEMPO DE 2 MSEG APÓS SOLTURA DA TECLA MOVWF XCNT GOTO SAI_TEC ;SAI DA ROTINA DO TECLADO SAI_DIR BTFSC FLAG_RTEC GOTO SAI_TEC ;SAI DA ROTINA DO TECLADO DECFSZ XCNT,F GOTO SAI_TEC BTFSS FLAG_APERTADO GOTO SAI_TEC ;SAI DA ROTINA DO TECLADO BCF FLAG_APERTADO BSF FLAG_RTEC SAI_TEC ; FIM DA ROTINA DE TECLADO ;=================================================================================================== ; ROTINA DE RECEPÇÃO RF ;=================================================================================================== BTFSC FLAG_ROK GOTO SAI_REC ;AINDA TEM UMA RECEPÇÃO NO BUFFER BTFSC FLAG_REST ;TESTA FLAG DE RESTART GOTO SS5 MOVLW .24 MOVWF BITCOUNTER CLRF HC CLRF LC BCF FLAG BSF FLAG_REST SS5: ;A BTFSS FLAG ;TESTA FLAG DE HUM/ZERO RECEBIDO GOTO L2 ;FLAG=0 ;-------------------------------- ;B BTFSS RFIN ;SIN ? TESTA SINAL DE ENTRADA DO RECEPTOR DE RF GOTO M0 ; SIN=0 ;---------------------------------- L2 ;C BTFSS RFIN ;SIN ? GOTO LA1 ;SIN=0 ;------------------------------------- ;E BSF FLAG ;SIN=1 INCF HC,F BTFSC STATUS,Z DECF HC,F GOTO LA2 ;VAI CONTAR TEMPO ENTRE AS INTERRUPÇÕES ;--------------------------------------------------------- LA1 ;D INCF LC,F ;INCREMENTA REGISTRADOR DE LOW SIGNAL NA ENTRADA RF BTFSC STATUS,Z DECF LC,F LA2 GOTO L1 M0 ;---------------------------------- ;F MOVFW LC ;TESTA SE NÃO PASSOU DO LIMITE MAXIMO DE TEMPO EM LOW NA ENTRADA DE RF SUBLW TMAX BTFSC STATUS,C GOTO G1 BCF FLAG_REST GOTO SAI_REC ;C=0 (-) - LC>TMAX (REJEITAR DADO - PAUSA INICIAL) ;F' ;----------------------------------- G1 MOVFW HC ;OBTEM O VALOR DE 'CARRY'(HUM OU ZERO) SUBWF LC,W ;DESLOCA O BIT NOS REGISTRADORES DE RESULTADO RRF RES2,F RRF RES1,F RRF RES0,F ;------------------------------------- ;H DECFSZ BITCOUNTER,F ;DECREMENTA O CONTADOR DE BITS A SER RECEBIDO GOTO L0 ;LE PROXIMO BIT BTFSC FLAG1 ;TESTA SE É A PRIMEIRA OU A SEGUNDA RECEPÇÃO GOTO PULA1 MOVFW RES2 ;SALVA A PRIMEIRA LEITURA PARA COMPARAÇÃO COM UMA SEGUNDA MOVWF RES2A MOVFW RES1 MOVWF RES1A MOVFW RES0 MOVWF RES0A BSF FLAG1 ;SETA FLAG DE PRIMEIRA RECEPÇÃO MOVLW QB MOVWF BITCOUNTER L0 CLRF HC CLRF LC BCF FLAG GOTO SAI_REC PULA1 BCF FLAG1 ;SEGUNDA RECEPÇÃO, COMPARA COM A PRIMEIRA MOVFW RES2 XORWF RES2A,W BTFSS STATUS,Z GOTO RESETAC MOVFW RES1 XORWF RES1A,W BTFSS STATUS,Z GOTO RESETAC MOVFW RES0 XORWF RES0A,W BTFSS STATUS,Z GOTO RESETAC ;ERRO DE RECEPÇÁO MOVFW RES2 MOVWF BOT ;SALVA RES2 EM RES3 MOVLW B'00111111' ANDWF RES2,F ;APAGA BOTÕES MOVFW RES2 ;ELIMINA CODIGO 0XFFFFFF XORLW 0XFF BTFSS STATUS,Z GOTO RC_OK MOVFW RES1 XORLW 0XFF BTFSS STATUS,Z GOTO RC_OK MOVFW RES0 XORLW 0XFF BTFSC STATUS,Z GOTO RESETAC ;ERRO DE RECEPÇÁO RC_OK BSF FLAG_ROK GOTO SAI_REC ;OK - BOA RECEPÇÃO RESETAC ; APAGA RESULTADOS DE COMPARAÇÃO CLRF RES2A CLRF RES1A CLRF RES0A BCF FLAG_ROK L1 SAI_REC ;FIM DA ROTINA DE RECEPÇÃO ;================================================================================================== BTFSC FLAG_GTOM ;VERIFICA DESVIO DE ROTINA NORMAL/TOM RETURN ;SAI COMO SUBROTINA EM MODO TOM ;================================================================================================== ;=================================================================================================== ; FINALIZAÇÃO DA INTERRUPÇÃO ;=================================================================================================== SAI_INT BCF INTCON,T0IF ;APAGA FLAG DE MUDANÇA DE ESTADO SWAPF STATUSTEMP,W ;RECUPERA 'STATUS' MOVWF STATUS SWAPF WTEMP,F SWAPF WTEMP,W ;RECUPERA 'W' RETFIE ;************************************************************************************************** ; ROTINA DE INTERRUPÇÕES (GERA DTMF NAS SAIDAS S1 E S2) ;-------------------------------------------------------------------------------------------------- INT_TOM BTFSC PIR1,TMR1IF GOTO V3 SWAPF FREQH,W MOVWF TMR0 BTFSS TOM1 GOTO V2 BCF TOM1 GOTO SAI_INT V2 BSF TOM1 GOTO SAI_INT ;-------------------------------- V3 BCF PIR1,TMR1IF SWAPF FREQL,W MOVWF TMR1L DECF TMR1H,F BTFSS TOM2 GOTO V4 BCF TOM2 GOTO SAI_INT V4 BSF TOM2 GOTO SAI_INT ;=================================================================================================== ; PRÉ GRAVAÇÃO DA EEPROM AO GRAVAR O PIC ;=================================================================================================== ORG H'2100' + 0X7D DE 0X01,0X12,0X34 ;MODO DISCAGEM= 1 (TOM) ; SENHA INICIAL = 1234 END ;FIM DO PROGRAMA E AINDA NÃO FIQUEI LOUCO!!!!(ESPERO)