Ir ao conteúdo

Posts recomendados

Postado

Ola, estou iniciando em programação de microcontroladores e preciso montar um código em que os pinos de entrada do PIC são setados por chaves micro N/A, (na simulação com o SimulIDE eu uso um botão) mas estou tendo dificuldade porque no funcionamento da máquina (o pic comanda o acionamento da solenóide de um pistão) esse pistão tem que descer quando a chave "A" fecha e manda nível 1 na saída, em seguida outra chave desliga a mesma saída e o pistão sobe,e é aí a minha dificuldade, quando sobe ele fecha novamente a chave "A" só agora não deve dar nível 1 e sim 0 porque o pistão não deve descer agora, só no próximo siclo, ou seja teria que ser assim: Fecha portA0 > saída portB0= high // fecha portA1> saída portB0= low // fecha portA0 > saída portB0= low, está clara a explicação? Espero que sim, não estou conseguindo montar o código para alternar o nível nessa saída B0 com a mesma chave. Uso o PIC 16f818, simulação no SimulIde, compilador CCS C compiler e Mplab ide v. 8.30 

Segue o meu código:

 

#include<16f818.h>
#fuses INTRC, NOWDT, NOLVP
#use delay (clock=4000000)


void main(){

     while(true){
   
     
       if (!input(pin_a0)){
          output_high (pin_b0);     
  }
       if (!input(pin_a1)){
          output_low (pin_b0);
  }  
       if (!input(pin_a2)){
         output_high (pin_b0);
  }      
       if (!input(pin_a3)){
         output_low (pin_b0);  
           delay_ms(4000);
         output_high (pin_b1);
 }
       if(!input(pin_a4)){
         output_low (pin_b1);
}
     }
}
       

 

  • Curtir 1
  • Amei 1
Postado
Em 23/09/2024 às 09:01, Paulo Agostinho disse:

outra chave desliga a mesma saída e o pistão sobe,

se outra chave desliga , então como o pistão sobe ?,    imagino que ao desligar essa chave ele também liga outra chave invertendo a corrente e assim o pistão sobe e quando chega em cima o certo seria ligar novamente para continuar o movimento . 

  • Curtir 1
Postado

@devair1010

Em 23/09/2024 às 09:01, Paulo Agostinho disse:

Ola, estou iniciando em programação de microcontroladores e preciso montar um código em que os pinos de entrada do PIC são setados por chaves micro N/A, (na simulação com o SimulIDE eu uso um botão) mas estou tendo dificuldade porque no funcionamento da máquina (o pic comanda o acionamento da solenóide de um pistão) esse pistão tem que descer quando a chave "A" fecha e manda nível 1 na saída, em seguida outra chave desliga a mesma saída e o pistão sobe,e é aí a minha dificuldade, quando sobe ele fecha novamente a chave "A" só agora não deve dar nível 1 e sim 0 porque o pistão não deve descer agora, só no próximo siclo, ou seja teria que ser assim: Fecha portA0 > saída portB0= high // fecha portA1> saída portB0= low // fecha portA0 > saída portB0= low, está clara a explicação? Espero que sim, não estou conseguindo montar o código para alternar o nível nessa saída B0 com a mesma chave. Uso o PIC 16f818, simulação no SimulIde, compilador CCS C compiler e Mplab ide v. 8.30

Segue o meu código:

 

#include<16f818.h>
#fuses INTRC, NOWDT, NOLVP
#use delay (clock=4000000)


void main(){

     while(true){
   
     
       if (!input(pin_a0)){
          output_high (pin_b0);     
  }
       if (!input(pin_a1)){
          output_low (pin_b0);
  }  
       if (!input(pin_a2)){
         output_high (pin_b0);
  }      
       if (!input(pin_a3)){
         output_low (pin_b0);  
           delay_ms(4000);
         output_high (pin_b1);
 }
       if(!input(pin_a4)){
         output_low (pin_b1);
}
     }
}
       

 

Ola, não chefe, é sistema pneumático, as saídas do pic acionam a solenóide da válvula que controla a ação do pistão, solenóide ligada>ar em um sentido>pistão desce/ desligada>ar no sentido oposto>pistão sobe, é assim que funciona,

eu busquei suporte com o pessoal do curso que eu fiz de linguagem c, e me responderam muito vagamente sobre a criação de uma FLAG, ou seja, uma variável de início "0", porém segundo eles teria que fazer um if pra testar a flag em 0 junto com o acionamento da chave, mas esse código é impossível, ou você faz um if da variável ou do acionamento da chave, ou estou errado?

  • Curtir 1
Postado

@Paulo Agostinho   imagino que com a "flag" funcione , então no "IF" faça a comparação com pin_A0 e com a flag , e se os dois forem zero o pistão desce e quando chegar em baixo e desligar essa chave então atribua outro valor , que pode ser "1" , na flag assim quando o pistão chegar em cima e fizer a comparação, o pin_A0 estará com valor zero mas a flag não e assim o pistão não desce , e sendo que apara descer a flag precisa voltar ao valor zero no final do outro ciclo .

void main()
{
    int flag = 0;
    while(true)
    {
        if (!input(pin_a0) && flag == 0)
        {
            output_high (pin_b0);     
            flag = 1;
        }
        if (!input(pin_a1))
        {
            output_low (pin_b0);
            flag = 1;
        }  
    }
}

 

  • Curtir 1
Postado

Está muito confusa a sua explicação. Primeiro nos fale dos recursos disponíveis. Depois nos fale da automação pretendida. O código fica por último, não dá para falar dele sem conhecer a situação antes.

Pelo que entendi temos um pistão pneumático e uma válvula com 1 solenóide, isto é, ligada injeta pressão para expansão do pistão e desligada injeta pressão para recolhimento do pistão. É isso?

Também falaste de uma chave no mecanismo. Por acaso se refere a um fim de curso? Ele está localizado na retração ou na expansão do cilindro?

No seu ciclo, o que deseja? que o cilindro expanda e na sequência retraia sozinho e fique no aguardo de uma nova ordem? Se for isso, tem um fim de curso sinalizando que a expansão foi conseguida ou vai dar um prazo (tempo) para o cilindro expandir e na sequência ordenar a retração?

  • Curtir 1
  • Obrigado 1
  • Membro VIP
Postado

Também não entendi direito (se é que entendo alguma coisa). Melhor falar com desenhos ou fotos e etc. Também é bom saber o que este treco faz por completo - se não for segredo de estado.

Bem... ativando meu modo minimalista e focando apenas no título do tópico que entendi um pouco + (ou -)

//RB0=entrada,RB1=saída.. óbvio d+ 
if (!RB0) 
	{
	RB1^=1; //alterna
	deyayms(10); //debouncing - mas solte o botão rápido
	while(!RB0); //solte o botão pra valer - opcional
	} 

 

  • Obrigado 1

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!