;********************************************************************************************************** ; PROJETO SENHA ELETRONICA SEM TECLADO (USE UM CELULAR PARA GERAR SONS DTMF) ; MICROCONTROLADOR: PIC12F675 E CIRCUITO INTEGRADO MT8870DE ; INICIO : 28/08/2013 TERM.: 29/08/2013 ; ATUALIZADO EM: 05/08/13 ; ; AUTOR: CLÁUDIO LÁRIOS ; BLOG 'LARIOS.TECNOLOGIA.WS' ; PROCESSADOR: PIC 12F675 (OPCIONAL 12F629) ; OBJETIVO: PODERÁ SER USADO PARA LIBERAR O ACIONAMENTO DE FECHADURA ELÉTRICA DIGITANDO UMA SENHA ; EM UM CELULAR PRÓXIMO DO EQUIPAMENTO. ; OPÇÃO DE ACIONAMENTO CONTINUO OU PULSADO. ;********************************************************************************************************** ; COMO USAR: ; APROXIME O CELULAR DO MICROFONE DO EQUIPAMENTO ( MÁXIMA DISTANCIA = 10 CM). ; DEVE-SE ENTRAR COM UMA SENHA DE 6 DÍGITOS PARA A LIBERAÇÃO. QUANDO O NÚMERO DIGITADO É ACEITO, OUVE-SE ; UM 'BIP' EM RESPOSTA. CASO NÃO ESCUTE, REPITA O DIGITO. ; A SENHA INICIAL É '012345', DEVENDO SER TROCADA POR UMA PESSOAL. EVITE AS JÁ CONHECIDAS DATAS DE ; NASCIMENTO, CASAMENTO,ETC. ; PARA TROCAR A SENHA DIGITE '*74123' QUE ENTRARÁ EM MODO DE 'TROCA DE SENHA'. UM BIP LONGO SERÁ OUVIDO. ; DIGITE A SENHA ANTIGA. APÓS DIGITA-LA, OCORRERÁ OUTRO BIP LONGO. DIGITE A SENHA NOVA (6 DIGITOS). ; MAIS UM BIP LONGO OCORRERÁ. DIGITE NOVAMENTE A NOVA SENHA, PARA CONFIRMAR. SE TUDO OCORREU NA SEQUENCIA, ; SERÁ OUVIDO 3 BIPS LONGOS EM SEQUENCIA. ; PRONTO!!! SENHA NOVA! ;---------------------------------------------------------------------------------------------------------- ;DEFINIÇÕES DO USUÁRIO: ;---------------------------------------------------------------------------------------------------------- ;ESCOLHA AQUI O MODELO DO MICROCONTROLADOR A SER USADO: ;#DEFINE PIC629 #DEFINE PIC675 ;========================================================================================================== ; ERRO NA SENHA NUMERO_DE_ERROS EQU 0X03 ;QUANTIDADE DE VEZES QUE SE PODE DIGITAR SENHA ERRADA ;========================================================================================================== ; TECLADO - TEMPO SEM DIGITAÇÃO TEMPO_SEM_TECLAR EQU 0X30 ;TEMPO SEM TECLAR MAXIMO (0X0A= 30SEG). ;========================================================================================================== ;---------------------------------------------------------------------------------------------------------- ;COMENTE SE DESEJAR SAIDA EM MODO CONTINUO #DEFINE SAIDA_PULSADA ;SAIDA PULSADA ;---------------------------------------------------------------------------------------------------------- NUMERO_DE_PULSOS EQU .30 ;QUANTIDADE DE ACIONAMENTO RÁPIDOS (PROTEÇÃO DA BOBINA DA FECHADURA) ;========================================================================================================== IFDEF PIC629 #INCLUDE ; ARQUIVO PADRAO ENDIF IFDEF PIC675 #INCLUDE ; ARQUIVO PADRAO ENDIF __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT ERRORLEVEL -302 ;ELIMINA MENSAGENS DE BANCO ERRADO ; 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 S0,S1,S2,S3,S4,S5,S0A,S1A,S2A,S3A,S4A,S5A TEMP,TEMP1,TEMP2,TEMP3,ADDRESS,RER,GER CONTAP,CONT,CONT1,CONT2,CONT3,LC,LC1,FLAGS RTEC,RTEC1 ENDC ;======================DEFINICAO DE BITS E FLAGS============================================== ; TECLADO #DEFINE Q4 GPIO,5 ; PINO 2 #DEFINE Q1 GPIO,1 ; PINO 6 #DEFINE Q2 GPIO,2 ; PINO 5 #DEFINE Q3 GPIO,4 ; PINO 3 #DEFINE SAIDA GPIO,0 ; SAIDA RELE PINO 7 ;variavéis Q4_IN EQU B'111110' ;TUDO ENTRADA (EXCETO GP0) Q4_OUT EQU B'011110' ;GP5=SAIDA PARA BIP - PINO 2 #DEFINE FLAG_B1 FLAGS,0 ;BIT DE TRAVA PARA O BIP POR TEMPO ;SENHA INICIAL ORG 0X2100 DE .10,.1,.2,.3,.4,.5 ; SENHA INICIAL PRÉ-FIXADA (012345) DE .11,.7,.4,.1,.2,.3 ; COMANDO DE TROCA DE SENHA (*74123) ;================================================================================================= ; VETOR DE RESET ;================================================================================================= ORG 0X00 GOTO INICIO ;================================================================================================= ; VETOR DE INTERRUPÇÕES ;================================================================================================= ORG 0X04 RETFIE ;================================================================================================= ; INICIALIZAÇÃO DE VARIAVÉIS E PORTAS ;================================================================================================= INICIO MOVLW .7 ;DESLIGA COMPARADORES MOVWF CMCON BANK1 CALL 0X03FF ;BUSCA CALIBRAÇÃO DO OSCILADOR MOVWF OSCCAL ;TRANSFERE PARA O REG.OSCILADOR MOVLW 0X00 MOVWF OPTION_REG ;DESLIGA PULL-UPS MOVWF WPU IFDEF PIC675 MOVLW .0 MOVWF ANSEL ;LIBERA PORTAS DO AD ENDIF BANK0 MOVLW NUMERO_DE_ERROS ;CARREGA CONTADOR DE MAX. DE SENHAS ERRADAS MOVWF RER ST1 CLRF GPIO CLRF RTEC1 ;ZERA REGISTRADORES CLRF CONTAP CLRF ADDRESS CLRF GER MOVLW Q4_IN ;INICIA COMO ENTRADAS CALL TRISIOX ;ACERTA SENTIDO DAS PORTAS ;================================================================================================= ; PROGRAMA PRINCIPAL ;================================================================================================= MAIN MOVLW TEMPO_SEM_TECLAR MOVWF CONT2 MAIN1 DECFSZ CONT1,F ;CONTADORES TESTAM O TEMPO MAXIMO SEM DIGITAR GOTO PROSS DECFSZ CONT2,F GOTO PROSS BTFSS FLAG_B1 GOTO INICIO BCF FLAG_B1 MOVLW .10 CALL W_BIP_LONGO ;AVISA SAIDA POR TEMPO COM BIP LONGO GOTO INICIO ;TEMPO MAXIMO ATINGIDO SEM DIGITAR ,VAI PARA O INICIO PROSS MOVLW .2 CALL DELAY ;DELAY CALL LE_TECLADO ;TESTA TECLADO MOVFW RTEC1 XORLW 0X00 BTFSC STATUS,Z GOTO MAIN1 ;NENHUMA TECLADA APERTADA BSF FLAG_B1 ;FLAG DE BLOQUEIO DE BIP POR TEMPO MOVLW TEMPO_SEM_TECLAR ;RESETA CONTADOR DE FALTA DE DIGITAÇÃO MOVWF CONT2 MOVFW RTEC1 ;TECLA APERTADA XORLW .12 ;COMPARA COM '#' BTFSC STATUS,Z GOTO ST1 ;CANCELA DIGITAÇÃO MOVFW RTEC1 XORLW .11 ;* BTFSS STATUS,Z GOTO PN3 MOVFW CONTAP XORLW .0 ;SE NÃO FOR O PRIMEIRO DIGITO,APAGA BTFSC STATUS,Z GOTO PN3 ;APAGAR ULTIMO NUMERO DIGITADO CLRF RTEC1 ;APAGA REGISTRADOR DE TECLADO GOTO MAIN CANCELA_OPERAÇÃO GOTO ST1 PN3 MOVLW S0 ;PEGA ENDEREÇO DO REGISTRADOR 'S0' ADDWF CONTAP,W ;SOMO COM POSIÇÃO DA TECLA RECEBIDA MOVWF FSR MOVFW RTEC1 CLRF RTEC1 MOVWF INDF ;SALVA A TECLA RECEBIDA INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO MAIN CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP CLRF GPIO ;================================================================================================= ; GERENCIAMENTO DE PROCESSOS ;================================================================================================= MOVFW GER XORLW .0 BTFSC STATUS,Z GOTO COMPARAR_SENHA_EEPROM ;MODO NORMAL,COMPARA A SENHA DIGITADA MOVFW GER XORLW .1 BTFSC STATUS,Z GOTO COMPARA_SENHA_EEP_NA_TROCA ;MODO TROCA DE SENHA ,PEDE A SENHA ATUAL MOVFW GER XORLW .2 BTFSC STATUS,Z GOTO DIGITADO_SENHA_NOVA ; MODO TROCA DE SENHA,SALVARÁ SENHA NOVA EM S0A..S5A MOVFW GER XORLW .3 BTFSC STATUS,Z GOTO COMPARA_SENHA_NOVA ;MODO DE TROCA DE SENHA, COMPARA SENHA DIGITADA COM SALVA EM S0A...S5A , E SALVA SE IGUAL GOTO ST1 ;INICIO ;================================================================================================= ; COMPARAR SENHA NOVA ;================================================================================================= COMPARA_SENHA_NOVA MOVFW S0 XORWF S0A,W BTFSS STATUS,Z GOTO ERRO MOVFW S1 XORWF S1A,W BTFSS STATUS,Z GOTO ERRO MOVFW S2 XORWF S2A,W BTFSS STATUS,Z GOTO ERRO MOVFW S3 XORWF S3A,W BTFSS STATUS,Z GOTO ERRO MOVFW S4 XORWF S4A,W BTFSS STATUS,Z GOTO ERRO MOVFW S5 XORWF S5A,W BTFSS STATUS,Z GOTO ERRO MOVLW .2 CALL DELAYM MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL DELAYM MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL DELAYM MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL DELAYM ;================================================================================================= ; GRAVAR NA EEPROM A NOVA SENHA ;================================================================================================= CLRF ADDRESS CLRF CONTAP MOVLW S0 ;PEGA ENDEREÇO DE S0 ADDWF CONTAP,W MOVWF FSR RTH3 MOVFW INDF CALL WPROM INCF FSR,F INCF ADDRESS,F INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO RTH3 MOVLW 0XFF MOVWF S0A ;APAGA CONFIRMAÇÃO DE SENHA MOVWF S1A MOVWF S2A MOVWF S3A MOVWF S4A MOVWF S5A CLRF GER ;LIMPA GERENCIADOR DE PASSOS GOTO RETG ;================================================================================================= ; SALVAR SENHA DIGITADA PARA FUTURA COMPARAÇÃO ;================================================================================================= DIGITADO_SENHA_NOVA MOVFW S0 ;SALVA SENHA NOVA PARA COMPARAÇÃO MOVWF S0A MOVFW S1 MOVWF S1A MOVFW S2 MOVWF S2A MOVFW S3 MOVWF S3A MOVFW S4 MOVWF S4A MOVFW S5 MOVWF S5A ;ACRESCENTAR BIPS PARA CONFIRMAR SENHA MOVLW .10 CALL W_BIP_LONGO INCF GER,F GOTO RETG1 ;================================================================================================= ; COMPARANDO SENHA NO MODO DE TROCA ;================================================================================================= COMPARA_SENHA_EEP_NA_TROCA MOVLW .2 ;ACERTA PARA PASSO 2 MOVWF GER ;================================================================================================= ; COMPARA SENHA NA EEPROM ;================================================================================================= COMPARAR_SENHA_EEPROM CLRF ADDRESS CLRF CONTAP MOVLW S0 ;PEGA ENDEREÇO DE S0 ADDWF CONTAP,W MOVWF FSR RTH1 CALL RPROM XORWF INDF,W BTFSS STATUS,Z GOTO TCOMANDOS INCF FSR,F INCF ADDRESS,F INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO RTH1 MOVFW GER ;COMPARAÇÃO OK ,VERIFICA PASSO XORLW 0X02 BTFSS STATUS,Z GOTO SEG92 ;MODO NORMAL - LIBERAR SAIDA DO RELE ;ACRESCENTAR BIPS PARA DAR OK MOVLW .10 CALL W_BIP_LONGO GOTO RETG1 ;MODO TROCA DE SENHA-COMPARAÇÃO DE SENHA ANTIGA OK ,SEGUE ; MODO NORMAL -SENHA CORRETA SEG92 BCF FLAG_B1 ;EVITA APITO APÓS 30 SEGUNDOS MOVLW NUMERO_DE_ERROS ;ZERA CONTADOR DE ERROS MOVWF RER CALL BIP MOVLW 0X10 CALL DELAY CALL BIP MOVLW 0X10 CALL DELAY CALL BIP CLRF GPIO MOVFW GER XORLW .1 BTFSC STATUS,Z GOTO VAI_ENTRAR_NOVA_SENHA ;================================================================================================= ; SENHA CORRETA - LIBERAR SAIDA DO RELE ;================================================================================================= CALL ACIONA_FECHADURA CLRF GER RETG RETG1 CLRF ADDRESS CLRF CONTAP CLRF RTEC1 GOTO MAIN ;================================================================================================= ; RECEBENDO NOVA SENHA EM MODO DE TROCA ;================================================================================================= VAI_ENTRAR_NOVA_SENHA ;BIPS PARA PEDIR NOVA SENHA MOVLW .10 CALL W_BIP_LONGO MOVLW .2 CALL W_BIP INCF GER,F GOTO RETG1 ;================================================================================================= ; DETERMINA SE O DIGITADO É SENHA OU COMANDO DE TROCA DE SENHA ;================================================================================================= TCOMANDOS MOVFW GER XORLW .2 ;PASSO 2 NÃO VE COMANDO BTFSC STATUS,Z GOTO ERRO MOVLW .6 MOVWF ADDRESS CLRF CONTAP MOVLW S0 ;PEGA ENDEREÇO DE S0 ADDWF CONTAP,W MOVWF FSR RTH2 CALL RPROM XORWF INDF,W BTFSS STATUS,Z GOTO ERRO INCF FSR,F INCF ADDRESS,F INCF CONTAP,F MOVFW CONTAP XORLW .6 BTFSS STATUS,Z GOTO RTH2 ;TROCAR SENHA ;DIGITE A SENHA ATUAL ;COLOCA BIPS INDICANDO PARA DIGITAR SENHA ATUAL MOVLW .3 CALL W_BIP_LONGO MOVLW .1 ;ACERTA PARA PASSO 1 MOVWF GER CLRF CONTAP CLRF RTEC1 GOTO MAIN ;VAI PARA ROTINA PRINCIPAL ;================================================================================================= ; SENHA ERRADA ;================================================================================================= ERRO MOVLW .6 ;SEIS BIP DE ERRO CALL W_BIP BCF FLAG_B1 ;EVITA APITO APÓS 30 SEG CLRF GER ;APAGA GERENCIADOR DECFSZ RER,F ;TESTA SE HOUVE 3 ERROS GOTO RETG ;' SENHA INCORRETA' ;================================================================================================= ; BLOQUEIO APÓS 'N' NUMEROS DE TENTATIVAS ERRADAS ;================================================================================================= BLOQ ; GERA BIP PARA 'BLOQUEADO' MOVLW .10 CALL W_BIP ;NÚMERO DE BIPS MOVLW .100 CALL W_BIP_LONGO ;BIP LONGO MOVLW 0X04 MOVWF TEMP1 RLJ MOVLW 0XFF CALL DELAYW DECFSZ TEMP1,F GOTO RLJ MOVLW NUMERO_DE_ERROS MOVWF RER ;GERA BIP PARA 'DESBLOQUEADO' MOVLW .100 CALL W_BIP_LONGO ;BIP LONGO MOVLW .10 CALL W_BIP ;NÚMERO DE BIPS GOTO RETG ;================================================================================================= ; RECEBE SONS DO TECLADO DO CELULAR (VIA MICROFONE) ;================================================================================================= LE_TECLADO CALL TESTTK MOVFW RTEC XORLW 0XFF ;SE FOR 0XFF NENHUMA TECLA FOI PRESSIONADA BTFSC STATUS,Z RETURN ; GOTO VV1 MOVFW RTEC MOVWF RTEC1 CALL BIP VV1 MOVLW .1 CALL DELAY CALL TESTTK MOVFW RTEC XORLW 0XFF BTFSC STATUS,Z RETURN GOTO VV1 ;AGUARDA SOLTAR TECLA TESTTK ;RETORNA EM 'RTEC' A TECLA PRESSIONADA (NENHUMA PRESSIONADA RETORNA 0XFF) BTFSC GPIO,3 ;TESTA PINO 4 POR UM OK DO MT8870 GOTO RECEBEU_SOM MOVLW 0XFF MOVWF RTEC RETURN RECEBEU_SOM MOVLW .10 CALL DELAY CLRF RTEC BTFSC GPIO,1 BSF RTEC,0 BTFSC GPIO,2 BSF RTEC,1 BTFSC GPIO,4 BSF RTEC,2 BTFSC GPIO,5 BSF RTEC,3 BTFSC GPIO,3 GOTO $-1 ;AGUARDA SINAL VOLTAR A '0' MOVLW .200 CALL DELAY BTFSC GPIO,3 GOTO $-3 RETURN ;================================================================================================= ; ESCREVER NA EEPROM ;================================================================================================= 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 ;================================================================================================= ; LER NA EEPROM ;================================================================================================= 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 ;================================================================================================= ; ROTINAS DE DELAY ;================================================================================================= DELAY2 MOVLW .20 DELAYW DELAYM MOVWF TEMP VJ1 call LcdDelay1 DECFSZ TEMP,F GOTO VJ1 DELAY1 LcdDelay1 MOVLW .255 ;DELAY PARA VISUALIZAÇAO DELAY LcdDelay goto $+1 movwf LC+1 ;duas variáveis em uma LcdDelayLoop decfsz LC+0,F ;dec. o prim. cont. goto LcdDelayLoop decfsz LC+1,F ;dec. o seg. cont. goto LcdDelayLoop return DEBOUNCE WAIT_16MSEC movlw .16 WAIT_WMSEC movwf LC+1 WAITSET movlw .250 movwf LC WAITLOOP decfsz LC,F goto WAITLOOP decfsz LC+1,F goto WAITSET return ;===================================================== WAIT_uS movwf LC WAIT_uS_A decfsz LC, F goto WAIT_uS_A return ;================================================================================================= ; MUDANÇA DE SENTIDO DAS PORTAS IN/OUT ;================================================================================================= ; muda direção dos pinos conforme recebido em 'w' TRISIOX BANK1 ;TROCA DE BANCO MOVWF TRISIO ;ENTRADA OU SAIDA BANK0 RETURN ;================================================================================================= ; ROTINAS DE BIPS ;================================================================================================= ; GERA QUANTIDADE DE BIPS DADA POR 'W' W_BIP MOVWF TEMP3 VBIP1 CALL BIP MOVLW .1 CALL DELAYM DECFSZ TEMP3,F GOTO VBIP1 RETURN ;================================================================================================= ; BIP LONGO ;================================================================================================= ; GERA UM BIP LONGO DE DURAÇÃO = BIP X 'W' W_BIP_LONGO MOVWF TEMP3 R38 CALL BIP DECFSZ TEMP3,F GOTO R38 RETURN BIP MOVLW Q4_OUT ;AJUSTA P5 COMO SAIDA CALL TRISIOX MOVLW .200 MOVWF TEMP2 CLRF GPIO CONT6 BSF Q4 MOVLW 0X30 CALL WAIT_uS BCF Q4 MOVLW 0X30 CALL WAIT_uS DECFSZ TEMP2,F GOTO CONT6 MOVLW Q4_IN ;AJUSTA Q4 COMO ENTRADA CALL TRISIOX RETURN ;================================================================================================= ; ACIONAMENTO DO RELE DA FECHADURA ;================================================================================================= ; ROTINA DE ACIONAMENTO DA FECHADURA ACIONA_FECHADURA MOVLW NUMERO_DE_PULSOS MOVWF TEMP RET77 BSF SAIDA CALL DELAY_CLEC_CLEC IFDEF SAIDA_PULSADA ;DETERMINA SE SAIDA CONTINUA BCF SAIDA ;OU SERÁ PULSADA ENDIF CALL DELAY_CLEC_CLEC DECFSZ TEMP,F GOTO RET77 BCF SAIDA RETURN ;================================================================================================= ; ROTINA DE ATRASO (MODO PULSADO) ;================================================================================================= DELAY_CLEC_CLEC ;GERA ATRASO DE 100 MILISEGUNDOS MOVLW .130 CALL DELAY RETURN ;================================================================================================= ; FIM DO PROGRAMA ;================================================================================================= END