Berechnungsdauer messen

Da ich noch nicht lange mit dem Arduino arbeite, bräuchte ich mal einen kleinen Tipp, der mir hilft die Berechnungsdauer des Arduinos misst.

Da ich mittels eines Beschleunigungssensors daten auslese und die in eine Geschwindigkeit umrechnen will benötige ich die "auslesezeit" die der Arduino benötigt.

Ist hier der Befehl millis() der richtige ,oder gibt es bessere Ansätze um zu einem guten Ergebnis zu kommen?

Wenn möglich wäre ein kleines Beispiel wo sich der Befehl drinnen befindet sehr Hilfreich

Mfg

Ich denke da bist du mit den micros() besser dran. Millis dürften da bischen knapp sein.

Franz

millis() oder micros() abspeichen vor dem Funktionsaufruf und dann danach Differenz bilden.

unsigned long TIMESTAMP = millis(); // oder für schnelle Sachen auch micros();
BeschleunigungssensorAuslesen();
unsigned long Differenz = millis() - TIMESTAMP;
Serial.print(Differenz);

Grüße Uwe

... und hiermit vergleichen:

...
  unsigned long TIMESTAMP = micros(); // bei schnellen Sachen micros();
  DummyFunktion();
  unsigned long Differenz = micros() - TIMESTAMP;
  Serial.print(Differenz);
...
}
void DummyFunktion() { }

(kann ab und zu auch mal eine 4 ergeben)

Wenn die Werte zu klein sind, um wirklich sinnvolle Aussagen zu treffen, kann man die Funktion auch 1000 Mal aufrufen und die Gesamtzeit messen.

Gruß Tommy

Hallo,

wenn ich einzelne Codeabschnitte vermesse, dann schalte ich vorher einen Pin ein und danach aus. Das schaue ich mir entweder mit dem Oszi oder Datalogger an. Um den Einfluss des Pin schaltens gering zu halten nehme ich die Standard Makros sbi / cbi.

Hallo,
vielleicht hilft es Dir ja...

//****************************************     Laufzeit feststellen     ********************************
/**************************************************
** GuntherB                                      **
** Funktion um die Loopaufrufzeiten zu ermitteln **
** wird in der Loop aufgerufen                   **
** benötigt ca (AL * 4 + 10 )Byte RAM            **
***************************************************/
void LoopTiming(){
  const unsigned int AL = 100; // Arraylänge
  static unsigned long Timestamp[AL];
  static unsigned int Nr = 0, Min=0xFFFF, Max, Avg = 0;
  Timestamp[Nr++]=millis();
  if (Nr >= AL){  // Array voll, Daten auswerten
     for (unsigned int i = 1; i<AL; i++){
      Max = max(Max, Timestamp[i]-Timestamp[i-1]);
      Min = min(Min, Timestamp[i]-Timestamp[i-1]);
      Avg += Timestamp[i]-Timestamp[i-1];
    }
    Avg = Avg / (AL-1);
    Serial.println(F("Loop wird aufgerufen "));
    Serial.print(F("Durchschnitt "));Serial.print(Avg);Serial.println("ms");
    Serial.print(F("minimal      "));Serial.print(Min);Serial.println("ms");
    Serial.print(F("maximal      "));Serial.print(Max);Serial.println("ms");
    Min = 0xFFFF;
    Max = 0;
    Avg = 0;
    Nr = 0;
  }
}
//****************************************     Laufzeit feststellen Ende    ********************************

Gruß und Spaß
Andreas