Confusión de número de veces y número de ciclos

Sé que la pregunta es bastante simple, pero soy un novato y acabo de comprar un kit 8051 para aprender MCU. Estoy trabajando en un ejemplo que usa la instrucción djnz para crear la frecuencia de parpadeo a continuación.

Assume that djnz takes 3 cycles to execute every time.
MCU clock frequency: 2 MHz.

Number of times djnz instruction executed = 1000  # ln 1
Number of cycles = 3 * 1000 = 3000 cycles         # ln 2
Blinking Frequency = 2 MHz/3000 = 666.67 blinks/s # ln 3

Las partes que me confunden: (1) ¿"Número de veces" significa frecuencia? (2) ¿Por qué # ln 2usa el tiempo de ejecución de djnz multiplicado por la frecuencia de djnz? ps sé que frecuencia = 1/ciclo, y la duración de un ciclo depende de una instrucción.

Respuestas (1)

Casi, pero no del todo. La duración de un ciclo no depende de la instrucción que se está ejecutando. Si la frecuencia de reloj de la MCU es de 2 MHz, un ciclo es exactamente de 500 ns, independientemente de la instrucción que se esté ejecutando. Si alguna instrucción tarda 3 ciclos en ejecutarse, esa instrucción tardará 1500 ns en completarse. Los tiempos de ciclo se mantienen iguales.

Para responder a sus preguntas específicas:

(1) ¿"Número de veces" significa frecuencia?

No, en este contexto, "número de veces" solo indica cuántas veces se ejecutó la instrucción djnz. La única frecuencia que es relevante aquí es la frecuencia de reloj de la MCU, que ya sabemos que es de 2 MHz.

¿Por qué # ln 2 usa el tiempo de ejecución de djnz multiplicado por la frecuencia de djnz?

No es la frecuencia de djnz. Es solo la cantidad de veces que se ejecutó la instrucción djnz. Como sabemos que la instrucción djnz toma 3 ciclos y se ejecutó 1000 veces, entonces sabemos que 1000*3 = 3000 ciclos de tiempo fueron consumidos por la MCU al ejecutar las instrucciones djnz.

El djnz es solo un decremento. Toma un valor en la memoria, resta uno y luego lo mira. Si el nuevo valor no es igual a cero, salta a una dirección especificada en el código.

Si está familiarizado con C, el código equivalente de este ejemplo sería:

while(1)
{
    for(i=1000;i>0;i--){} //this entire loop takes 1.5ms to finish
    LED = LED^1;
}

Aquí, el bucle for se ejecuta 1000 veces, disminuyendo i con cada bucle (ahí es donde entra en juego djnz). Si se necesitan 3 ciclos, o 1500 ns, para disminuir i cada vez, entonces todo el ciclo for tomará 1500 ns * 1000 = 1,5 ms. El LED se alterna y el bucle comienza de nuevo. Por lo tanto, el LED parecerá parpadear una vez cada 1,5 ms. Si algo parpadea cada 1,5 ms, parpadeará 666,67 veces por segundo.