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 2MHz, un ciclo es exactamente 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 n en completarse. Los tiempos de ciclo siguen siendo los mismos.
Para responder a sus preguntas específicas:
(1) ¿"número de veces" significa frecuencia?
No, en este contexto, "cantidad de veces" simplemente te dice cuántas veces se ejecutó la instrucción djnz. La única frecuencia que es relevante aquí es la frecuencia de reloj de MCU, que ya sabemos es 2MHz.
¿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 el número de veces que se ejecutó la instrucción djnz. Como sabemos que la instrucción djnz toma 3 ciclos y fue ejecutada 1000 veces, entonces sabemos que la MCU que ejecuta las instrucciones djnz consumió 1000 * 3 = 3000 ciclos de tiempo.
El djnz es solo un decrementor. 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 específica 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 el djnz). Si se requieren 3 ciclos, o 1500ns, para decrementar i cada vez, entonces todo el bucle for tomará 1500ns * 1000 = 1.5ms. El LED se enciende y el bucle comienza de nuevo. Por lo tanto, la luz LED parpadeará una vez cada 1.5 ms. Si algo parpadea cada 1.5 ms, parpadeará 666.67 veces por segundo.