Ir ao conteúdo
  • Cadastre-se

Interrupção função com tempo calculado


Dogolino

Posts recomendados

Surgiu uma dúvida,

Estou usando uma interrupçãozinha externa, ta funcionando beleza coisa simples, só que eu queria fazer uma coisa, quando a interrupção for chamada ela ficar "amarrado" com um tempo determinado dentro da função, exemplo:

//interrupção
#int_ext
void trata_interupcao()
{

[B]------TEMPO DETERMINADO - Aqui no caso seria o "tempo" que eu determinaria, por exemplo, durante 5 segundos ele "executaria" essa rotina abaixo , depois volta pro programa normal.[/B]

if(input(pin_a6) ==1 && input(pin_a7) ==0 && ativa_fls==0 ){
delay_ms(100);
fls++;

}
if(input(pin_a6) ==1 && input(pin_a7) ==1 && ativa_fls==0){
delay_ms(100);
fls++;
ativa_fls=1;
}

if(ativa_fls==1){
//

// Verifica sinais
if(fls==2){

delay_us(10);
output_high(pin_b7);

fls=0;
...

------FIM DO TEMPO DETERMINADO

Estou querendo isso pois a interrupcao do que estou fazendo pode ser acionada com muitos pulsos ao invés de 1 só, então ele sempre começa de novo a interrupção, queria um jeito de amarrar isso.

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Assim que entrar na interrupção, desabilite-a. Deste modo, ela não deverá "reagir" ao sinal externo.

Após a execução de toda a função dentro da interrupção, como última instrução desta função, reabilite a interrupção externa. Ela voltará a "reagir" aos sinais externos.

Bons trabalhos.

Link para o comentário
Compartilhar em outros sites

Prefiro a solução do colega aphawk. Interrupções foram feitas para serem executadas o mais rápido possível. Não é aconselhável você ficar preso dentro de uma.

Como o colega disse, crie uma base de tempo com algum timer e dentro da interrupção externa apenas altere uma variável que será uma flag.

Dentro do código principal, como a flag foi alterada, entre na sua rotina que precise ser executada. Quando ela for chamada, altere outra flag de condição que não deixara sua flag da interrupção ser alterada e vá sempre comparando com sua base de tempo ate dar 5 segundos.

Assim, você amarra todo o código e mantem as interrupções ativas para poder usar para outra coisa.

Mas se você postar o código todo, ajudará.

Falou

Link para o comentário
Compartilhar em outros sites

valeu pelas dicas, mas resolvi de outra forma, realmente era muito gambiarra,

então a solução foi simples.

coloquei um delay_ms(200) após o while(1) onde o programa "começa", assim ele ficou amarrado no delay dando tempo de contar as varias vezes antes de começar o programa.

O moderador pode marcar como resolvido.

Link para o comentário
Compartilhar em outros sites

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