Al experimentar con LED parpadeantes, aprendí a crear retrasos con un bucle de software o un tiempo de espera de un temporizador. Sé que para un programa de LED parpadeante simple, donde los procesos no son tan complicados y el tiempo no es crucial, usar cualquiera de los dos no importaría. Pero en más de un contexto multitarea crucial en el tiempo, ¿cuáles son los beneficios y/o desventajas de ambos?
Muchas gracias, así es como los configuré:
Retraso del programa:
void softwaredelay()
{
int i;
for(i=0; i<1000; i++)
{/*Timer Stuff*/}
}
Retardo de hardware (específico para PIC16 mcu):
void timerdelay()
{
OPTION_REGbits.PSA = 0;
OPTION_REGbits.PS. = 0b111;
OPTION_REGbits.T0CS = 0;
INTCONbits.T0IF = 0;
TMR0 = 0b11111000;
INTCONbits.T0IE = 1;
while(INTCONbits.T0IF==0)
{/*Timer Stuff*/}
}
Tienes que ir al banco (que está a la vuelta de la esquina) y lavar la ropa. Ir a la lavandería requiere que espere a que termine la lavadora y luego espere a que termine la secadora.
¿Cómo haría para realizar estas tareas?
En un día de descanso, podría simplemente lavar la ropa y luego ir al banco. No es tan importante. A quién le importa.
Pero en un día ajetreado, donde tiene otras cosas que hacer, como ver una película, estudiar o lo que sea, lo más eficiente es cargar la primera parte de la ropa, luego ir al banco y luego cargar la segunda. parte del lavadero. Ahora eres libre de hacer otras cosas. Eso es maximizar tu tiempo para que puedas hacer otras tareas.
Ahora, para un microcontrolador o cualquier sistema integrado, lo mismo es cierto. Si no le importa la energía, el tiempo ni nada, elija un retraso controlado por software. Es más fácil de implementar y puede escalarlo tan alto como desee con gran facilidad.
Si le preocupa la energía, el tiempo o la eficiencia, entonces un temporizador de hardware es el camino a seguir. Mientras espera, puede irse a dormir o realizar otra tarea. Es un poco más complicado de configurar, y si varias tareas requieren demoras, es posible que se quede sin temporizadores de hardware y luego tenga que recurrir a un sistema más complicado para administrar el tiempo y las demoras.
Si le importa algo más que la facilidad de uso: Temporizador de hardware
Si solo te importa la facilidad de uso: Software
Depende en gran medida de lo que quieras lograr.
Para un retraso de bloqueo de software como el que ha configurado, no podrá atender las interrupciones y mantener un intervalo constante. Si agrega más código al ciclo, la demora cambiará, potencialmente de manera impredecible o inconsistente si tiene bloques de flujo de control variable. Sospecho que nada de esto importa mucho para un programa parpadeante simple, pero usted preguntó acerca de las aplicaciones críticas en el tiempo.
El "retraso del software" es una solución ingenua. Nunca debe usar dicho código en ningún programa de microcontrolador porque nunca hay una razón para hacerlo: siempre tendrá temporizadores de hardware. "Retrasos de software" no es profesional, ya que tiene los siguientes problemas:
Si bloquear la CPU no es un problema, es decir, si su programa no tiene nada útil que hacer mientras espera, entonces debe configurar un temporizador de hardware y sondear ese indicador de temporizador como en su segundo ejemplo.
Para requisitos de tiempo real más difíciles, tendrá que usar interrupciones de temporizador.
Si el consumo de corriente es un problema y la MCU admite suspensión/reactivación, generalmente puede configurar la MCU para que entre en modo de suspensión hasta que haya transcurrido el tiempo.
asm NOP;
un par de veces. Dicho esto, realmente no veo por qué REG1=COUNTER+1; while(!(REG2 & flag));
generaría ese código mucho más lento que su ejemplo. Por el contrario, tiene la ventaja de ser determinista ya que todos los registros involucrados son volátiles. El hecho de que no te hayas declarado i
volátil muestra que no deberías estar haciendo cosas como esta. Su "retraso" desaparecerá en el aire.i
como volátil y todo su ciclo desaparecerá en el aire. O lo declara i
como volátil, en cuyo caso no terminará en un registro de la CPU.
al bundy
Ocanath