Ir ao conteúdo
  • Cadastre-se

marcelovillar

Membro Pleno
  • Posts

    32
  • Cadastrado em

  • Última visita

Tudo que marcelovillar postou

  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.
  16. @MatheusLPS Você pode me dar alguma ideia de como posso implementar um código que depois de digitado a senha e depois de 5 minutos tenha nível lógico 1 em alguma saída, e após apertar um botão, depois de 20 segundos, tenha nível lógico 0 na mesma saída? Se eu implementar após o printf onde diz que a senha esta correta, por exemplo; delay de 5 minutos output_high(PIN_B4); If(!input(PIN_B5)); delay de 20 segundos output_low(PIN_B4); volta para o código inicial (digitar senha)
  17. @MatheusLPS Putz, cometi um erro grave, coloquei RX com RX, TX com TX --' . Porém, as teclas estão anormal, quando digito 3,6,9,# as saídas a,b,c,d respectivamente, ficam em GND, E as demais, ficam sempre VCC independente de eu apertar ou não a tecla.
  18. @MatheusLPS Fiz um projeto no Proteus idêntico ao seu, e com sua programação, porém quando eu ponho para rodar a simulação, o RX não recebe nenhum sinal, não fica em vermelho. A janela do Virtual Terminal não aparece nenhuma frase como por exemplo; Digite a senha. Se eu colocar uma chave entre o 27 e o 21, com o resistor de 10K, +5v... vou conseguir simular o botão 1?
  19. Devo ter interpretado errado, o que eu fiz foi o seguinte; abrir o mplab x , fazer um novo projeto, utilizando o compilador CCS e ai colei sua programação. Agora eu abri o CCS Demo, colei a programação e não apareceu nenhum erro, mas quando dou Build abre uma aba ao lado do meu projeto, denominada; 18f4550-USB-HID-CRC-IO.c com erro na linha 32; #include <usb_desc_hid 8-byte.h> //USB Configuration and Device descriptors for this UBS device Hoje não é meu dia. @MatheusLPS Por acaso sabe me dizer como posso implementar na programação, um código que todas vez em que eu aperte uma tecla, acione uma denominada saída? Pretendo colocar um buzzer. Mas não tenho noção de como posso implementar isso com esta programação, teria que modficar na biblioteca do teclado? @Matheus LPS Instalei em outro computador o CCS e funcionou 100% o código e a compilação,...
  20. Esqueci de informar que instalei o compilador CCS, estes erros estão dando com o compilador CCS, expressões como; output_bit , false, true, também estão dando erro. O false e true substitui por 0 e 1 respectivamente e funcionou, mas é muito estranho, pois, vi projetos na mesma versão (CCS 5 Demo) utilizando esta denominação; false, true, output_bit.
  21. @MatheusLPS Entendi, o estranho é que eu copiei e colei a sua programação, esta exatamente igual a sua e nas linhas printf e delay, esta com erro. Linhas; 37,59,60,61,67,82 e 91. Unable to resolve identifier printf, Unable to resolve identifier delay_ms
  22. @MatheusLPS Não é necessário incluir biblioteca do lcd e delay na sua programação? Colei no software e apareceu erro nas linhas relacionadas ao printf e ao delay. Ou o printf é apenas uma função para aparecer na tela informações?
  23. @MatheusLPS Você poderia por favor disponibilizar esta biblioteca do teclado matricial? Grato.
  24. @aphawk, Não é para vendas etc. Tem um cofre aqui no meu trabalho que estragou e o microcontrolador dele esta danificado. O cofre não é utilizado ou relevante aqui no escritório, mas pensei em programar um microcontrolador e simular o que o outro fazia, por aprendizado/desafio, até porque também quase nunca programei PIC, pois sempre usava e uso a plataforma Arduino. Sendo assim, você acredita que ele irá falhar com frequência? Ou que daqui um mês pode causar problemas?
  25. Cara, muito obrigado, me adiantou algumas horas de estudo, valeu mesmo, abraços.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!