Ir ao conteúdo
  • Cadastre-se

Cofre PIC/Mplab


Posts recomendados

Olá,

Estou tentando projetar um cofre, que contenha uma senha de 6 dígitos.

Não estou encontrando uma biblioteca que tenha a função password/senha por exemplo.

Para o teclado matricial existe a biblioteca keypad que auxilia bastante. Alguém sabe

uma biblioteca direcionada a isso? comparar as teclas digitadas e ver se confere com a denominada 

na programação?

 

Estou utilizando Mplab V2.10 , compilador c18, microcontrolador PIC18F4550.

 

Grato.

Link para o comentário
Compartilhar em outros sites

@marcelovillar

 

Tente algo do tipo:

 

1 - Crie uma variável do tipo vetor. Exemplo: int senha[6];

 

2 - Leia 01 tecla através dessa lib keypad.

 

3- Guarde o valor lido dentro do vetor senha. Exemplo:

senha[i] = keypad(); //imagino que a lib te retorna apenas um caracter, seja ele do tipo char, int ou que seja...

4 - Você coloca esse pedaço de código acima dentro de um LOOP como o for por exemplo.

 

5 - Depois que leu os 6 dígitos, você compara com a sua senha correta.Há diversas formas de fazer isso. Ou você pega o seu vetor lido (senha[6]) e transforma isso em uma string e compara com sua senha previamente armazenada. Ou você compara posição com posição. Exemplo:

int8 senha_certa[6]= {1, 2, 3, 4, 5, 6}; //aqui cada algarismo da senha está em uma posição

Depois você compara com a senha digitada. Algo do tipo:

 

senha == senha_certa ?

 

Coloca em um loop de novo e pronto.

 

Tenho algo do tipo pronto em casa. Mas á para o CCS. Só você traduzir para o C18. O que vale é a ideia.

 

Falou

Link para o comentário
Compartilhar em outros sites

@marcelovillar

 

Pega aí mano

 

Código:

//Aqui incluo o PIC a ser usado.#include <16f877A.h> //Aqui descrevo os FUSES usados#FUSES NOWDT#FUSES XT#FUSES PUT#FUSES NOPROTECT#FUSES NODEBUG#FUSES NOBROWNOUT#FUSES NOLVP#FUSES NOCPD#FUSES NOWRT #use delay(clock=4000000)     //Declarando o cristal usado #define WireTX PIN_C6         //Pino usado na RS232, opcional#define WireRX PIN_C7          //Pino usado na RS232, opcional //Configurar a RS232. Pode usar um LCD no lugar.#use rs232 (baud = 9600, xmit=WireTX, rcv=WireRX, ERRORS, STREAM=serial) #include <kbd_flex.c>      //Usando a LIB de teclado matricial modificada char senha[6] = { 1 , 2 , 3 , 4, 5, 6 };     //A senha gravadachar ler_senha[6] = { 0 , 0 , 0, 0, 0, 0};   //A senha a ser lida int n = 0;                    //Variáveis diversaschar digito;int8 senha_ok = 0;void digita_senha(); void main(){   kbd_init();             //Iniciar a biblioteca do teclado    printf("Digite a senha...\r\n");    //Mensagem ao usuário      digita_senha();                     //Vamos chamar essa função. Depois de                                       //executar a mesma, voltamos a partir daqui.                                       //Então vá lá no final do código, a função                                       //está lá.                                                                                                                                                          //Senha preenchida, vamos testar seus valores                                       //com a senha gravada.                                          for (n=0;n<=5;n++)                     {                                         //Pulo do gato o +0x30. Ess LIB me retona strings      if (senha[n] + 0x30 != ler_senha[n])   //mas minha senha é int. Fiz assim. Nada impede      break;                                 //de salvar a senha em forma de string para evitar isso.   }                                         //Esse break evita que eu tenha que verificar todo                                             //o vetor. Na primeira errada, ele já sai do loop.      if (n != 6) //Com o teste acima, espero que tenha 6 posições corretas, se    {           //não tiver, a senha está errada.      senha_ok = 0;      n = 0;            printf ("\n\rSenha errada!");      delay_ms (2000);      printf ("\n\rDigite a senha:\r\n");      digita_senha();   }      else if (n == 6)           //Se tenho 6 posições corretas, senha certa!   {      printf ("\n\rSenha Correta!");         //FIM!   }    while (TRUE);} void digita_senha()                 //Digitando a senha{   while (senha_ok == 0)            //Partimos do pressuposto que a senha está errada   {                                //O código fica preso enquanto não digitar algo.      digito = kbd_getc();          //Colocando o dígito apertado no teclaod nessa variável            if (digito!=0)                //Esse LIB sempre me retorna 0 se eu não digitar nada      {                             //Então, somente se o valor retornado for diferente de zero, prosseguimos         ler_senha[n] = digito;     //Guarda esse dígito lido em nosso vetor de 6 posições         printf("*");               //Imprimi esse símbolo na tela                  n++;                       //Variável auxiliar, apenas incrementa a                                    //posição do vetor.         if (n > 5)                 //Se já digitamos mais que 6 dígios, a senha está         {                          //completa. O vetor começa em 0 e vai até 5 (6 posições)            senha_ok = 1;           //Nesse caso, a senha está OK (preenchida apenas)            n = 0;                  //Auxiliar volta a zero.         }                          //Se chegou até aqui, volta lá no início do código.                  delay_ms (50);             //delayzin básico.      }   }}
 
Teste:
 
post-543152-0-07418200-1401311371_thumb.
 
Falou
Link para o comentário
Compartilhar em outros sites

@marcelovillar,

Se for um uso profissional, tem de implementar rotinas para armazenar senha em eeprom, cuidando de problemas por bateria fraca, e implementar uma filtragem melhor a ruidos proveniente da trava ( solenóide ) . E tem de checar a integridade dos dados em eeprom por algum meio de checksum, e caso esteja corrompido, aceitar uma senha padrão definida pelo fabricante.

Senão pode vender junto com o cofre uma marreta kkkkkk !

Paulo

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@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?

Link para o comentário
Compartilhar em outros sites

@marcelovillar,

Não é que vai falhar.... se voce está aproveitando o hardware existente, pelo menos está imune a interferências da tranca.

Mas tem de pensar em uma maneira de emergência, alguma maneira que possa fazer o cofre abrir, caso os dados tenham sido corrompidos, mesmo que seja para seu próprio uso. Já pensou se por algum problema de alimentação acaba corrompendo a EEPROM ??? Qual a senha que abriria o cofre nesse caso ?

Não acho que falhe com frequência, mas acho melhor sempre prevenir, porque a chance existe, afinal o aparelho funciona com pilhas que podem descarregar.

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@marcelovillar

 

Segue:

 

///////////////////////////////////////////////////////////////////////////////                             KBD.C                                 ////////                  Generic keypad scan driver                       ////////                                                                   ////////  kbd_init()   Must be called before any other function.           ////////                                                                   ////////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not ////////                   This function should be called frequently so as ////////                   not to miss a key press.                        ////////                                                                   ///////////////////////////////////////////////////////////////////////////////////        (C) Copyright 1996,2003 Custom Computer Services           //////// This source code may only be used by licensed users of the CCS C  //////// compiler.  This source code may only be distributed to other      //////// licensed users of the CCS C compiler.  No other use, reproduction //////// or distribution is permitted without written permission.          //////// Derivative programs created using this software in object code    //////// form are not restricted in any way.                               /////////////////////////////////////////////////////////////////////////////// ////////////////// The following defines the keypad layout on port D // Un-comment the following define to use port B// #define use_portb_kbd TRUE // Make sure the port used has pull-up resistors (or the LCD) on// the column pins #if defined use_portb_kbd   #byte kbd = getenv("SFR:PORTB")#else   #byte kbd = getenv("SFR:PORTD")#endif #if defined use_portb_kbd   #define set_tris_kbd(x) set_tris_b(x)#else   #define set_tris_kbd(x) set_tris_d(x)#endif //Keypad connection:   (for example column 0 is B2)//                Bx: #ifdef blue_keypad  ///////////////////////////////////// For the blue keypad#define COL0 (1 << 2)#define COL1 (1 << 3)#define COL2 (1 << 6) #define ROW0 (1 << 4)#define ROW1 (1 << 7)#define ROW2 (1 << 1)#define ROW3 (1 << 5) #else ////////////////////////////////////////////////// For the black keypad#define COL0 (1 << 5)#define COL1 (1 << 6)#define COL2 (1 << 7) #define ROW0 (1 << 1)#define ROW1 (1 << 2)#define ROW2 (1 << 3)#define ROW3 (1 << 4) #endif #define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2) // Keypad layout:char const KEYS[4][3] = {{'1','2','3'},                         {'4','5','6'},                         {'7','8','9'},                         {'*','0','#'}}; #define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where                                  // n is the number of times you expect                                  // to call kbd_getc each second  void kbd_init() {} char kbd_getc( ) {   static BYTE kbd_call_count;   static int1 kbd_down;   static char last_key;   static BYTE col;    BYTE kchar;   BYTE row;    kchar='\0';   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {       switch (col) {         case 0   : set_tris_kbd(ALL_PINS&~COL0);                    kbd=~COL0&ALL_PINS;                    break;         case 1   : set_tris_kbd(ALL_PINS&~COL1);                    kbd=~COL1&ALL_PINS;                    break;         case 2   : set_tris_kbd(ALL_PINS&~COL2);                    kbd=~COL2&ALL_PINS;                    break;       }        if(kbd_down) {         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {           kbd_down=FALSE;           kchar=last_key;           last_key='\0';         }       } else {          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {             if((kbd & ROW0)==0)               row=0;             else if((kbd & ROW1)==0)               row=1;             else if((kbd & ROW2)==0)               row=2;             else if((kbd & ROW3)==0)               row=3;             last_key =KEYS[row][col];             kbd_down = TRUE;          } else {             ++col;             if(col==3)               col=0;          }       }      kbd_call_count=0;   }  set_tris_kbd(ALL_PINS);  return(kchar);}

