Ir ao conteúdo
  • Cadastre-se

Acionamento de relês com PIC 16F883


Posts recomendados

Boa noite, estou gerando um código com o seguinte funcionamento:

Se minhas três entradas (Segurança, Pressostato, Gatilho) estiverem acionados.

Quando os três forem acionados, deve ligar relê 1 e relê 2.

Ao passar um tempo de no máximo 2 segundos o relê 3 deve entrar também.

Qualquer um das três entradas que saírem os relês devem cair.

Se segurança estiver despressionado ascende um led indicativo.

Se pressostato estiver despressionado ascende um led indicativo.

***********************************************************

A logica esta funcionando mas porém estou com muitos atrasos no codigo, os tempos não estão conforme os programados, alguem teria uma dica para melhorar meu código ???

Segue código comentado:

#define Gatilho RA0_bit
#define segurança RA1_bit
#define Pressostato RA2_bit
#define rele1 RB0_bit
#define rele2 RB1_bit
#define rele3 RB2_bit
#define led1 RB3_bit
#define led2 RB4_bit
#define led3 RB5_bit

void funcionamento (void);              // função que aciona os reles
void interrupt ()                       // rotina de interrupção
{
     if (T0IF_bit)                      // Se houve estouro do TMR0
     {
      T0IF_bit = 0x00;                  // limpa flag
      TMR0     = 0x96;                  // Reinicia TMR0
      funcionamento ();                 // chama função dos relês

     }
}

void main()
{
unsigned char aux = 0;                  // variavel auxiliar

OPTION_REG = 0b10001110;                // Desabilita resistor pullup, prescaller 1:128
GIE_bit    = 0x01;                      // Liga interrupção global
PEIE_bit   = 0x01;                      // Habilita interrupção por perifericos internos
T0IE_bit   = 0x01;                      // Habilita interrupção por estouro do tmr0

TMR0       = 0x96;                      // Inicia tmr0

ANSEL   = 0x00;                         // todos pinos como digitais
ANSELH  = 0x00;                         // todos os pinos como digitais
TRISA   = 0xFF;
TRISB   = 0x00;
PORTA   = 0xFF;
PORTB   = 0x00;

}

void funcionamento ()                    // função acionamento dos reles
{

unsigned char sett = 0;                  // variavel auxiliar

if (Pressostato == 1)                    // Se pressostato estiver aberto
{
 led1 = 1;                               // ascende led1
}
else 
{
led1 = 0;
}

if (segurança ==  1)                   // Se segurança estiver aberto
{
 led2 = 1;                             // ascende led2
}
 else 
 {
 led2 = 0;
 }


if (Gatilho == 0 && segurança == 0 && Pressostato == 0)     // Se todos estiverem pressionados
        {

           rele1 = 1;
           rele2 = 1;
           sett  = 1;
        }
        if (sett == 1 )
        {
        sett  = 0;
        Delay_ms (200);
        rele3 = 1;

        }

      else if  (Gatilho == 1 || segurança == 1 || Pressostato == 1)
      {

      rele1 = 0;
      rele2 = 0;
      rele3 = 0;
      }


}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, Joao Fabri disse:

if (Gatilho == 0 && segurança == 0 && Pressostato == 0)     // Se todos estiverem pressionados
        {

           rele1 = 1;
           rele2 = 1;
           sett  = 1;
        }
        if (sett == 1 )
        {
        sett  = 0;
        Delay_ms (200);
        rele3 = 1;

        }

Percebo aqui um delay condicional. Percebo que seu programa  movido a interrupt apenas. Nao sei se isso é totalmente bom.Penso que deva colocar um inutil

for(;;);

no fim do main()

Sem mais para o momento...

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

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!