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