segunda-feira, 30 de julho de 2012

Projeto Chave Mecânica BCD

Encontrei essas peças em uma sucata(!). Muito bom o que você pode encontrar vasculhando por ai, o mais legal dessas chaves é que são mecânicas e tem a saída em formato BCD(Binary-coded decimal), ou seja, seguem a seguinte tabela:


Decimal
Digit
BCD
8 4 2 1
00 0 0 0
10 0 0 1
20 0 1 0
30 0 1 1
40 1 0 0
50 1 0 1
60 1 1 0
70 1 1 1
81 0 0 0
91 0 0 1



Então resolvi criar um programa para fazer a leitura dessas chaves, dessa vez estou usando o PIC 18F4550, hora de variar um pouco :-)



/******************************************************************************
 *
 *            VRO PROJETOS PLACA E-P18 (PIC18F4550)
 *
 ******************************************************************************
 * Dependencias:     Veja a seção INCLUDES abaixo
 * Microcontrolador:      PIC18F4550
 * Opção de Clock: HS 20MHz (externo) - CPU:48MHz (interno)
 * Compilador:         C18 v3.37 ou superior
 * Empresa:                 VRO Projetos
 * Plataforma: Placa E-P18 v3.6
 * Autor: Vinicius Rodrigues de Oliveira(viniciusro@gmail.com)
 * Versão: v1.0
 *****************************************************************************/
/** I N C L U D E S **********************************************************/
#include <p18cxxx.h>
#include <delays.h>
#include "displayLCD.h"
/** D E F I N E S ************************************************************/
//Entradas Digitais
#define  B0    PORTBbits.RB0
#define  B1    PORTBbits.RB1
#define  B2    PORTBbits.RB2
#define  B3    PORTBbits.RB3
#define  MULT1     PORTCbits.RC2
#define  MULT2     PORTDbits.RD0
#define  MULT3     PORTDbits.RD1
#define  BOTAO_1    PORTEbits.RE1
#define  BOTAO_2    PORTEbits.RE2
/** V A R I A V E I S   G L O B A I S ****************************************/
char chave   = 0;
char chave1 = 0;
char chave2 = 0;
char CHE     = 0;
char senha   = 0;
char senha1 = 0;
/**  P R O T O T I P O S   P R I V A D O S ***********************************/
void ConfiguraSistema(void);
/** F U N C O E S ************************************************************/
/******************************************************************************
 * Funcao:         void main(void)
 * Entrada:        Nenhuma (void)
 * Saída:            Nenhuma (void)
 * Descrição:     Função principal do programa. 
 *****************************************************************************/

