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