Olá pessoal, estou precisando de uma ajuda.

 

Gostaria de saber como faço para verificar o estouro de um timer, mas sem usar interrupção.

 

O que preciso e setar o valor do timer, e depois em algum momento verificar o seu estado.

 

Não queria que fosse gerada uma interrupção, mas sim de verificar em um momemto posterior se o timer estourou ou não (overflow).

 

Estava dando uma lida no datasheet do 328 e ví que há um registrador que é setado/zerado quando ocorre o overflow, mas como faço para ler este registrador no Arduino.

 

Agradeço qualquer ajuda.

 

 

Exibições: 481

Responder esta

Respostas a este tópico

Gino

 

Verifica se esse exemplo que eu postei resolve o seu problema.

 

Com ele é possível criar vários timers por software que estão usando como base milisegundos mas pode ser facilmente alterado para microsegundos usando a funcao micros.

 

http://labdegaragem.com/forum/topics/multitarefa-para

 

Abraços

 

Bruno 

Bruno.

 

Eu ja tinha olhado o teu codigo sim, guardei aqui no meu cinto de utilidades para um uso futuro !! hehe

 

Talvez ele me sirva sim, há como fazer isto ?

void loop (void)
{
        // parte do programa que faz verificacoes diversas
        // ...
        // ...

    if(a>b) {

    timerLed1 = { 0, 63000 }; //define valor 63000 ms (65536 - 2536)


     TimerStart ( & timerLed1 );
    if ( (c>d) && (TimerExpired ( & timerLed1 )) ) {

    ...    // trecho que só deve ser executado quando c>d e timerLed1 estiver estourado
    ...

    }

    ...
    ...

    timerLed1 = { 0, 50000 }; //define valor 50000 ms (65536 - 15536)


   TimerStart ( & timerLed1 );
    if ( (c>d) && (TimerExpired ( & timerLed1 )) ) {

    ...    // outro trecho que so deve ser executado quando c==d e timerLed1 estiver estourado
    ...

    }



    // restante do programa


  }

 

Gino

 

Dá sim, vc só não pode reiniciar o timer dentro do loop 

timerLed1 = { 0, 50000 }; //define valor 50000 ms (65536 - 15536)

Essa instrução reinicia o timer sempre, assim nunca vai entrar no timerExpired, vc tem que iniciar o timer somente uma vez.

 

E dentro dos IFs, quando ocorrer o estouro do timer, vc precisa reiniciar o timer usando a função TimerStart, assim ele pode estourar novamente.

 

Ficaria mais ou menos assim

Timer     timerLed1 = { 0, 63000 }; //define valor 63000 ms (65536 - 2536)

Timer     timerLed2 = { 0, 50000 }; //define valor 50000 ms (65536 - 15536)

void loop (void){        // parte do programa que faz verificacoes diversas        // ...        // ...
    if(a>b) {
    if ( (c>d) && (TimerExpired ( & timerLed1 )) ) {
    ...    // trecho que só deve ser executado quando c>d e timerLed1 estiver estourado    ...

TimerStart ( & timerLed1 );   

}
    ...    ...

    if ( (c>d) && (TimerExpired ( & timerLed2 )) ) {
    ...    // outro trecho que so deve ser executado quando c==d e timerLed2 estiver estourado    ...
TimerStart ( & timerLed2 );   

}

Eu separei em 2 timers porque tem 2 tempos diferentes.

 

Abraços

 

Bruno 

 

Valeu Bruno.

 

Vou testar hoje a noite.

 

Outra coisa, há como recuperar o valor do timer em algum momento qualquer antes de ele estourar ?

 

Abraço


Gino

Tem sim, o valor de tempo do processador - valor de start do timer é quanto tempo se passou desde o último reinicio do timer.

 

Fazendo uma função ficaria assim (não testei pra saber se funciona...rs)

 

int TimerValue ( struct Timer * timer ) 
{
    //Retorna o valor do timer 
    return ( Now () - timer->start ); 
}

 

Abraços

 

Bruno 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço