Bom dia!

Estive fazendo testes com a função millis() e percebi que no início do programa ela sempre dá umas engasgadas para depois começar a cronometrar corretamente.

Fiz o seguinte programa:

void setup() {
   Serial.begin(9600);
   
}
void loop(){
  Serial.println(millis());  
}

Veja o resultado. Um monte de zeros e uns no começo para depois iniciar a cronometragem:

Pesquisei e não encontrei. Alguém sabe o motivo desse comportamento?

Exibições: 374

Responder esta

Respostas a este tópico

Boa tarde JAC.

Vou tentar explicar:

O invés de usar 9600 use o baud de 115200, ficará mais fácil entender.      Serial.begin(115200); 

e use micros()  ao invés de millis().     Serial.println(micros());  

Ao iniciar o processamento, no setup, e alcançar a primeira função que é encontrada é Serial.println(),

passou um tempo de +- 48 uSeg.

Esta fução, Serial.println()  em baud de 115200  leva aproximadamente 180 uSeg para ser executada,

então teremos  uma sequencia de tempos : 

48
180
376
576
768
964

Todo este tempo é menor que 1 miliSeg, então se usar millis(), sempre será impresso 0.

6 vezes imprimindo 0,

a partir dai teremos: 

1172
1412
1660
1908

4 vezes imprimindo 1 

etc

Espero ter ajudado.

RV

Rui, boa tarde!

Ótima explicação!

O valor de millis() é sempre cronometrado corretamente, mas o valor computado (exibido) vai depender do tempo de cada instrução utilizada. Eu tinha estranhado os zeros e uns iniciais, mas com dica do micros() acima, isso ficou mais claro.

Obrigado e abraço!

millis() é o tempo em milisegundos decorrido desde o inicio do processamento, por isso os zeros, não havia passado um milisegundo, esse é um conceito meio fora do no contesto de "tempo", é sempre um motivo que faz as pessoas em vez de usar millis() implementar o delay(), até o momento que a necessidade de fazer operações real-time (não literalmente) e parar o processamento por alguns instantes. Um colega meu ainda não conseguiu compreender muito bem isso, e mexe com arduino a algum tempo.

Olá Marcelo!

Realmente, o millis() me enganou. Naquele trecho do programa, os comandos foram processados em menos de um milissegundo e  pensei que tinha alguma coisa errada. Mas, na verdade, isso é uma coisa comum e não percebi.

Boa noite José Augusto, 

Se quiser fazer testes bem precisos de duração de programas ou rotinas, funções, etc, vai essa sugestão :

( terá que usar um analisador lógico - uns 50 reais no Mercado livre) 

1) Ao iniciar a parte do programa que deseja testar, set um bit em uma porta digital - exemplo D06

2) Ao terminar essa parte do programa, reset o bit.

3) Faça os teste do programa, conectando uma porta do analisador lógico nessa porta D06. 

4) com o analisador, dá para medir tempos com precisão de 41 ns !   A frequencia de amostragem mais rápida do Analisador é de 24 MHz !  Mais preciso do que o Arduino (16 MHz).

Abraços .

Gustavo, Obrigado pela dica!

Bom dia , 

Analisador lógico é uma ferramenta excelente para debugar o Arduino (e outros microcontroladores).

Principalmente ao testar dispositivos externos.

Tenho usado muito. 

Analisador Logico 8 Canais Usb Tipo Saleae

Abraços, 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço