Ir ao conteúdo

Programação Correta?


Sugoi

Posts recomendados

Postado

Boa noite galera do Clube do Hardware.

Estou programando uma fechadura eletrônica só que a mesma não está funcionando de forma correta, eu queria saber o motivo, se a entrada e saída estão corretas, se é alguma coisa referente a memória que eu não programei, ou até mesmo algo na programação.

Bom, a programação está definido em etapas, cada uma delas tem um título com a sua função geral no programa.

Ao iniciar o programa deve esperar alguém digitar através de um teclado matrixial a senha, se for digitada a senha correta, o rele irá funcionar e o led verde irá acender, caso tenha errado a senha, o Led vermelho irá acender e dar mais 2 chances de tentativa.

Outro problema que me assombra é: Como fazer o programa perceber que foram apertados 4 digitos e assim acender a luz vermelha (sinal de senha errada). Mesmo que a senha esteja certa. Por que depois de esgotar as 3 tentativas, o programa não deve aceitar nenhum digito, mesmo que a senha esteja certa, então ao invés de acender o Led verde (sinal de senha correta), o Led vermelho quem irá acender, pois ja se esgotaram as 3 tentativas e a senha não é mais valida até se passarem os 5 minutos

Sei que preciso colocar um tempo, chamado de deboucing, mas qual a finalidade disso? O que isso ajudaria no programa?

	LIST	p=16f628a  				;Escolhe Microcontrolador
#INCLUDE <P16F628A.INC> ;Inclui Arquivos de definição do PIC
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ;Define os Fuses
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#DEFINE BANK0 BCF STATUS, RP0 ;Seta BANK0 da Memória
#DEFINE BANK1 BSF STATUS, RP0 ;Seta BANK1 da Memória
#DEFINE BANK2 BCF STATUS, RP1 ;Seta BANK0 da Memória
#DEFINE BANK3 BSF STATUS, RP1 ;Seta BANK1 da Memória
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CBLOCK 0X20 ;Diretiva Inicial
FLAGD ;Endereço 0x20
DIGITO ;Endereço 0x21
BIT0 ;Endereço 0x22
BIT1 ;Endereço 0x23
BIT2 ;Endereço 0x24
BIT3 ;Endereço 0x25
SENHA1 ;Endereço 0x26
SENHA2 ;Endereço 0x27
SENHA3 ;Endereço 0x28
SENHA4 ;Endereço 0x29
ERRO ;Endereço 0x30
ENDC

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0x00 ;Endereço Inicial de Processamento caso Resetado
GOTO INICIO0 ;Volta ao inicio do programa
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0X04 ;Endereço Inicial de Processamento caso Interrompido
GOTO INICIO0 ;Volta ao inicio do programa
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INICIO
BANK1

MOVLW B'10000000' ;Define Pull - UP do Bit RBPU
MOVWF OPTION_REG ;Armazena no registro OPTION_REG

MOVLW B'00000000' ;Define Entrade e Saída (I/O)
MOVWF INTCON

MOVLW B'00000000' ;Define Entrade e Saída (I/O)
MOVWF T1CON

MOVLW B'00001011' ;Define Entrade e Saída (I/O)
MOVWF PCON

MOVLW B'10000000' ;Define Entrade e Saída (I/O)
MOVWF TRISA ;Pinos do PORTA

MOVLW B'11100000' ;Define Entrada e Saída (I/O)
MOVWF TRISB ;Pinos do PORTB


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BANK0

MOVLW B'00000111' ;Define Entrade e Saída (I/O)
MOVWF CMCON

MOVLW B'00000000' ;Define Entrade e Saída (I/O)
MOVWF T2CON

MOVLW B'00000000' ;Define Entrade e Saída (I/O)
MOVWF CCP1CON
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INICIO0
CLRF DIGITO ;Limpa o diretiva "DIGITO"
CLRF FLAGD ;Limpa o diretiva "FLAGD"
CLRF ERRO ;Limpa a diretiva "ERRO"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MOVLW 1 ;Escreve "1" no registrador W
MOVWF SENHA1 ;Move o conteúdo de W para "SENHA1"

MOVLW 2 ;Escreve "2" no registrador W
MOVWF SENHA2 ;Move o conteúdo de W para "SENHA2"

