2016-04-24 9 views
2

Ich versuche, eine Funktion Feuer jede x Menge zu haben, ohne die Hauptschleife blockiert, ich habe einige Beispiel-Code gesehen, dies zu tun, siehe Code unten:Arduino - millis() - Wert immer Wert einer anderen Variablen

// Interval is how long we wait 
// add const if this should never change 
int interval=1000; 
// Tracks the time since last event fired 
unsigned long previousMillis=0; 


void loop() { 
    // Get snapshot of time 
    unsigned long currentMillis = millis(); 

    Serial.print("TIMING: "); 
    Serial.print(currentMillis); 
    Serial.print(" - "); 
    Serial.print(previousMillis); 
    Serial.print(" ("); 
    Serial.print((unsigned long)(currentMillis - previousMillis)); 
    Serial.print(") >= "); 
    Serial.println(interval); 

    if ((unsigned long)(currentMillis - previousMillis) >= interval) { 
     previousMillis = currentMillis; 
    } 

}

Nun geschieht folgendes:

TIMING: 3076 - 2067 (1009) >= 1000 
TIMING: 4080 - 3076 (1004) >= 1000 
TIMING: 5084 - 4080 (1004) >= 1000 
TIMING: 6087 - 5084 (1003) >= 1000 
TIMING: 7091 - 6087 (1004) >= 1000 

Warum ist die currentMillis immer so viel jede Schleife höher? Es sieht so aus, als ob es einen Zeiger oder ähnliches teilt, weil es jedes Mal den Intervallwert hinzufügt. Ich bin verwirrt!

Antwort

3

denke ich, dass der Code, den Sie uns präsentiert ein unvollständiges Bild von dem, was Sie auf dem Arduino hochgeladen, da auf meinem Gerät erhalte ich die folgende Sequenz

TIMING: 0 - 0 (0) >= 1000 
TIMING: 0 - 0 (0) >= 1000 
TIMING: 1 - 0 (1) >= 1000 
TIMING: 32 - 0 (32) >= 1000 
TIMING: 93 - 0 (93) >= 1000 
TIMING: 153 - 0 (153) >= 1000 
TIMING: 218 - 0 (218) >= 1000 
TIMING: 283 - 0 (283) >= 1000 
TIMING: 348 - 0 (348) >= 1000 
TIMING: 412 - 0 (412) >= 1000 
TIMING: 477 - 0 (477) >= 1000 
TIMING: 541 - 0 (541) >= 1000 
TIMING: 606 - 0 (606) >= 1000 
TIMING: 670 - 0 (670) >= 1000 
TIMING: 735 - 0 (735) >= 1000 
TIMING: 799 - 0 (799) >= 1000 
TIMING: 865 - 0 (865) >= 1000 
TIMING: 929 - 0 (929) >= 1000 
TIMING: 994 - 0 (994) >= 1000 
TIMING: 1058 - 0 (1058) >= 1000 
TIMING: 1127 - 1058 (69) >= 1000 
TIMING: 1198 - 1058 (140) >= 1000 
TIMING: 1271 - 1058 (213) >= 1000 
TIMING: 1344 - 1058 (286) >= 1000 

und es richtig klingt der Code gegeben du hast zur Verfügung gestellt.


Sind Sie sicher gibt es keine sleep() Anruf in Ihrem ursprünglichen Quellcode?

(vielleicht haben Sie nicht den aktualisierten Code auf dem Gerät laden?)

+0

Sie haben Recht, es gab viel mehr Code und auch ein Schlaf im Code, ich entfernte den Schlaf und jetzt ist das Problem gelöst! Ich verstehe immer noch nicht die Beziehung :) –

+0

@OlafvanderKaa Wenn Sie für * Intervall * Millisekunden schlafen, dann ist die Schleife für diese Zeit eingefroren, und das nächste Mal, wenn Sie * Millis() * - die aktuelle Uhr zurückgibt time - Sie erhalten einen Wert, der höher als der * interval * -Schwelle ist. Was ist daran unklar? Oder ich habe deine Frage nicht verstanden? –

+0

ah ja, ich verwirrte mich, wenn ich versuchte, es zur Arbeit zu bringen und tatsächlich mein Intervall auf weniger als den Schlaf gesenkt, jedenfalls Problem gelöst, danke für die Antwort! –

2

erweitern auf @ patrick-Trentin Antwort, es sieht sehr wahrscheinlich, dass der Code nicht das einzige, was Sie laufen ist Ihre Arduino. Der Code, den Sie in Ihren Skizzen sehen, ist niemals der einzige Code, den das Arduino ausführt. Es behandelt für Sie die eingehenden seriellen Daten, und wenn Sie einige andere Module (wie SPI oder Netzwerk) verwenden, hat es etwas anderen Code, der in ISP läuft, die Funktionen sind, die regelmäßig mit einem Timer ausgeführt werden.

Aber die Arduino-CPU kann Code nicht parallel ausführen. Um paralleles Verhalten nachzuahmen, stoppt es eigentlich Ihre Hauptschleife, um eine Subroutine (das ISP) zu laufen, die ein Byte liest, das durch Serial (zum Beispiel) hereinkommt, es puffern, um es Ihnen dann zur Verfügung zu stellen Serielles Objekt

Je mehr Dinge Sie in diesen Interrupt-basierten Subroutinen tun, desto seltener werden Sie Ihre Hauptschleife durchlaufen, da sie weniger häufig über den millis() Vergleich passiert.

Verwandte Themen