Ir ao conteúdo

Simples delay


cesarlg

Posts recomendados

Postado

Ola pessoal, estou com uma duvida q sei q é simples, mas nao tinha me deparado com isso até então.

o codigo é parecido com esse:

if(input(pin_b1)) // se a entrada b1 estiver estado alto

output_high(pin_c1); //c1 fica alto por 100ms

delay_ms(100);

output_low(pin_c1); // e fica desligado

output_high(pin_c2); // saida c2 fica ligada o tempo todo

dessa maneira ele fica fazendo um loop infinito enquanto o b1 ficar ativado. e nao é assim q quero. quero c1 apenas um pequeno estado alto e c2 sempre em estado alto

Postado

Bom dia amigo!

Já tentou tirar o

output_high(pin_c2); // saida c2 fica ligada o tempo todo

de dentro do loop?



void main()
{

output_high(pin_c2); // saida c2 fica ligada o tempo todo

while (true)
{

if(input(pin_b1)) // se a entrada b1 estiver estado alto
{
output_high(pin_c1); //c1 fica alto por 100ms
delay_ms(100);
output_low(pin_c1); // e fica desligado
}


}

}

Postado

obrigado colega.. mas a expressao que falo o tempo todo, seria enquanto o botao b1 for pressionado. ou seja . c1 e c2 tem q ficar dentro da condicao if..,

if pressionado b1

liga c2 permanente até q b1 estiver pressionado, se b1 estiver em baixa. c2 tb baixo.

liga c1 por 100ms e depois fica desligado enquanto b1 estiver pressionado (alto).

Aguardo

Postado

Veja bem colega cersarlg, você cometeu um erro na sua rotina.

você esqueceu de colocar as chaves ( { e } ) informando o início e o fim do bloco do if.

Do jeito que você deixou, apenas o comando output_high (pin_c1) será executado quando o botão é pressionado.

Talvez seja isso que você deseja:

void main() 
{

while (TRUE)
{
if(input(pin_b1)) // se a entrada b1 estiver estado alto
{
output_high(pin_c1); //c1 fica alto por 100ms
delay_ms(100);
output_low(pin_c1); // e fica desligado
output_high(pin_c2); // saida c2 fica ligada o tempo todo

do {}
while (input(pin_b1));
}

else
{
output_low (PIN_C2);
}
}

EDIT:

Editei o código.

Falou

Postado

obrigado é por ai... agora aproveitando ,,, digamos que eu use essa mesmo possibilidade em um switch(menu)

case 4 :printf(lcd_putc,"\f LED1 E LED2\n TESTE");

{

output_high(Pin_c2); // ligar led2 o tempo todo enquanto dentro do case 4

output_low(pin_b3);

output_low(pin_b4);

output_low(pin_b5);

output_low(pin_b6);

{

output_high(pin_c1); // ligar led1 por 100ms

delay_ms(100);

output_low(pin_c1); // desligar led1

}

}

break;

Postado

volto a recorer a vocês tentando solucionar a mesmo possibilidade usando menu switch, tentei escrever de varias formas, ou nao funciona ou fica dando loop, no led1 e eu quero que só acione 1x.

obrigado novamente

Postado

Explique melhor o que você deseja executar dentro do case 4 e o que você deseja que esteja fora dele.

você já sabe como criar o "menu" para ir alterando entre os cases?

Falou

Postado

ola colegas. Matheus sim ja tenho criado os "menus" que vai alterando entre os cases!

a duvida é a mesma q na quinta mensagem. qd eu entrar em alguns cases, vou deixando estado alto alguns pinos e outros em estado baixo. apenas em um pino quero aquele mesmo 100ms ativado e depois fique permanentemente desligado.. só poderá ativar de novo qd sair do case e entrar novamente nele..

Postado

Assim dá certo nao?

case 4: 
{
output_high(Pin_c2); // ligar led2 o tempo todo enquanto dentro do case 4
output_low(pin_b3);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);

output_high(pin_c1); // ligar led1 por 100ms
delay_ms(100);
output_low(pin_c1); // desligar led1
break;
}

Postado

