Olá pessoal, mais uma vez, venho tentar esclarecer uma grande dúvida com os mestres. 

Gostaria de saber se é possível fazer uma alteração em uma variável booleana, enquanto o arduino roda outra tarefa. 

Tentei fazer isso usando interrupts() e noInterrupts, mas não obtive êxito após inúmeras tentativas. Estou começando a achar que não é possível. Alguém tem uma luz no fim do túnel para mim?

Exibições: 770

Responder esta

Respostas a este tópico

Nao entendi sua necessidade...

Se vc considerar um pino do microcontrolador uma variável e ligar ele ao seu sinal é como se ele mudasse de valor por estimulo externo independente do programa principal.

Já, se vc usar interrupção, pode gerar nas bordas, setando sua boleana sim, se nao funcionou é pq deu algo errado.

Mande um codigo exemplo do que vc tentou e nao funcionou, que pino usou, e diga melhor sua necessidade.

Essa de fazer as coisas funcionarem em interrupção tanto funciona que no tempo do TK85 todo o video era gerado assim, no tempo do MSX a leitura do teclado, relogio (o Z80 nao tem nenhum timer), etc, etc, eram por interrupção. vc não precisava pensar no teclado no seu codigo, ainda que em assembler, ele era lido o tempo todo por interrupções, so parando se vc desabilitar.

Oi RMM, boa noite.

Ontem eu respondi no seu topico, mas parece que a resposta desapareceu.

Eu sugeri voce usar o conceito de threads no seu codigo.

Acho que assim voce consegue atinjir seu objetivo.

Rui

Olá Rafael,

   Como muito bem colocado pelo Marcondes,  fica dificil adivinhar o que você pretende,  explica melhor ou coloca seu sketch informando o que ele deve fazer,  senão fica muito dificil.

   De basico o que deu pra entender é que você criou uma rotina com delay, e dai tem dificuldades de fazer alterações numa variavel boolean,  mas tô só chutando,  explica melhor ai ok.

Ops
atingir

Valeu Rui, realmente não vi nada, mas não tem problema. Sigo aqui nesta luta.

Ok, cometi este deslise mais uma vez, já falaram pra mim postar o código nestes casos, mas acho que vai dar trabalho demais pra ficarem lendo o código e acabo não postando, rs.

O programa que quero fazer é um pouco extenso, então eu fiz um sketch provisório só para afinar está função de pausa, e não terem que ficar procurando no código essas partes que estou com dificuldade.

Segue o sketch aqui

O código esta usando uma interrupção externa, pois foi a única forma que encontrei até agora que cheguei perto do que eu queria mas ainda não está perfeito. E também não queria usar essa interrupção para economizar pino, mas se for a única forma não tem problema.

EXPLICAÇÃO DO PROGRAMA:

O programa pisca um led "n vezes" ao acionar o botão START, a quantidade de vezes está armazenada na quantidade variável.

No momento que esta rotina esta sendo executada, se eu acionar o botão pausa, ( ligado no pino dois com attachInterrupt), a rotina de piscar pausa por tempo indeterminado, e ao acionar o botão START novamente a rotina volta de onde parou, exemplo:

quantidade = 20;

aciona o botão START e o led pisca 5 vezes;

aciono a PAUSA e neste momento quantidade = 15;

aciono START novamente, e a rotina volta de onde parou, ou seja, pisca o led 15 vezes.

O pause pode ser acionado quantas vezes necessário e a quantidade volta de onde parou.

O QUE ESTÁ ACONTECENDO:


O que acontece é que consegui fazer rodar a rotina de piscar e o pause, corretamente, mas quando o aciono o START novamente, ele até chama a função piscar novamente, mas não conta nada, não pisca nada, e volta pro loop novamente.

Anexos

Esqueci, o fritzing está em anexo aí em cima ok? TESTE PAUSAR.jpg

Você já tentou o volatile como eles pedem??


volatile boolean pausa = false;

No seu código você usa um FOR para piscar, e decrementa sempre até o fim a variável quantidade.  Você precisa usar um break, se não quiser zerar...

  

for(quantidade;quantidade>0;quantidade--)    // Pisca a quantidade armazenada na variável quantidade

   {  

    if(pausa==false)                                // Se pausa estiver ligado a rotina não roda

      {

        digitalWrite(ledPin,HIGH);             

         delay(1500);

        digitalWrite(ledPin,LOW);

        delay(200);

        Serial.print("qde=");

       Serial.println(quantidade);

     }

   else break;

  }

Poxa!! Valeu Alexandre! Resolvido! 

Não fazia nem ideia que o for zerava a variável mesmo sendo interrompido. Sabia que tinha um problema no código mas não fazia nem ideia de onde estava!

Não sei nem como agradecer! Valeuzaço!

Agora, ainda não entendi a vantagem de qualificar a variável como volatile. Eu li nas referências do arduino, que se deve fazer tal declaração quando a variável é alterada por uma função que esteja em outra seção do código, e que ela é armazenada na RAM do arduino. Correto? Mas até onde sei, uma variável mesmo sem ser volatile pode ser controlada de outra seção a não ser a qual ela pertence.

Mas enfim, é apenas uma curiosidade que vai além da pratica do meu problema. Fiz as alterações como vc disse e agora está funcionando redondinho!

VALEU!!!! 

O FOR antes não era interrompido! Quando pausa virava true ele prosseguia até o fim sem alterar o pino e imprimir na serial!

O volatile....

Typically global variables are used to pass data between an ISR and the main program. To make sure variables shared between an ISR and the main program are updated correctly, declare them as volatile.

Entendi! Valeu pela ajuda mais uma vez!!!

Um chip qualquer tem 2 estados.
a)Parado
b)Funcionando
Quando parado,ele não tem nenhuma aliementação.Quadno rodando,ele está alimentado (Reset on Load).
O Reset on load é a ação que o chip faz ao ser alimentado.O que chamamos de pausa (ou delay em ingles) é uma "gambiarrinha" computacional no qual mantemos o chip rodando sem fazer nada.Ou seja,mesmo que esteja em pausa,ele está na verdade no estado (b).Talvez você deseja fazer uma "pausa" do chip dessa forma:

void com_preguica( unsigned char atoa)
{
unsigned int x;
while atoa>0 do
{++x}
}
void loop()
{

if (sua condicao==bla bla)
{
com_preguica(1);//fica fazendo nada
}

}

Como dissemos o estado (a) basta desligar o chip

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço