Ungenaue Zeitstempel

Habe ich gemacht. Millis werden in 10ms Intervallen hochgezählt. Mir ging es aber eher darum das ganze durch die Zeitstempel zu verifizieren.

Laut meinem jetzigen Stand packt das wohl Windows und die IDE nicht.

Heißt ich werde nun 1 Minute stoppen und in dieser Minute müssten die Millis von 0 auf 1000ms gezählt haben.

Dein Zeitstempel sind die millis(). Das Zeit-Gedöns von der IDE ist nur eine ungefähre Hilfsfunktion.

Gruß Tommy

1 Like

Wohl eher auf 60000.
Grüße Uwe

1 Like

Windows ist ein Multitaskingbetriebssystem und kein Real Time Betriebssystem.
Grüße Uwe

2 Likes

Ok. Morgen hab ich Chance irgendwas auch mit Hardware zu bauen.
Ich hab schon ne Idee...

1 Like

Sorry waren meine Finger schneller als mein Gehirn:D

Werde mich mal nochmal mit Windows als System und Echtzeitsystemen beschäftigen.

Vielen Dank nochmal.

Das Problem entsteht auch, wenn du schneller sendest als die serielle Schnittstelle kann.
Wenn die Daten mehrerer Zeilen im Arduino-Ausgabepuffer sind, kommen sie "gleichzeitig" im PC an, aus Sicht des PC zumindest.

1 Like

Hallo,
es ist doch ein ESP , dann nutze doch NTP Zeit , die löst eine Sekunde auf. Jetzt musst Du mittels millis() doch nur die Zeit dazwischen messen. Den Wert hängst Du an den Zeitstempel der NTP Zeit mit dran und versendest Ihn zusammen mit den Messdaten.
Heinz

1 Like

So - nu hab ich keinen ESP. Damit ist natürlich schlecht.
Aber wenn Du Deinen Sketch kennst, dann kommt sowas raus um die Laufzeiten zu ermitteln:

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>


/*SSID and Password for Connection*/
const char *ssid = "xxxxxx";
const char *password = "xxxx";

IPAddress local_ip(192, 168, 11, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);


uint8_t data = 0;
uint8_t sendtest[] = {1, 2, 3, 4};

WiFiServer server(1045);

Adafruit_BNO055 IMU = Adafruit_BNO055(-1, 0x28);

//Timer variables
volatile unsigned long uc1mscount = 0;
//bool uc10msFlag;
volatile bool uc10msFlag = 1;


void setup()
{
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  WiFi.softAP(ssid, password);
  Serial.begin(115200);
  Serial.println();
  Serial.print("IP Adresse: "); Serial.println(WiFi.softAPIP());
  Serial.println("Wifi connected");
  /*WiFi.softAPConfig(local_ip,gateway, subnet);*/
  delay(100);
  server.begin();
  Serial.println("Server started");
  IMU.begin();
  //Timer interrupt
  //noInterrupts();
  timer0_isr_init();
  timer0_attachInterrupt(ISR);
  timer0_write(ESP.getCycleCount() + 80000L);
  interrupts();
}

void loop()
{
  const unsigned int maxzaehler = 25;
  static unsigned int tikzaehler = 0;
  static unsigned long zeit[maxzaehler] = {0};
  // myTimer();
  if (uc10msFlag == 1)
  {
    zeit[tikzaehler] = millis();
    uc10msFlag = 0;            // setze Flag zurück
    tikzaehler++;              // zaehle Umlauf
    if (tikzaehler >= maxzaehler)  // Speicher voll
    {
      for (unsigned int i = 0; i < maxzaehler; i++)
      {
        if (i > 0)
        {
          Serial.println(zeit[tikzaehler] - zeit[tikzaehler - 1]); // gebe Zeiten aus
        }
        while (1); // bleibe stehen
      }
    }
    WiFiClient client = server.available();
    if (client)
    {
      if (client.connected() && client.available() > 0)
      {
        //Serial.println("Client avaialable");
        client.write(sendtest, sizeof(sendtest));
      }
    }
    imu::Vector<3> acc = IMU.getVector(Adafruit_BNO055::VECTOR_ACCELEROMETER);
    Serial.println(acc.x());
    /*Serial.print(",");
      Serial.print(acc.y());
      Serial.print(",");
      Serial.println(acc.z());
    */
  }
}
void ISR(void)
{
  timer0_write(ESP.getCycleCount() + 80000L);
  uc1mscount++;
  if (uc1mscount >= 10)
  {
    uc1mscount = 0;
    uc10msFlag = 1;
  }
}

Jetzt sollte was vernünftiges ausgegeben.

1 Like

Danke. Klingt eigentlich sehr gut aber leider wird die Anwendung nur Intranet haben. Das heißt PC wird direkt mit dem ESP (Server) verbunden und es ist kein Router mit Internet dazwischen. Wenn ich das richtig verstanden habe brauche ich aber aufjedenfall Internet damit der Zeitserver für NTP abgefragt werden kann.

Vielen Dank werde ich gleich mal ausprobieren!

Nein.
Jeder(!) Rechner im Netzwerk kann Zeitserver sein.
Unabhängig vom Betriebssystem.
In Windows gibt es dazu einen RegistryKey.

Du brauchst nur einen Bezugspunkt.
Wenn der von Dir ausgewählte Zeitserver nicht syncron mit einer externen Quelle läuft, ist das unproblematisch.
Auswerteeinheit und Erfassungseinheit müssen syncron sein.
Beide brauchen EINE Zeitbasis.
Nicht mehr. Und nicht weniger.

Habe in diesem Thread extrem viel gelernt.

Perfekt dann werde ich mich mal dahingehen bezüglich dem RegistryKey informieren.

Zu deinem Code: Ich glaube der ESP startet ganze Zeit neu bzw stürzt ab.

Blockzitat
Soft WDT reset
22:19:53.759 ->
22:19:53.759 -> >>>stack>>>
22:19:53.759 ->
22:19:53.759 -> ctx: cont
22:19:53.759 -> sp: 3ffffdb0 end: 3fffffc0 offset: 01a0
22:19:53.759 -> 3fffff50: 3fffdad0 00000000 3ffe85c8 402011f3
22:19:53.759 -> 3fffff60: 007a1200 56e8d059 00001300 402029d6
22:19:53.759 -> 3fffff70: 00000000 00000000 00000000 40201154
22:19:53.759 -> 3fffff80: 00000000 00000000 00000001 40100168
22:19:53.759 -> 3fffff90: 3fffdad0 00000000 3ffee780 40100189
22:19:53.806 -> 3fffffa0: feefeffe 00000000 3ffee780 402046d4
22:19:53.806 -> 3fffffb0: feefeffe feefeffe 3ffe85f0 40100eb1
22:19:53.806 -> <<<stack<<<

Hm...
Tja, das ist es, was ich meinte. Ich habe nichts, was sich testen lässt. Der Code läuft runtergekürzt auf einem Arduino.

Wichtig:

Herkunft:

Vermutlich wird es da einen Anstoss geben, wie das zu lösen sein wird.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.