Eu acho que você pode ter dificuldade em obter um atraso de microssegundo que seja preciso e não bloqueie o ESP8266.
De acordo com a documentação do NodeMCU :
Se você olhar o app/modules/tmr.c
código para esta função, verá que ele executa um ets_delay_us de baixo nível (atraso). Esta função não faz parte do código NodeMCU ou do SDK; na verdade, faz parte da xtensa-lx106
ROM de inicialização e é um loop de tempo simples que controla o relógio interno da CPU. Isso é feito com as interrupções desativadas, porque, se estiverem ativadas, não há garantia de que o atraso será conforme solicitado.
tmr.delay()
é realmente destinado a ser usado onde você precisa ter um controle de tempo mais preciso em uma E / S de hardware externa (por exemplo, elevando um pino GPIO alto por 20 μSec). Ele não alcançará nenhum objetivo funcional em praticamente todos os outros casos de uso, pois qualquer outra atividade baseada em código do sistema será impedida de executar; na pior das hipóteses, ele interromperá o aplicativo e criará erros de tempo limite difíceis de diagnosticar.
Parece que as interrupções precisam ser desativadas nesse caso, simplesmente porque, se uma interrupção ocorrer no meio do atraso com um intervalo curto (da ordem de alguns microssegundos), o manipulador de interrupções levaria muito mais tempo do que o atraso inteiro deveria ser estar.
Digamos que você desejasse um cronômetro por 20 microssegundos e ocorreu uma interrupção em cerca de 10 μs. Se o manipulador demorar mais de 10 μs, você já terá passado o atraso de 20 μs pretendido.
Portanto, podemos descartar tmr.delay()
se você precisa interromper o trabalho.
Fiz um pouco mais de escavação e, aparentemente, o ESP8266 suporta temporizadores de microssegundos, nos ets_timer_arm_new()
quais o último parâmetro é zero. O NodeMCU, no entanto, define esse valor como 1, que usa a precisão de milissegundos . Este post parece apoiar essa ideia:
Se você precisar obter o intervalo entre duas interrupções do gpio, use o sistema api system_get_time () para calcular o tempo relativo. (Us) Se você deseja usar um os_timer api para organizar um evento nos timer, use system_timer_reinit no início de user_init e chame os_timer_arm_us.
Se você estiver disposto a tentar editar e reconstruir o firmware, pode valer a pena tentar. No entanto, houve uma solicitação de recurso para isso , que foi recusada como:
Então testei temporizadores de nanossegundos e não consigo estabelecer intervalos menores que 1000us (com código compilado e despojado e no modo de CPU de 160MHz obtive algo como 800us). É este o caso de fornecer novas funcionalidades (principalmente inutilizáveis)?
- djphoenix
ATM inviável -> fechamento.
- marcelstoer