Verwechslung von Anzahl der Zeiten und Anzahl der Zyklen

Ich weiß, die Frage ist ziemlich einfach, aber ich bin ein Neuling und habe gerade ein 8051-Kit gekauft, um MCU selbst zu lernen. Ich arbeite an einem Beispiel, das die djnz-Anweisung verwendet, um die Blinkfrequenz unten zu erstellen.

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

Die Teile, die ich verwirrt bin: (1) Bedeutet "Anzahl von Malen" Häufigkeit? (2) Warum wird # ln 2die Ausführungszeit von djnz multipliziert mit der Frequenz von djnz verwendet? ps Ich weiß, dass die Frequenz = 1 / Zyklus ist und die Dauer eines Zyklus von einer Anweisung abhängt.

Antworten (1)

Fast, aber nicht ganz. Die Dauer eines Zyklus hängt nicht von der ausgeführten Anweisung ab. Wenn die MCU-Taktfrequenz 2 MHz beträgt, dauert ein Zyklus genau 500 ns, unabhängig davon, welche Anweisung ausgeführt wird. Wenn die Ausführung einer Anweisung 3 Zyklen dauert, dauert die Ausführung dieser Anweisung 1500 ns. Die Taktzeiten bleiben gleich.

Um Ihre konkreten Fragen zu beantworten:

(1) Bedeutet „Anzahl von Malen“ Häufigkeit?

Nein, in diesem Zusammenhang sagt "Anzahl der Male" nur aus, wie oft die djnz-Anweisung ausgeführt wurde. Die einzige Frequenz, die hier relevant ist, ist die MCU-Taktfrequenz, von der wir bereits wissen, dass sie 2 MHz beträgt.

Warum verwendet # ln 2 die Ausführungszeit von djnz multipliziert mit der Frequenz von djnz?

Es ist nicht die Frequenz von djnz. Es ist nur die Anzahl der Male, die die djnz-Anweisung ausgeführt wurde. Da wir wissen, dass der djnz-Befehl 3 Zyklen benötigt und 1000 Mal ausgeführt wurde, wissen wir dann, dass 1000 * 3 = 3000 Zeitzyklen von der MCU verbraucht wurden, die djnz-Befehle ausführt.

Der djnz ist nur ein Dekrementierer. Es nimmt einen Wert im Speicher, subtrahiert einen und betrachtet ihn dann. Wenn der neue Wert ungleich Null ist, springt er zu einer bestimmten Adresse im Code.

Wenn Sie mit C vertraut sind, wäre der entsprechende Code aus diesem Beispiel:

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

Hier wird die for-Schleife 1000 Mal ausgeführt, wobei i mit jeder Schleife dekrementiert wird (hier kommt djnz ins Spiel). Wenn es 3 Zyklen oder 1500 ns dauert, um jedes Mal i zu dekrementieren, dann dauert die gesamte for-Schleife 1500 ns * 1000 = 1,5 ms. Die LED wird umgeschaltet und die Schleife beginnt erneut. Die LED scheint also alle 1,5 ms einmal zu blinken. Wenn etwas alle 1,5 ms blinkt, blinkt es 666,67 Mal pro Sekunde.