Confusión de la cantidad de veces y la cantidad de ciclos

2

Sé que la pregunta es bastante simple, pero soy un novato y acabo de comprar un kit 8051 para aprender MCU por mi cuenta. Estoy trabajando en un ejemplo que utiliza 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 estoy confundido: (1) ¿El número de veces significa frecuencia? (2) ¿Por qué # ln 2 usa el tiempo de ejecución de djnz multiplicado por la frecuencia de djnz? PD. Sé que la frecuencia = 1 / ciclo, y la duración de un ciclo depende de una instrucción.

    
pregunta LED Fantom

1 respuesta

3

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.

    
respondido por el Dan Laks

Lea otras preguntas en las etiquetas