INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
unverständliches Zeitverhalten
28.08.2019, 16:43 (Dieser Beitrag wurde zuletzt bearbeitet: 28.08.2019 17:35 von GuaAck.)
Beitrag #1
unverständliches Zeitverhalten
Hallo,
ich möchte 3 ADC-Kanäle möglichst parallel einlesen. Alle 100 us sollen die 3 Kanäle neu eingelesen werden. Für einen Einlesezyklus von 1000 Punkten mache ich den Interrupt zu. Die Zeit stelle ich mit eine Warteschleife ein, wobei ich zmax durch Versuche so einstelle, dass sich die 100 us ergeben. (Das z2 muss irgendwo gebraucht werden, sonst optimiert der Compiler die Schleife weg.)

Für den ersten Test gebe ich auf LEDSampeltakt ein Signal aus, das ich mit dem Oszi ansehen kann. 1000*100us=100 ms, alle 100 ms muss das Signal wechseln. Geht mit dem eingestellten Wert zmax.

Um es genauer zu justieren, nutze ich das "for Lauf=..." und lasse die Schleife z.B. 2000 mal laufen, die Zeit dafür messe ich mit einer RTC. 2000*100 ms=200s, geht.

Nun das Phänomen: Wenn ich die Blinkausgabe "//<<<<<" streiche, dann hätte ich eher eine geringfügig kürze Zeit erwartet. Tatsächlich braucht die Schleife dann aber 329 s statt 200 s. Wie kann das sein?

Hat jemand eine Idee?

Viele Grüße
GuaAck

Nachtrag:
statt digitalWrite setze ich den Ausgang mit einem direkten Registerzugriff, ergibt aber den gleichen Effekt.
Code:
// Arduino DUE
  for (Lauf = 0; Lauf < Laufmax; Lauf++) {
   digitalWrite(LEDSampletakt, Lampe); //<<<<<
   Lampe=!Lampe; //<<<<<
    for (Pufferanz = 0; Pufferanz <Puffermax; Pufferanz++) {
      //3 ADC-Kanäle mit direktem Registerzugriff einlesen,
      // Ergebnisse in Puffer schreiben
      ...
      // Warteschleife
      for (z1 = 0; z1 < zmax; z1++) {
        z2 = z2 + z1;
      }
    }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.08.2019, 16:47
Beitrag #2
RE: unverständliches Zeitverhalten
Warum machst Du 200s Wartezeit nicht mit millis?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.08.2019, 17:33
Beitrag #3
RE: unverständliches Zeitverhalten
Hallo Tommy,

die Warteschleife soll ja nur die Zeit zum Ablauf der 100 us abwarten.

Gruß
GuaAck

(28.08.2019 16:47)Tommy56 schrieb:  Warum machst Du 200s Wartezeit nicht mit millis?

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.08.2019, 17:58
Beitrag #4
RE: unverständliches Zeitverhalten
Dann war das hier
Zitat:Tatsächlich braucht die Schleife dann aber 329 s statt 200 s.
aber ziemlich irreführend. 200 ms sollten aber auch mit millis machbar sein, ansonsten wohl mit Timern.
Bei den Schleifen mekst Du ja, dass da viel vom Kompiler und seiner Optimierung abhängt und das damit nicht stabil über alles wird.

Wenn Du die Ursache genauer wissen willst, wirst Du wohl die beiden Fälle anhand des Maschinencodes (evtl. Disassembler) vergleichen müssen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.08.2019, 08:06
Beitrag #5
RE: unverständliches Zeitverhalten
Zitat:Die Zeit stelle ich mit eine Warteschleife ein, wobei ich zmax durch Versuche so einstelle, dass sich die 100 us ergeben. (Das z2 muss irgendwo gebraucht werden, sonst optimiert der Compiler die Schleife weg.)

Wäre das nicht mal ein Einsatzfall für
Code:
_delay_us(n)

https://www.microchip.com/webdoc/AVRLibc...c0c4f.html
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste