Ir ao conteúdo
  • Cadastre-se

PIC programação pic18f4550 utilizando relés


Posts recomendados

Bom dia, estou tentando fazer uma chave seletora digital de 9 posições utilizando relés para chavear a posição que for selecionada, poderiam me dar dicas para fazer essa programação no mplab.

A chave vai funcionar assim: com 3 botões touch, um para incrementar, outro para decrementar e um como enter, selecionando a posição desejada, dou o comando de enter e o relé referente á essa posição vai acionar algum componente ou operação em uma máquina. 

<>

#include<P18F4550.h>
#include<delays.h>

// Configurações
#pragma config   PLLDIV = 5           // PLL para 20MHz
#pragma config   CPUDIV = OSC1_PLL2   // PLL desligado
#pragma config   FOSC = HS            // Fosc = 20MHz      Tcy = 200ns
#pragma config   WDT = OFF            // Watchdog desativado
#pragma config   PBADEN = OFF         // Pinos do PORTB começam como
//digitais
#pragma config   LVP = OFF            // Desabilita gravação em baixa
//tensão
#pragma config   DEBUG = ON           // Habilita debug

// Definições de hardware
#define INC      PORTBbits.RB0        // Botão incrementa
#define DEC      PORTBbits.RB1        // Botão decrementa
#define TRV      PORTBbits.RB2        // Chave libera trava "um pulso
                                      // por toque"

#define DISP2    PORTEbits.RE0        // DISP2
#define DISP1    PORTEbits.RE2        // DISP1

#define DISPLAY PORTD      // Segmentos do display ligados em PORTD

void main(void){
int i = 0, valor;
unsigned char dezena, unidade, aux0=0, aux1=0, aux=0;
unsigned char tempo = 70;

   // tabela de dígitos do display - matriz de segmentos  
   char table[]    = {0b11110011,    // P
};

   char table2[]   = {0b00000110,    // 1
                      0b01011011,    // 2
                      0b01001111,    // 3
                      0b01100110,    // 4
                      0b01101101,    // 5
                      0b01111101,    // 6
                      0b00000111,    // 7
                      0b01111111,    // 8
                      0b01101111,    // 9
                      
};

// *** Inicialização

ADCON1 = 0x0F;           // Procurar no datasheet

DDRD = 0x00;             // Configura port D como saída
DDREbits.RE0 = 0;        // Configura RE0 como saída (DISP2)
DDREbits.RE2 = 0;        // Configura RE2 como saída (DISP1)

DDRBbits.RB0 = 1;        // Configura RB0 como entrada (INC)
DDRBbits.RB1 = 1;        // Configura RB0 como entrada (DEC)
DDRBbits.RB2 = 1;        // Configura RB0 como entrada (TRV)

DISP1 = 0;               // DISP1 desligado
DISP2 = 1;               // DISP2 desligado

INTCON2bits.RBPU = 0;    // Ativa pull-ups do portB

for(;;){
  if(!INC && !aux0){          // Incrementa i
      if(i <  i++;
      if(TRV) aux0=1;          // Para incremento de "um em um"
   }
   if(INC) aux0=0;
   if(!DEC && !aux1){          // Decrementa i
      if(i > 0) i--;
      if(TRV) aux1=1;          // Para decremento de "um em um"
   }
   if(DEC) aux1=0;

   valor = i;            // Transferindo i para a variável valor

   // Separando o valor em dígitos
   dezena = valor / 10;       // Separa inteiro da dezena
   unidade = valor % 10;      // Recupera resto da dezena
                              // que é a unidade

   DISPLAY = table[dezena];   // Transfere para o display (PORT D)
   DISP1 = 0;                 // DISP1 desligado
   DISP2 = 1;                 // DISP2 ligado
   Delay1KTCYx(tempo);        // Tempo que o display fica aceso
   DISP2 = 0;                 // DISP2 desligado

   DISPLAY = table2[unidade];  // Transfere para o display (PORT D)
   DISP1 = 1;                 // DISP1 ligado
   DISP2 = 0;                 // DISP2 desligado
   Delay1KTCYx(tempo);        // Tempo que o display fica aceso
   DISP1 = 0;                 // DISP1 desligado
  }
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

A opção de usar um port pra cada display é uma opção à acioná-los dentro do loop. Outra - a mais correta - é aciona-los numa interrupção. Assim você pode colocar mais displays e dá liberdade ao loop.

Depois deste "desabafo", vejamos...

Vou orientar pra 8 relés. Digamos que usa o portb pra eles. Basta fazer

#define reles PORTB

reles=1<<unidade;

Pro 9º em diante vou deixar você ter o prazer de descobrir por si. Caso não consiga, prove que tentou e .. já sabe...

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!