Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Joao Fabri

Acionamento de relês com PIC 16F883

Recommended Posts

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;
      }


}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
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...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×