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.
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por