Normalmente pra medir tempo usando a função millis() ou micros() precisamos pelo menos de uma variável do tipo unsigned long. O algoritmo mais tradicional seria algo como:

#define interval 1000 // intervalo de tempo
unsigned long next;

setup(){
...
next= millis()+interval;
...
}

loop(){
...
if(millis()>=next){
// código a executar
next= millis()+interval; // ajusta o próximo evento
}

...

}

Nada de errado com esse algoritmo, mas se quiser fazer um código mais eficiente e que use menos memória, é possível usar operações bit-a-bit para conseguir o mesmo efeito. A restrição é que os intervalos de tempo precisam ser potências de 2. A função millis() retorna um inteiro que representa a quantidade de milissegundos desde que o arduino foi ligado. Se pensarmos nesse número em binário, o bit 0, que seria o menos significativo, muda de estado a cada milissegundo. O bit 1 a cada 2 milissegundos, o bit 3 a cada 4 e assim por diante, dobrando a cada bit que a gente avança. O bit 10 muda a cada 1024 milissegundos (2^10), então para marcar um intervalo de 1024 milissegundos, podemos monitorar o bit 10 do valor que a função millis() retorna. O código abaixo faz isso:

#define bit 10 // 2^10, ou 1024
boolean last;

setup(){
...
last= (millis() >> bit) & 1;
}

loop(){
...
boolean now= (millis() >> bit) & 1;
if(last != now){
// código a executar
last= now;
}

...

}

Essa é uma forma de economizar alguns bytes no código e na memória. As operações bit-a-bit são muito mais rápidas e ocupam muito menos bytes no código do que as operações aritméticas.

Exibições: 2023

Responder esta

Respostas a este tópico

Francesco, bom dia!

Ótima dica!

É uma forma rápida de testar intervalos de tempo.

Mas veja se concorda comigo:

Usar millis() nunca será eficiente, pois pode ser que ele pule alguns intervalos já que, normalmente, um programa é composto de várias instruções e quando o processamento chegar no teste do IF, o bit já pode ter mudado de estado várias vezes sem ter sido verificado.

Uma forma mais eficiente de disparar funções baseadas em intervalos é o uso de interrupções ou módulos RTC.

No entanto, na plataforma Arduino nunca teremos 100% de eficiência.

Para a maioria das aplicações, a sua dica é perfeita pois a porcentagem de perdas de intervalos é insignificante.

Obrigado por compartilhar!

Bom dia Jose!

Tem razão, não aconselharia esse algoritmo pra marcar intervalos muito curtos, a não ser que o programador tenha uma ideia muito boa de quanto tempo dura cada loop. Eu pessoalmente costumo marcar o tempo do loop em todo programa que faço. Marco o tempo, deixo rodar umas 10000 vezes, depois pego o tempo de novo e faço a média. Como nunca uso delays, dificilmente um loop chega a 100us, mas isso depende muito do programa. Cada um é um.

Abraço

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço