jurs:
Was der "richtige" Wert ist, kannst Du ja bei Dir mal auskalibrieren:
Miß einmal aus, wie lange 60 NOP Befehle dauern (Soll: 3,75 µs).
Und vergleiche mal, wie lange 61 NOP Befehle brauchen (Soll: 3,81 µs).
Hallo jurs,
also vorab, ich habe das Oszi erst gestern bekommen, deswegen bin ich noch nicht besonders versiert in der Bedienung. Ich habe aber jetzt - nach Handbuch-Studium und Probieren - mal den Messaufbau so abgewandelt:
Die loop()-Schleife sieht so aus:
void loop() {
while(true) {
cli();
digitalWrite(13,HIGH);
// Hier der/die zu messende/n Anweisungen
digitalWrite(13,LOW);
sei();
}
}
Getriggert wird vom steigenden Pegel an Pin 13. Gemessen wird über eine Messeinstellung namens "Pulsbreite+". Diese misst die Zeit von der steigenden bis zur fallenden Flanke des ersten Signals nach der Triggerung.
Da mein Uno mittlerweile anderweitig verkabelt ist, habe ich mit einem ATMega168 mit 16MHz (mit Quarz) experimentiert. Die Taktfrequenz habe ich gemessen: 15.9997MHz. Das entspricht einer Taktdauer von rd. 62,50117189ns/Takt. Da das SDS1052DL einen eingebauten Hardware-Frequenzzähler hat, denke ich, die Messung der Taktfrequenz ist ziemlich genau.
An die markierte Stelle im Sketch habe ich die zu messende Anweisung eingefügt. Leer, also ohne eine "Mess-Anweisung" benötigt der Sketch für einen Impuls 3,94µs = rd. 61 Takte.
Pin 7 High -> insg. 7,75µs - Leerlauf 3,94µs = 3,81µs = rd. 61 Takte
Pin 7 Low -> insg. 7,88µs - Leerlauf 3,94µs = 3,94µs = rd. 63 Takte
Pin 6 High -> insg. 8,56µs - Leerlauf 3,94µs = 4,62µs = rd. 74 Takte
Pin 6 Low -> insg. 8,69µs - Leerlauf 3,94µs = 4,75µs = rd. 76 Takte
Für 60 NOPs messe ich insg. 7.69µs - Leerlauf 3,94µs = 3,75µs = rd. 60 Takte
Für 61 NOPs 7,75µs - Leerlauf 3,94µs = 3,81µs = rd. 61 Takte
Da die Messung der NOPs in Verbindung mit den 15,9997MHz nahezu 100%ig passt, denke ich, dass auch die anderen Messungen rel. genau sind.
jurs:
Wenn Du mit Deinem Oszi mißt, dann mißt Du als Ausführungsdauer bei 10000 Messungen geschätzte 9950 mal 3,78µs und geschätzte 50 mal ca. 7,78µs.
Die obige Schleife leer, ohne das cli() und sei(), also mit eingeschalteten Interrupts habe ich mal durch die Pass/Fail-Messung überprüfen lassen. Hierbei wird getriggert und das gemessene Signal wird gegen ein vorgegebenes Signal verglichen. In diesem Fall sollte ein Fehler gezählt werden, wenn das Signal länger als 3,94µs +/- 2.5% dauert, wenn also ein Interrupt auftritt, der das Signal verlängert.
Bei 10.000 Durchläufen wurden 91 Interrupts gefunden. Allerdings ist dazu zu sagen, dass die Schleife mehr als 10.000 Mal durchlaufen wurde, da das Oszi nach dem Triggern misst, vergleicht, zählt und dann erst wieder bereit für den nächsten Trigger ist. Es finden also Schleifendurchläufe statt, die das Oszi nicht sieht, weil es mit Vergleichen beschäftigt ist. Außerdem weiß ich nicht, wie sicher das Siglent die Abweichungen findet. Aus dem Internet habe ich erlesen, dass es Oszilloskope gibt, die über 8 Stunden brauchen um eine einmal pro Sekunde stattfindende Abweichung von 1ms zu finden.
Der Interrupt verlängert das Schreiben von Pin 6 Low von 8,69µs gesamt auf 14,81µs.
Gruß,
Ralf