Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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

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

×