Función de retardo en el microcontrolador Arduino

0

El IDE de Arduino tiene un código de ejemplo "Parpadeo sin retraso". Aquí comenta:

  

"Enciende y apaga un diodo emisor de luz (LED) conectado a un pin digital, sin usar la función de demora (). Esto significa que otro código puede ejecutarse al mismo tiempo sin ser interrumpido por el código LED."

¿Podría darme una idea de lo que significa aquí?

    
pregunta user16307

2 respuestas

1

La función delay() no regresa hasta que el intervalo requerido haya expirado. Durante ese tiempo, lee constantemente el reloj, buscando el final del intervalo. Esto significa que su programa no puede hacer nada más durante ese tiempo.

Una alternativa es establecer un temporizador para su programa que interrumpa lo que esté haciendo el programa cuando el tiempo expire al llamar a una función para (en este caso) cambiar el estado del LED. Mientras tanto, una vez que se establece el temporizador, su programa puede continuar haciendo algo más útil.

En un programa intermitente, donde parpadear un LED es el punto, no hay nada más que hacer, pero en general, querrá que sus programas puedan mantener una pantalla, reaccionar a los botones o un teclado. , y lea algunos sensores, por ejemplo, y parece que los hace simultáneamente.

Actualización:

Un reloj o temporizador es un registro de hardware que el programa puede leer, que se cuenta automáticamente hacia arriba o hacia abajo a una velocidad fija, como una vez cada milisegundo. Este conteo lo realiza el hardware sin que el programa tenga que hacer nada. Para demorar, por ejemplo, 2 segundos, la función delay() leerá el registro del reloj, le agregará 2000 (el número de milisegundos de la demora requerida) para encontrar la hora de finalización, luego seguir leyendo el registro del reloj hasta que sea igual o superior a ese tiempo.

En el segundo caso, arriba, un registro de temporizador se establecería en 2000 (nuevamente, el número de milisegundos para retrasar), pero en este caso el hardware disminuye que se registra cada milisegundo, y interrumpe el programa cuando el registro del temporizador llega a 0.

    
respondido por el JRobert
0

Primero, mire el contenido de Parpadeo boceto. Como dice JRobert, delay() no regresa hasta que el intervalo especificado (aquí, 1000 milisegundos, o 1 segundo) tenga muerto. Eso significa que su función loop() no puede hacer nada más mientras está esperando que pase ese segundo (está esperando que regrese delay() ). Para usar una analogía, imagine que si enciende el LED, mire su reloj hasta que pase un segundo, apague el LED y mire el reloj por otro segundo (y repita).

Ahora, consulte BlinkWithoutDelay . Este programa compara repetidamente la hora actual, currentMillis , con un tiempo previamente grabado, previousMillis . Si la diferencia excede 1 segundo ( currentMillis - previousMillis >= interval ), actualiza el tiempo registrado ( previousMillis = currentMillis; ) y alterna el estado del LED. De lo contrario, vuelve a empezar y vuelve a comprobar el tiempo.

(La hora actual se obtiene con la función millis() , que devuelve el tiempo en milisegundos transcurrido desde Arduino comenzó a ejecutar el programa. Este valor se incrementa a la velocidad correcta a través de uno de los temporizadores en el microcontrolador de Arduino, aunque el boceto de BlinkWithoutDelay no funciona directamente con el temporizador.)

La gran diferencia con Blink es que en BlinkWithoutDelay, puedes agregar fácilmente más código a la función loop() para que se ejecute entre las verificaciones de tiempo (un buen lugar está al principio, donde ves el comentario // here is where you'd put code that needs to be running all the time. ) Esto sería como mirar repetidamente su reloj para comprobar si ha pasado un segundo, y encender el LED si lo ha hecho; tienes la libertad de hacer otras tareas entre revisar tu reloj una vez y volver a hacerlo. Una cosa de la que hay que tener cuidado es que esas otras tareas no toman mucho tiempo; de lo contrario, usted / el Arduino podrían gastar más de un segundo en esas tareas antes de volver a verificar el tiempo.

    
respondido por el kwc

Lea otras preguntas en las etiquetas