Link para o comentário
Compartilhar em outros sites

@marcelovillar

 

Usei a RS232. O printf, nesse caso, envia informações pelo pino TX para alguém poder ler.

 

SE você usar LCD, terá que adicionar a biblioteca do LCD.

 

No caso do delay. Já vi esse tipo de problema.

 

Isso ocorre quando você coloca alguma biblioteca ANTES de declarar o cristal usado. Nesse caso, coloque a biblioteca depois. Algo do tipo:

 

PIC usado;

Fuses usados;

Cristal usado;                         //Se inverter essa linha com a debaixo, dá erro nos delays... Doidera do CCS né....:D

Bibliotecas usadas;

Variáveis usadas;

Protótipo de funções;

Programa principal (main);

Funções usadas;

 

Falou

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

@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?

Link para o comentário
Compartilhar em outros sites

@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)

Link para o comentário
Compartilhar em outros sites

@marcelovillar

 

Veja se esse post ajuda:

 

http://forum.clubedohardware.com.br/forums/topic/812973-qual-a-diferen%C3%A7a-entretimer0timer1timer2timer3timer4/#entry4852461

 

Nele, mostro como programar um delay de 1 segundo. Você precisa de 5*60 = 300 segundos.

 

Fique atento ao clock usado.

 

Deixar você pensar um pouquinho. :D

 

Falou

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

@marcelovillar

 

Erro meu, te enviei a biblioteca errada.   (_(  (_(  :confused:

 

A correta é essa:

 

/////////////////////////////////////////////////////////////////////////// ////                             Flex_KBD.C                            //// ////                  Generic keypad scan driver                       //// ////                                                                   //// ////  kbd_init()   Must be called before any other function.           //// ////                                                                   //// ////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not //// ////                   This function should be called frequently so as //// ////                   not to miss a key press.                        //// ////                                                                   //// ///////////////////////////////////////////////////////////////////////////    //Keypad connection:   #define col0 PIN_D2 #define col1 PIN_D1 #define col2 PIN_D0 #define row0 PIN_D4 #define row1 PIN_D5 #define row2 PIN_D6 #define row3 PIN_D7  // Keypad layout: char const KEYS[4][3] = {{'1','2','3'},                          {'4','5','6'},                          {'7','8','9'},                          {'*','0','#'}};  #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    void kbd_init() { }   short int ALL_ROWS (void) {    if (input (row0) & input (row1) & input (row2) & input (row3))       return (0);    else       return (1); }    char kbd_getc( ) {    static byte kbd_call_count;    static short int kbd_down;    static char last_key;    static byte col;     byte kchar;    byte row;     kchar='\0';    if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {        switch (col) {          case 0   : output_low(col0);                output_high(col1);                output_high(col2);                     break;          case 1   : output_high(col0);                output_low(col1);                output_high(col2);                     break;          case 2   : output_high(col0);                output_high(col1);                output_low(col2);                     break;        }         if(kbd_down) {          if(!ALL_ROWS()) {            kbd_down=false;            kchar=last_key;            last_key='\0';          }        } else {           if(ALL_ROWS()) {              if(!input (row0))                row=0;              else if(!input (row1))                row=1;              else if(!input (row2))                row=2;              else if(!input (row3))                row=3;              last_key =KEYS[row][col];              kbd_down = true;           } else {              ++col;              if(col==3)                col=0;           }        }       kbd_call_count=0;    }   return(kchar); }

Link para o comentário
Compartilhar em outros sites

@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?
:confused:
 
 
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);
      }
   }
}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...