Ir ao conteúdo
  • Cadastre-se

marcelovillar

Membro Pleno
  • Posts

    32
  • Cadastrado em

  • Última visita

Reputação

0
  1. @MatheusLPS Sim percebi, mudei e continua dando o mesmo resultado, testei na prática e mesma coisa, não entendo como pode estar dando senha correta e liberando cofre toda vez que aperto o botão, de repente me fugiu algum detalhe, portanto, deixarei todo código abaixo. Depois que declaro; output_low(tranca); ta tudo certo, a tranca fecha e fica nisso, mas quando acrescento abre_cofre == 1 , acontece esses problemas. #include <18f4550.h> #FUSES NOWDT #FUSES XT #FUSES PUT #FUSES NOPROTECT #FUSES NODEBUG #FUSES NOBROWNOUT #FUSES NOLVP #FUSES NOCPD #FUSES NOWRT #use delay(clock=4000000) #define WireTX PIN_C6 #define WireRX PIN_C7 #define led_circuito pin_b2 #define led_tranca pin_b4 #define buzzer pin_b3 #define tranca pin_b5 #define botao_tranca pin_b1 #use rs232 (baud = 9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=serial) #include <kbd_flex.c> char senha[6] = { 1 , 1 , 1 , 1, 1, 1 }; char ler_senha[6] = { 0 , 0 , 0, 0, 0, 0}; int n = 0; int abre_cofre = 1; char digito; int8 senha_ok = 0; void digita_senha(); void botao(); void programa(); void main() { output_high(led_circuito); while(true) { if (abre_cofre == 1) { kbd_init(); printf("Digite a senha...\r\n"); digita_senha(); for (n=0;n<=5;n++) { if (senha[n] + 0x30 != ler_senha[n]) break; } if (n != 6) { senha_ok = 0; n = 0; printf ("\n\rSenha errada!"); delay_ms (75); output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); delay_ms (100); printf ("\n\rDigite a senha:\r\n"); digita_senha(); } else if (n == 6) { printf ("\n\rSenha Correta!"); output_high(tranca); output_high(led_tranca); abre_cofre = 0; } } else if(abre_cofre == 0) { while(input(botao_tranca)){ output_low(tranca); output_low(led_tranca); abre_cofre = 1; delay_ms(75); } } } } void digita_senha() { while (senha_ok == 0) { digito = kbd_getc(); if (digito == '0') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '1') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '2') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '3') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '4') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '5') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '6') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '7') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '8') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '9') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '*') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito == '#') { output_toggle (buzzer); delay_ms (100); output_toggle (buzzer); } if (digito!=0) { ler_senha[n] = digito; printf("*"); n++; if (n > 5) { senha_ok = 1; n = 0; } delay_ms (50); } } }
  2. @MatheusLPS Colocando desta forma, eu digito a senha, e não abre o cofre, mas se fico com botão segurado, o cofre fica aberto, enquanto pressionado o botao. E cada vez que pressiono também mostra no virtual terminal; digite a senha, senha correta...
  3. @MatheusLPS Tentei várias coisas, o mais próximo que consegui foi o seguinte; void main() { kbd_init(); while(true) { if (abre_cofre == 1) { printf("Digite a senha...\r\n"); digita_senha(); ........ else if (n == 6) //Se tenho 6 posições corretas, senha certa! { printf ("\n\rSenha Correta!"); //FIM! output_high(tranca); output_high(led_tranca); abre_cofre = 0; } } else if(abre_cofre == 0) { if(input(botao_tranca)){ output_low(tranca); output_low(led_tranca); abre_cofre = 1; delay_ms(75); } } } } Resumindo; void main() { while(true) { if (abre_cofre == 1){ } else if (abre_cofre == 0){ } } } Quando aperto o botão, a saida fica em 0 por alguns mili segundos, volta a 1, e aparece 3 vezes seguidas no Virtual Terminal, Senha correta, digite a senha... se aperto o botao novamente, acontece a mesma coisa de novo.
  4. @MatheusLPS Eu não consigo ver outra forma de resolver isso, não sendo por sequência pois, depois do ELSE IF, ou eu crio nesse bloco as tarefas que irão fechar o cofre quando pressionar o botão ou eu crio por exemplo uma nova função, como por exemplo void botao, e no final do bloco else if vá para lá, e fique preso naquele bloco (void botao) até ser pressionado o botão, e depois volte para digita_senha. Naquela minha programação, o microcontrolador lê que o botão não esta pressionado e termina a leitura, "encerra" o programa. Não esta tendo erro de sintaxe (digo erro no sentido de faltar alguma coisa)? Pois, se eu coloco um loop infinito, ele fecha o cofre, mas também não irá sair deste laço já que é sempre verdadeiro a condição. Será que eu não teria que criar alguma condição, para que ele se mantenha neste bloco e termine somente depois que o botão for pressionado?
  5. @MatheusLPS Uma das maneiras que tentei foi essa, porém a parte do botão não esta funcionando; void main(){ programa(); } void programa() { programação.... else if (n == 6) //Se tenho 6 posições corretas, senha certa! { printf ("\n\rSenha Correta!"); //FIM! output_high(tranca); output_high(led_tranca); botao(); } while(true); } void botao() { if(input(botao_tranca)){ output_low(tranca); output_low(led_tranca); digita_senha(); ou programa(); (tentei os dois) } } Também tentei colocar; { printf ("\n\rSenha Correta!"); //FIM! output_high(tranca); output_high(led_tranca); if(input(botao_tranca)){ output_low(tranca); output_low(led_tranca); digita_senha(); ou programa(); delay_ms(75); } Você saberia me dizer porque no final do void main tem; while(true); ? Tentei colocar também nessa nova programação, nenhuma destas tentativas funcionou
  6. @MatheusLPS Você poderia me ajudar com a questão de que após o cofre ser aberto, eu aperte um botão, e depois de uns segundos a trava do cofre feche e volte para o inicio da programação, volte para o void main, onde tenho que digitar a senha. Já tentei de várias formas e não ta dando certo, até consigo fechar o cofre após o botão ser pressionado, mas ele não retorna pro inicio de toda a programação.
  7. @MatheusLPS Funcionou, coloquei os resistores nos demais terminais e deu certo O teclado matricial do cofre utiliza apenas uma entrada, cada tecla é detectada através da tensão aplicada no terminal. Eu andei pesquisando e encontrei alguns projetos referentes a isso; http://www.micropic.es/mpblog/2007/08/gestiona-un-teclado-matricial-con-un-solo-pin/ http://picmania.garcia-cuervo.net/proyectos_analog_keyboard.php Porém, é uma nova programação acredito eu, você tem alguma ideia de como eu poderia agregar isso no projeto (utilizar apenas uma entrada) ?
  8. @MatheusLPS Não agreguei LCD. Para teste, coloquei a senha com todos algarismos 1, e coloquei apenas um botão com o resistor de pull-up. Pensando agora, tenho que lhe dizer e espero que eu esteja fazendo errado e cometido esta grande burrada ( ) mas não coloquei o resistor de pull-up nos demais pinos (28,29,30), já que não utilizaria o resto, mas é necessário ter VCC nestes terminais, isto influencia?
  9. @MatheusLPS Eu não entendi completamente pois não sei ler muito bem em inglês, ele fala que preferi utilizar delay? Onde diz o fator; # define KBD_DEBOUNCE_FACTOR 79 , eu tentei valores como; 33, 150, 200, 333 ... nenhum funcionou na pratica. Você saberia me dizer como posso implementar algum delay na programação? Seria de grande ajuda, to a um bom tempo nisso e não encontro solução valeu
  10. @aphawk Entendi, só não sei como agregar isso na biblioteca do teclado. Eu tava dando uma olhada nela, tem coisas referentes ao debouncing; #define KBD_DEBOUNCE_FACTOR 80 // Set this number to apx n/333 where // n is the number of times you expect // to call kbd_getc each second kchar='\0'; if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) { So não entendi como posso resolver isso ou agregar aquele programação do debouncing, falta-me conhecimento
  11. @aphawk Entendi, você tem algum exemplo de hardware ou programação que eu possa corrigir isso? Ou minhas pesquisas foram fracas, ou tem muito pouco material na internet mesmo a respeito disso e que esteja 100% correto. @MatheusLPS Seguindo seu exemplo e com clock de 4MHz; 62500 incrementos gera 0,5s .... X*0,5=300 => 600, preciso repetir 600 vezes, pelo menos no Proteus funcionou hehe
  12. @MatheusLPS Sim, tentei usar transistor como chave, como neste exemplo (página 5); http://www.vargasp.com/download/livros/Tecnicas_digitais.pdf também não funcionou.
  13. Você já testou alguma vez este projeto na prática? Eu testei e não funcionou, será que quando comuto o botão esta ocorrendo o efeito bouncing?
  14. @MatheusLPS Agora funcionou \o/ , Depois que a senha esta correta, coloquei para ter sinal lógico 1 em uma saída, e um botão que caso seja pressionado, esta saída volte para nível lógico 0, porém não funcionou, segue abaixo; else if (n == 6) //Se tenho 6 posições corretas, senha certa! { printf ("\n\rSenha Correta!"); //FIM! output_high(pin_b5); if(input(pin_b4)){ delay_ms(3000); output_low(pin_b5); } } depois desta operação, gostaria de voltar para o estado original, digitar a senha. Para isso eu teria que fazer uma outra função void? eu fiz isto e funcionou o que acha? void botão(); else if (n == 6) //Se tenho 6 posições corretas, senha certa! { printf ("\n\rSenha Correta!"); //FIM! output_high(pin_b5); botão(); } void botão() { while(true) { if(input(pin_b4)){ delay_ms(1000); output_low(pin_b5); delay_ms(50); } } }
  15. @MatheusLPS Obrigado, vou ler sim. Nesta biblioteca que você disponibilizou não esta definido os pinos do microcontrolador, não é necessário declarar quais serão usados? Eu fiz o mesmo circuito e programação que esta no seu exemplo, aparece no virtual terminal para digitar a senha, mas qualquer digito que eu pressione não acontece nada. Tentei na prática, e também não funcionou.

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...