essa forma eu ja fiz , com break e td e mesmo assim o pin_c1 fica em loop , ou seja a cada 100ms+ atraso de outras funçoes, a saida c1 torna-se a ficar em estado alto..

Postado

Ele fica em loop pois do jeito que está, ele sempre fica no case 4. Se você quer que ele faça uma vez só, apenas incremente a variável que controla os cases. Assim:

case 4: 
{
output_high(Pin_c2); // ligar led2 o tempo todo enquanto dentro do case 4
output_low(pin_b3);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);

output_high(pin_c1); // ligar led1 por 100ms
delay_ms(100);
output_low(pin_c1); // desligar led1
variavel_responsavel_pelo_case++; //Dessa forma ele pula para o proximo case.
break;
}

Postado

Matheus a intençao nao é que ele pule o case.. ele deve ficar no mesmo case. eu mudo de case por um botao. então nesse case ele só vai ativar o c1 uma vez, depois fica desligado.. e por enquanto, qd seleciono o case em questao o c1 fica em loop.. conseguiu entender ? kkk .. talves nao tenha uma linguagem tecnica da coisa..

Postado

Entendi agora.

Pensei aqui e chequei a um algoritimo. Teste para verificar se e o que você deseja. Funciona assim:

case 4: 
{
output_high(Pin_c2); // ligar led2 o tempo todo enquanto dentro do case 4
output_low(pin_b3);
output_low(pin_b4);
output_low(pin_b5);
output_low(pin_b6);

if (aux == 1)
{
output_high(pin_c1); // ligar led1 por 100ms
delay_ms(100);
output_low(pin_c1); // desligar led1
aux = 0;
}
break;
}

voce está lá no case 3 e vai para o case 4. Quando você estiver saindo do case 3 para o 4, faça uma variável virar 1. Dessa forma ele irá ativar o C1. Quando a rotina do if for executada, o aux vira 0. Dessa forma c1 será executado 1 vez. Quando você voltar no case 3 de novo e passar para o 4 repita o processo.

Falou

Postado

ola Matheus.. consegui o resultado esperado , usando sua ideia, mas por inesperiencia nao entendi porque só funcionou utilizando essa linha (input(pin_e0)) existe outra forma ou ta certo assim mesmo?

"cabeçalho"

INT AUX=0;

...

while (true)

...

delay_ms(200);

if(input(PIN_e0)) menu ++;

if(input(PIN_e1)) menu --;

if(menu == 0) menu = 9;

if(menu == 9) menu = 1;

if(input(pin_e0)) aux = 1;

switch(menu)

{.....

case 4 :printf(lcd_putc,"\f teste 1000ms\n led pin b7");

output_low(pin_b3);

output_low(pin_b4);

output_low(pin_b5);

output_low(pin_b6);

output_high(Pin_b2);

if (aux == 1)

{

output_high(pin_b7); // ligar led1 por 100ms

delay_ms(1000);

output_low(pin_b7); // desligar led1

aux = 0;

}

break;

obrigado de novo... como sempre você dando aquela força

Postado

Do jeito que você faz funciona mas não é o ideal. você nao tratou os inputs contra bouncing..... Veja: forum.clubedohardware.com.br/debouncing-iniciantes/712912

você nao disse qual PIC usa. Mas poderia usar, se for o 16F877A, os dois canais CCP1 e CCP2 para fazer essa verificaçao de botao apertado. Nesse caso serias duas interrupçoes.

Caso nao deseje, apenas dê um jeito de melhorar o codigo contra o bouncing dos botões.

Falou

  • 2 semanas depois...
Postado

Ola novamente, por curiosidade, tomando base de um pic 16f877a com cristal de 4mhz. qual o duraçao maxima q posso utilizar um delay?

1 é possivel chegar a minutos com precisao? qt?

2 sem precisao (+-10%) qual o maximo de delay?

3 ao se utilizar um cristal de valor maior , se chega a maior tempo?

obrigado..

Postado

A linguagem C não tem suporte a Real Time,isto quer dizer que voce vai setar os tempos como quiser,mas o programa todo não terá os tempos com exata precisão como voce perguntou.

Arquivado

Este tópico foi arquivado e está fechado para 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...