MOVLW 3 ;Escreve "3" no registrador W
MOVWF SENHA3 ;Move o conteúdo de W para "SENHA3"

MOVLW 4 ;Escreve "4" no registrador W
MOVWF SENHA4 ;Move o conteúdo de W para "SENHA4"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; INÍCIO DO PROGRAMA ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INICIO2

BSF PORTB, 1 ;Liga Pino 1 do PORTB
BCF PORTB, 2 ;Desliga Pino 2 do PORTB
BCF PORTB, 3 ;Desliga Pino 3 do PORTB


BTFSC PORTB, 4 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_1 ;Salta para "N_1"

BTFSC PORTB, 5 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_4 ;Salta para "N_4"


BTFSC PORTB, 6 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_7 ;Salta para "N_7"

BTFSC PORTB, 7 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_10 ;Salta para "N_10"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BCF PORTB, 1 ;Desliga Pino 1 do PORTB
BSF PORTB, 2 ;Liga Pino 2 do PORTB
BCF PORTB, 3 ;Desliga Pino 3 do PORTB

BTFSC PORTB, 4 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_2 ;Salta para "N_2"

BTFSC PORTB, 5 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_5 ;Salta para "N_5"


BTFSC PORTB, 6 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_8 ;Salta para "N_8"

BTFSC PORTB, 7 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_0 ;Salta para "N_0"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BCF PORTB, 1 ;Desliga Pino 1 do PORTB
BCF PORTB, 2 ;Desliga Pino 2 do PORTB
BSF PORTB, 3 ;Liga Pino 3 do PORTB

BTFSC PORTB, 4 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_3 ;Salta para "N_3"


BTFSC PORTB, 5 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_6 ;Salta para "N_6"


BTFSC PORTB, 6 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_9 ;Salta para "N_9"

BTFSC PORTB, 7 ;Testa o bit e salta uma linha se for 0
GOTO $+2 ;Pula 2 linhas
GOTO $+2 ;Pula 2 linhas
GOTO N_11 ;Salta para "N_11"

GOTO INICIO2 ;Volta para o começo do programa


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; CONFIGURAÇÃO DAS TECLAS ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_0 MOVLW .0 ;Escreve o número "0" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_1 MOVLW .1 ;Escreve o número "1" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_2 MOVLW .2 ;Escreve o número "2" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_3 MOVLW .3 ;Escreve o número "3" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_4 MOVLW .4 ;Escreve o número "4" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_5 MOVLW .5 ;Escreve o número "5" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_6 MOVLW .6 ;Escreve o número "6" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_7 MOVLW .7 ;Escreve o número "7" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_8 MOVLW .8 ;Escreve o número "8" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_9 MOVLW .9 ;Escreve o número "9" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_10 MOVLW .10 ;Escreve o número "asterisco" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

N_11 MOVLW .11 ;Escreve o número "sustenido" no registro W
CALL ARMAZENA_VALOR ;Chama Subrotina que armazena o valor
GOTO INICIO2 ;Volta para INICIO2


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; ARMAZENANDO A SENHA ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ARMAZENA_VALOR
MOVWF DIGITO ;Copia o número apertado para diretiva DIGITO
INCF FLAGD, 1 ;Incrementa a diretiva FLAGD

MOVLW B'00000001' ;Escreve no registro W o valor 1
XORWF FLAGD,W ;Compara o valor de FLAGD e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO DIGITO_4 ;Salta para DIGITO_4

MOVLW B'00000010' ;Escreve no registro W o valor 2
XORWF FLAGD,W ;Compara o valor de FLAGD e W
BTFSS STATUS,Z ;Salta se forem íguais (0)
GOTO DIGITO_3 ;Salta para DIGITO_3

MOVLW B'00000011' ;Escreve no registro W o valor 3
XORWF FLAGD,W ;Compara o valor de FLAGD e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO DIGITO_2 ;Salta para DIGITO_2

MOVLW B'00000100' ;Escreve no registro W o valor 4
XORWF FLAGD,W ;Compara o valor de FLAGD e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO DIGITO_1 ;Salta para DIGITO_1

RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; MOVE A SENHA ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


DIGITO_4
MOVF DIGITO,W ;Move o conteúdo de DIGITO para W
MOVWF BIT3 ;Copia o conteúdo de W para BIT3
RETURN ;Volta ao último endereço

DIGITO_3
MOVF DIGITO,W ;Move o conteúdo de DIGITO para W
MOVWF BIT2 ;Move o conteúdo para BIT2
RETURN ;Volta ao último endereço

DIGITO_2
MOVF DIGITO,W ;Move o conteúdo de DIGITO para W
MOVWF BIT1 ;Move o conteúdo para BIT1
RETURN ;Volta ao último endereço

DIGITO_1
MOVF DIGITO,W ;Move o conteúdo de DIGITO para W
MOVWF BIT0 ;Move o conteúdo para BIT0
CALL CHECA_SENHA ;Chama a Subrotina que checa a senha
RETURN ;Volta ao último endereço

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; CHECA A SENHA ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CHECA_SENHA

MOVF BIT3,W ;Move o conteúdo de BIT3 para o registro W
XORWF SENHA4,W ;Compara o conteudo de SENHA4 e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO SENHA_ERRADA ;Salta para a subrotina SENHA_ERRADA

MOVF BIT2,W ;Move o conteúdo de BIT2 para o registro W
XORWF SENHA3,W ;Compara o conteudo de SENHA3 e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO SENHA_ERRADA ;Salta para a subrotina SENHA_ERRADA

MOVF BIT1,W ;Move o conteúdo de BIT1 para o registro W
XORWF SENHA2,W ;Compara o conteudo de SENHA2 e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO SENHA_ERRADA ;Salta para a subrotina SENHA_ERRADA

MOVF BIT0,W ;Move o conteúdo de BIT0 para o registro W
XORWF SENHA1,W ;Compara o conteudo de SENHA1 e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO SENHA_ERRADA ;Salta para a subrotina SENHA_ERRADA

GOTO SENHA_CORRETA ;Salta para a subrotina SENHA_CORRETA

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; SENHA CORRETA ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SENHA_CORRETA


BSF PORTA, 3 ;Liga o Rele
BSF PORTA, 0 ;Liga o LED Verde

GOTO INICIO0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; SENHA ERRADA ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SENHA_ERRADA
BSF PORTA, 1 ;Liga o LED Vermelho
INCF ERRO, 1 ;Incrementa a diretiva "ERRO"

MOVLW B'00000111' ;Escreve no registro W o valor 3

XORWF ERRO,W ;Compara o valor de ERRO e W
BTFSS STATUS,Z ;Salta se forem iguais (0)
GOTO INICIO2 ;Salta para INICIO2
GOTO ERRO1 ;Salta para ERRO1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; ERROU 3 VEZES ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Obs: Aqui se configura as a espera do tempo ao qual foi mencionada no início do tópico. Farei uma ilustração de como deve ficar

ERRO1

;Espera algum botão do teclado ser pressionado 4 vezes

;Acende o LED vermelho que simboliza senha errada

;Fica nesse Loop durante 5 minutos

GOTO INICIO2

END

Aqui está o circuito no qual estou programando, há algo errado nele?

semttulo2qhf.png

Vocês do Clube do Hardware tem me ajudado muito nesse projeto, me tirando dúvidas, dando dicas, enfim... ensinando. Agradeço muito por isso, que o sucesso estejam com vocês

Postado
Sei que preciso colocar um tempo, chamado de deboucing, mas qual a finalidade disso? O que isso ajudaria no programa?

Resumindo: Deboucing é uma técnica utilizada para filtrar ruidos de botão.

O botão é uma chave mecânica, por isso ao pressionar uma tecla essa gerará um ruído de 0 para 1 e de 1 para 0 por diversas vezes até que a mesma se estabilizará.

Isso traria consequências indesejáveis ao seu circuito.

Veja a imagem abaixo

fig24.gif

Postado
Resumindo: Deboucing é uma técnica utilizada para filtrar ruidos de botão.

O botão é uma chave mecânica, por isso ao pressionar uma tecla essa gerará um ruído de 0 para 1 e de 1 para 0 por diversas vezes até que a mesma se estabilizará.

Isso traria consequências indesejáveis ao seu circuito.

Então eu devo adicionar um deboucing na parte em que o programa aciona as teclas?. Se for isso obrigado

E quanto ao resto do programa, principalmente na memória, está tudo certo?

Muito obrigado pela sua paciencia

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...