Creo que podría tener dificultades para obtener un retraso de microsegundos que sea preciso y no bloqueante con el ESP8266.
De acuerdo con la documentación de NodeMCU :
Si observa el app/modules/tmr.c
código para esta función, verá que ejecuta un nivel bajo ets_delay_us (retraso). Esta función no es parte del código NodeMCU o el SDK; en realidad es parte de la xtensa-lx106
ROM de arranque, y es un ciclo de sincronización simple que sondea contra el reloj interno de la CPU. Lo hace con las interrupciones deshabilitadas, porque si están habilitadas, no hay garantía de que el retraso sea el solicitado.
tmr.delay()
está realmente diseñado para usarse donde necesita tener un control de tiempo más preciso en una E / S de hardware externo (por ejemplo, levantar un pin GPIO alto por 20 μSec). No logrará ningún propósito funcional en casi todos los demás casos de uso, ya que cualquier otra actividad basada en el código del sistema se bloqueará de la ejecución; en el peor de los casos, romperá su aplicación y creará errores de tiempo de espera difíciles de diagnosticar.
Parece que las interrupciones tienen que deshabilitarse en este caso simplemente porque si ocurriera una interrupción a mitad de la demora con un intervalo corto (del orden de unos pocos microsegundos), el controlador de interrupción tomaría mucho más tiempo del que se suponía que la demora completa ser - estar.
Supongamos que desea un temporizador de 20 microsegundos y se produjo una interrupción de aproximadamente 10 μs. Si el controlador tarda más de 10 μs, ya habrá superado el retraso de 20 μs que pretendía.
Por lo tanto, podemos descartar tmr.delay()
si necesita interrupciones de trabajo.
Investigué un poco más, y aparentemente el ESP8266 admite temporizadores de microsegundos a través de los cuales ets_timer_arm_new()
el último parámetro es cero. NodeMCU, sin embargo, establece este valor en 1 que utiliza la precisión de milisegundos . Esta publicación parece apoyar esa idea:
Si necesita obtener el intervalo entre dos interrupciones de gpio, use la api del sistema system_get_time () para calcular el tiempo relativo. (Us) Si desea usar una api os_timer para organizar un evento del temporizador us, use system_timer_reinit al comienzo de user_init y llame a os_timer_arm_us.
Si está dispuesto a intentar editar y reconstruir el firmware, puede valer la pena intentarlo. Aunque, hubo una solicitud de función para esto , que se rechazó como:
Así que probé temporizadores de nanosegundos, y no puedo establecer intervalos de menos de 1000us (con código compilado y eliminado y en modo CPU de 160MHz obtuve algo así como 800us). ¿Es este un caso para proporcionar una nueva funcionalidad (en su mayoría inutilizable)?
- djphoenix
No factible ATM -> cierre.
- marcelstoer