/* Tabela BCD:       B0|B1|B2|B3
  0000       0
0001 1
0010 2
0011     3
0100     4
0101     5
0110     6
0111     7
1000     8
1001     9
*/
void main(void)
{


// Configura as portas e periféricos do PIC.
ConfiguraSistema();
B0=0;
B1=0;
B2=0; 
B3=0;
  MULT1=0;
  MULT2=0;
MULT3=0;

    while(1) // Laço infinito que executa o funcionamento principal do projeto.    
{

CHE++;


PosicaoCursorLCD(1,1);
EscreveFraseRomLCD("Multiplexando...");


PosicaoCursorLCD(2,1);
EscreveFraseRomLCD("CH1:");
PosicaoCursorLCD(2,5);
EscreveInteiroLCD(chave);


PosicaoCursorLCD(2,7);
EscreveFraseRomLCD("CH2:");
PosicaoCursorLCD(2,11);
EscreveInteiroLCD(chave1);


PosicaoCursorLCD(2,12);
EscreveFraseRomLCD("CH3:");
PosicaoCursorLCD(2,16);
EscreveInteiroLCD(chave2);
Delay10KTCYx(40);


if (CHE>3)
{
CHE=0;
}


if (CHE==0)
{
MULT1=1;
//Para Digito:0
if(B0==0 && B1==0 && B2==0 && B3==0)
{
chave=0;
Delay10KTCYx(10);
}
//Para Digito:1
if(B0==0 && B1==0 && B2==0 && B3==1)
{
chave=1;
Delay10KTCYx(10);
}
//Para Digito:2
if(B0==0 && B1==0 && B2==1 && B3==0)
{
chave=2;
Delay10KTCYx(10);
}
//Para Digito:3
if(B0==0 && B1==0 && B2==1 && B3==1)
{
chave=3;
Delay10KTCYx(10);
}
//Para Digito:4
if(B0==0 && B1==1 && B2==0 && B3==0)
{
chave=4;
Delay10KTCYx(10);
}
//Para Digito:5
if(B0==0 && B1==1 && B2==0 && B3==1)
{
chave=5;
Delay10KTCYx(10);
}
//Para Digito:6
if(B0==0 && B1==1 && B2==1 && B3==0)
{
chave=6;
Delay10KTCYx(10);
}
//Para Digito:7
if(B0==0 && B1==1 && B2==1 && B3==1)
{
chave=7;
Delay10KTCYx(10);
}
//Para Digito:8
if(B0==1 && B1==0 && B2==0 && B3==0)
{
chave=8;
Delay10KTCYx(10);
}


//Para Digito:9
if(B0==1 && B1==0 && B2==0 && B3==1)
{
chave=9;
Delay10KTCYx(10);
}
MULT1=0;
}


if (CHE==1)
{


MULT2=1;
//Para Digito:0
if(B0==0 && B1==0 && B2==0 && B3==0)
{
chave1=0;
Delay10KTCYx(10);
}
//Para Digito:1
if(B0==0 && B1==0 && B2==0 && B3==1)
{
chave1=1;
Delay10KTCYx(10);
}
//Para Digito:2
if(B0==0 && B1==0 && B2==1 && B3==0)
{
chave1=2;
Delay10KTCYx(10);
}
//Para Digito:3
if(B0==0 && B1==0 && B2==1 && B3==1)
{
chave1=3;
Delay10KTCYx(10);
}
//Para Digito:4
if(B0==0 && B1==1 && B2==0 && B3==0)
{
chave1=4;
Delay10KTCYx(10);
}
//Para Digito:5
if(B0==0 && B1==1 && B2==0 && B3==1)
{
chave1=5;
Delay10KTCYx(10);
}
//Para Digito:6
if(B0==0 && B1==1 && B2==1 && B3==0)
{
chave1=6;
Delay10KTCYx(10);
}
//Para Digito:7
if(B0==0 && B1==1 && B2==1 && B3==1)
{
chave1=7;
Delay10KTCYx(10);
}
//Para Digito:8
if(B0==1 && B1==0 && B2==0 && B3==0)
{
chave1=8;
Delay10KTCYx(10);
}


//Para Digito:9
if(B0==1 && B1==0 && B2==0 && B3==1)
{
chave1=9;
Delay10KTCYx(10);
}
MULT2=0;
}


if (CHE==2)
{


MULT3=1;
//Para Digito:0
if(B0==0 && B1==0 && B2==0 && B3==0)
{
chave2=0;
Delay10KTCYx(10);
}
//Para Digito:1
if(B0==0 && B1==0 && B2==0 && B3==1)
{
chave2=1;
Delay10KTCYx(10);
}
//Para Digito:2
if(B0==0 && B1==0 && B2==1 && B3==0)
{
chave2=2;
Delay10KTCYx(10);
}
//Para Digito:3
if(B0==0 && B1==0 && B2==1 && B3==1)
{
chave2=3;
Delay10KTCYx(10);
}
//Para Digito:4
if(B0==0 && B1==1 && B2==0 && B3==0)
{
chave2=4;
Delay10KTCYx(10);
}
//Para Digito:5
if(B0==0 && B1==1 && B2==0 && B3==1)
{
chave2=5;
Delay10KTCYx(10);
}
//Para Digito:6
if(B0==0 && B1==1 && B2==1 && B3==0)
{
chave2=6;
Delay10KTCYx(10);
}
//Para Digito:7
if(B0==0 && B1==1 && B2==1 && B3==1)
{
chave2=7;
Delay10KTCYx(10);
}
//Para Digito:8
if(B0==1 && B1==0 && B2==0 && B3==0)
{
chave2=8;
Delay10KTCYx(10);
}


//Para Digito:9
if(B0==1 && B1==0 && B2==0 && B3==1)
{
chave2=9;
Delay10KTCYx(10);
}
MULT3=0;
}

}//end while(1)

}//end main


/******************************************************************************
 * Funcao:          void ConfiguraSistema(void)
 * Entrada:         Nenhuma (void)
 * Saída:             Nenhuma (void)
 * Descrição:       ConfiguraSistema é a rotina de configuração principal do PIC.
 *      Seu objetivo é configurar as portas de I/O e os periféricos
 *      do microcontrolador para que os mesmos trabalhem da maneira
 *      desejada no projeto.  
 *****************************************************************************/
void ConfiguraSistema(void)
{
// Desabilita todas as analógicas
ADCON1 = ADCON1 | 0x0F;


// Configura o Diaplay LCD
ConfiguraLCD();
DesligaCursor();


// Configura saidas digitais
TRISCbits.TRISC2 = 0; 
TRISDbits.TRISD0 = 0; 
TRISDbits.TRISD1 = 0; 


// Configura entradas digitais
TRISBbits.TRISB0 = 1;   //Configura pino RB0 (Bit 1) como entrada digital
TRISBbits.TRISB1 = 1;   //Configura pino RB1 (Bit 2) como entrada digital
TRISBbits.TRISB2 = 1;   //Configura pino RB2 (Bit 3) como entrada digital
TRISBbits.TRISB3 = 1;   //Configura pino RB3 (Bit 4) como entrada digital
TRISEbits.TRISE1 = 1;   //Configura pino RE1 (botao 1) como entrada digital
TRISEbits.TRISE2 = 1;   //Configura pino RE2 (botao 2) como entrada digital

}//end ConfiguraSistema


/** V E C T O R   R E M A P P I N G ******************************************/
// Rotina necessária para o compilador C18 saber onde é o início do vetor de
// "reset".
// Copiar na íntegra esta parte do código dentro do arquivo "main.c" de TODO 
// projeto usado com o Bootloader no PIC.


extern void _startup (void);        // See c018i.c in your C18 compiler dir
#pragma code REMAPPED_RESET_VECTOR = 0x1000
void _reset (void)
{
   _asm goto _startup _endasm
}
/** FIM DO ARQUIVO main.c ***************************************************************/


E ai?! Acho mais difícil que o Arduino? Parece ser, mas não é assim, o PIC te da mais liberdade nas configuradões, você tem que fazer em todos programas.
O funcionamento é o seguinte uma variável fica incrementando a cada laço do programa,isso determina qual chave vai ser lida, é feita a varredura de todas chaves e utilizado a multiplexação para ler 4 chaves usando as mesmas portas, ativando uma de cada vez e guardando seu valor.Por exemplo, se CHE=0 então esta selecionada a chave 1, assim é feita a leitura digital de suas 4 saídas(BCD), de acordo com essa leitura temos o valor que esta na chave mecânica depois disso guardamos o valor em uma variável e passamos para outra chave e assim por diante.
A multiplexação é feita de uma forma que alimenta uma chave por vez, tornando possível utilizar apenas 4 portas para ler todas chaves simultaneamente, quando a chave 1 esta sendo lida as outras 3 chaves estão desligadas(isso vai ficar bem visível no video).

Os LED's na placa sinaliza qual chave esta ativa pra leitura a cada momento do programa.

Nenhum comentário:

Postar um comentário