Reaktionszeit / Signallaufzeit
Moderator: Guido Körber
Reaktionszeit / Signallaufzeit
Hallo,
ich bin neu im Forum und habe auch gleich eine Frage, was sonst ;)
Ich möchte eine kleine (Zeit) Messstecke mit Lichtschranken aufbauen, nun überlege ich mir, ob ich diese über den IO-Warrior an den USB-Port anbinde. Hierbei stellt sich die Frage, welche 'Auflösung' realisierbar ist. Wenn ich die anderen Beiträge richtig verstanden habe ist das zyklische Abfragen der einzige Weg an die Einganssignale zu kommen. Eine Benachrichtigung via Interrupt scheint es nicht zu geben? Die neue API 2.0 wird (wie ich es verstehe) hierfür Callbacks bereitstellen, welche aber wiederum von einem 'pollenden' Lese-Thread aufgerufen werden.
Mir würde eine Abfrage alle 10ms genügen (bessere wäre 1ms ;)), stellt sich noch die Frage wie die (mittlere) Laufzeit des Signals vom I/O PIN bis zum abfragbaren Wert im Programm ist (habe keine diesbezüglichen Kentnisse des USB Protokolls, ...).
Ich würde das ganze unter Linux realisieren wollen.
Genug der Fragen, ich hoffe ich habe nicht allzuviel beim suchen im Forum übersehen.
BTW: Wie ist der Stand zur neuen API (Linux)
Grüße und schon mal vielen Dank
horchi
ich bin neu im Forum und habe auch gleich eine Frage, was sonst ;)
Ich möchte eine kleine (Zeit) Messstecke mit Lichtschranken aufbauen, nun überlege ich mir, ob ich diese über den IO-Warrior an den USB-Port anbinde. Hierbei stellt sich die Frage, welche 'Auflösung' realisierbar ist. Wenn ich die anderen Beiträge richtig verstanden habe ist das zyklische Abfragen der einzige Weg an die Einganssignale zu kommen. Eine Benachrichtigung via Interrupt scheint es nicht zu geben? Die neue API 2.0 wird (wie ich es verstehe) hierfür Callbacks bereitstellen, welche aber wiederum von einem 'pollenden' Lese-Thread aufgerufen werden.
Mir würde eine Abfrage alle 10ms genügen (bessere wäre 1ms ;)), stellt sich noch die Frage wie die (mittlere) Laufzeit des Signals vom I/O PIN bis zum abfragbaren Wert im Programm ist (habe keine diesbezüglichen Kentnisse des USB Protokolls, ...).
Ich würde das ganze unter Linux realisieren wollen.
Genug der Fragen, ich hoffe ich habe nicht allzuviel beim suchen im Forum übersehen.
BTW: Wie ist der Stand zur neuen API (Linux)
Grüße und schon mal vielen Dank
horchi
Hallo horchi,
Alle Zeiten die hierbei ermittelt werden sind zu betrachten als : Irgendwann in den letzten 8ms (bei Iow24/40) ist was an den IO-Pins passiert.
Wenn das ganze unter Linux implementiert werden soll, würde ich vielleicht auf die IowKit-Lib verzichten und direkt mit den vom Kernel-Modul bereit gestellten Funktionen arbeiten, die im IOWarrior-HowTo beschrieben sind.
Eberhard
Das ist richtig. Auf der Ebene der Betriebssysteme Windows und Linux (bei MacOs weiß ich es nicht) ist ein IOWarrior wie eine Datei anzusehen, bei der neue Daten immer am Ende angefügt werden. Es gibt keine automatische Benachrichtigung für neue Daten, dass muss man selbst implementieren, indem man solange Daten einliest bis keine mehr vorhanden sind. Dann pollt man den IOWarrior periodisch und kann für neue Daten den Zeitpunkt des Eintreffens speichern. Die maximale Auflösung wäre 8ms für Iow24/Iow40 und 1 ms für den Iow56.Hierbei stellt sich die Frage, welche 'Auflösung' realisierbar ist. Wenn ich die anderen Beiträge richtig verstanden habe ist das zyklische Abfragen der einzige Weg an die Einganssignale zu kommen.
Alle Zeiten die hierbei ermittelt werden sind zu betrachten als : Irgendwann in den letzten 8ms (bei Iow24/40) ist was an den IO-Pins passiert.
Diese Laufzeiten kann man bei entsprechendem Aufbau der Meßstrecke vernachlässigen. (Man hat zwei Lichtschranken ein für den Start der Messung eine für das Ende der Messung). Bei den Lichtschranken ist allerdings zu beachten, das sie ein Signal erzeugen müssen, das länger als 8ms (Iow24) ansteht. Sonst kann der IOWarrior dieses Signal u.U. nicht erkennen.stellt sich noch die Frage wie die (mittlere) Laufzeit des Signals vom I/O PIN bis zum abfragbaren Wert im Programm ist (habe keine diesbezüglichen Kentnisse des USB Protokolls, ...).
Wenn das ganze unter Linux implementiert werden soll, würde ich vielleicht auf die IowKit-Lib verzichten und direkt mit den vom Kernel-Modul bereit gestellten Funktionen arbeiten, die im IOWarrior-HowTo beschrieben sind.
Eberhard
-
- Site Admin
- Posts: 2879
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Hi Eberhard,
danke für die genauen Daten!
Nochmals sorry der vielen dummen Fragen ich bin ganz neu in diesem Thema.
Dann werde ich mir mal den Chip bestellen, eine externe Beschaltung ist ja fast nicht nötig, sieht alles sehr entspannt aus.
Grüße Jörg
danke für die genauen Daten!
Verständnissfrage, wenn sich in einem Pollzyklus an den Pins mehrmals etwas ändert stehen entsprechend viele Daten zum abholen an? Der Warrior sendet also den Zustand der Pins immer bei Änderung und nicht einfach zyklisch?Dann pollt man den IOWarrior periodisch und kann für neue Daten den Zeitpunkt des Eintreffens speichern. Die maximale Auflösung wäre 8ms für Iow24/Iow40 und 1 ms für den Iow56.
Nochmals sorry der vielen dummen Fragen ich bin ganz neu in diesem Thema.
ok, sollte kein Problem sein da habe ich schon ein Monoflop am Ausgang.Diese Laufzeiten kann man bei entsprechendem Aufbau der Meßstrecke vernachlässigen. (Man hat zwei Lichtschranken ein für den Start der Messung eine für das Ende der Messung). Bei den Lichtschranken ist allerdings zu beachten, das sie ein Signal erzeugen müssen, das länger als 8ms (Iow24) ansteht. Sonst kann der IOWarrior dieses Signal u.U. nicht erkennen.
Dann werde ich mir mal den Chip bestellen, eine externe Beschaltung ist ja fast nicht nötig, sieht alles sehr entspannt aus.
Grüße Jörg
Genau so ist es, neue Daten werden nur dann erzeugt wenn sich an den Pins etwas geändert hat.horchi wrote:Verständnissfrage, wenn sich in einem Pollzyklus an den Pins mehrmals etwas ändert stehen entsprechend viele Daten zum abholen an? Der Warrior sendet also den Zustand der Pins immer bei Änderung und nicht einfach zyklisch?
Nein, das geht nicht. Die Datenraten sind von der Hardware bestimmt. Wenn es 1 ms sein soll, muss man den Iow56 verwenden.Wenn der Host die Anfragen macht könnte ich diesen Zyklus doch im Kernel Modul (oder was ist mit Host gemeint) auch für den IOW24 auf 1ms ändern?
Eberhard
Ok, ich glaube nun habe auch ich es verstanden:
Zusammenfassung des Ablaufs (ausgehend vom IOW24):
- für jede Änderung an den Pins (Ändeung > 1 ms) bekomme ich Daten
- diese Daten werden alle 8ms seitens des Kernel-Modul vom Warrior abgeholt/abgefragt
- ändert sich also 3 x in den 8ms etwas bekomme ich auch alle 3 Änderungen mit (nur halt bis zu 9ms verzögert)!
Dann habe ich auch schon eine Idee wie ich die Auflösung für meine Anwendung verbessere. Ich verwende einen 8bit Binärzähler an eben 8 Eingangspins, zähle damit im 1ms Takt (läuft halt nach 256 Zyklen immer über). Wenn ich nun Abfrage bekomme ich auch diesen Wert und kann so mit der Systemzeit auf den PC syncronisieren. Dan genügt es auch wenn ich z.B alle 100ms abfrage. Bei meiner Anwendung kommt es mehr auf die Auflösung Messung an, nicht ob ich diese etwas verzögert im Programm mitbekomme. So spare ich mir einen eigenen µController.
Grüße
Jörg
Zusammenfassung des Ablaufs (ausgehend vom IOW24):
- für jede Änderung an den Pins (Ändeung > 1 ms) bekomme ich Daten
- diese Daten werden alle 8ms seitens des Kernel-Modul vom Warrior abgeholt/abgefragt
- ändert sich also 3 x in den 8ms etwas bekomme ich auch alle 3 Änderungen mit (nur halt bis zu 9ms verzögert)!
Dann habe ich auch schon eine Idee wie ich die Auflösung für meine Anwendung verbessere. Ich verwende einen 8bit Binärzähler an eben 8 Eingangspins, zähle damit im 1ms Takt (läuft halt nach 256 Zyklen immer über). Wenn ich nun Abfrage bekomme ich auch diesen Wert und kann so mit der Systemzeit auf den PC syncronisieren. Dan genügt es auch wenn ich z.B alle 100ms abfrage. Bei meiner Anwendung kommt es mehr auf die Auflösung Messung an, nicht ob ich diese etwas verzögert im Programm mitbekomme. So spare ich mir einen eigenen µController.
Grüße
Jörg
Wo kommt denn diese Idee her?horchi wrote:- ändert sich also 3 x in den 8ms etwas bekomme ich auch alle 3 Änderungen mit (nur halt bis zu 9ms verzögert)!
Der IO-Warrior kann nicht beliebig viele Events zwischenspeichern, es gibt nur den Sendepuffer und den Datenpuffer. Ist der Sendepuffer nach einer Änderung noch nicht abgeholt worden, so wird bei jeder weiteren Änderung der Datenpuffer überschrieben. Also maximal zwei Ereignisse innerhalb einer Abfragephase können erkannt werden.
Viel Spaß, der Zähler wird eine Unmenge von Events erzeugen...horchi wrote:Dann habe ich auch schon eine Idee wie ich die Auflösung für meine Anwendung verbessere. Ich verwende einen 8bit Binärzähler an eben 8 Eingangspins, zähle damit im 1ms Takt (läuft halt nach 256 Zyklen immer über). Wenn ich nun Abfrage bekomme ich auch diesen Wert und kann so mit der Systemzeit auf den PC syncronisieren. Dan genügt es auch wenn ich z.B alle 100ms abfrage. Bei meiner Anwendung kommt es mehr auf die Auflösung Messung an, nicht ob ich diese etwas verzögert im Programm mitbekomme. So spare ich mir einen eigenen µController.
Sinnvoller ist es einen Zähler mit Latch zu nehmen und das Latch mit dem Ereignis zu tirggern.
Das hatte ich so verstanden, ist für meine Anwendung aber auch kein Problem. Da gibt es nur alle paar Sekunden eine Änderung (Messung) nur die soll eben recht genau sein.Wo kommt denn diese Idee her?
Der IO-Warrior kann nicht beliebig viele Events zwischenspeichern, es gibt nur den Sendepuffer und den Datenpuffer. Ist der Sendepuffer nach einer Änderung noch nicht abgeholt worden, so wird bei jeder weiteren Änderung der Datenpuffer überschrieben. Also maximal zwei Ereignisse innerhalb einer Abfragephase können erkannt werden.
so war das auch gemeint, jeden Zählerstand wollte ich nicht übertragen ;)Sinnvoller ist es einen Zähler mit Latch zu nehmen und das Latch mit dem Ereignis zu tirggern.
Jörg
Leider nicht :-(.horchi wrote:Ok, ich glaube nun habe auch ich es verstanden:
Das muss so aussehen:
Zusammenfassung des Ablaufs (ausgehend vom IOW24):
- für jede Änderung an den Pins, die für eine Zeitspanne von mehr als 8 ms ansteht, bekomme ich genau ein Datum.
- Daten werden alle 8ms seitens des Kernel-Modul vom Warrior abgeholt/abgefragt und in einem Puffer gespeichert, der maximal 16 Daten enthält.
- ändert sich also 3 x in den 8ms etwas bekomme ich auch alle 3 Änderungen mit ? Nein nur die letzte!
Eberhard
das hatte ich überlesen.... allerdings zu beachten, das sie ein Signal erzeugen müssen, das länger als 8ms (Iow24) ansteht. Sonst kann der IOWarrior dieses Signal u.U. nicht erkennen.
Ich glaube nun habe ich euch wirklich genug ausgefragt ;)
Der IOWarrior ist bereits bestellt, wenn ich's fertig habe berichte ich ob (wie) es läuft.
Danke nochmals,
Jörg
Hi,
wollte nur noch mal kurz berichen, der IC (IOWarrior24) ist am Wochenende angekommen. Nach dem Zusammenbau der Schaltung und Anschluss an den USB Port wurde er sofort erkannt und auch das zuvor installierte Modul automatisch geladen.
Ein kleine Proggi in C++ welches schon alles macht was ich brauche (nur bislang noch ohne GUI) ist fertig und funzt. An der GUI bin ich nun dran.
Die einzige wirklich nerfige Hürde war das übersetzen des iowkit wegen cmake. Auch werde ich (was ich ohnehinn vor hatte) noch vom verwenden der iokit Lib Abstand nehmen, mir gefallen u.A. die an die Windows API angelehnten Datentypen nicht besonders.
Alles in allem tolles Produkt und super leicht anzuwenden!
horchi
wollte nur noch mal kurz berichen, der IC (IOWarrior24) ist am Wochenende angekommen. Nach dem Zusammenbau der Schaltung und Anschluss an den USB Port wurde er sofort erkannt und auch das zuvor installierte Modul automatisch geladen.
Ein kleine Proggi in C++ welches schon alles macht was ich brauche (nur bislang noch ohne GUI) ist fertig und funzt. An der GUI bin ich nun dran.
Die einzige wirklich nerfige Hürde war das übersetzen des iowkit wegen cmake. Auch werde ich (was ich ohnehinn vor hatte) noch vom verwenden der iokit Lib Abstand nehmen, mir gefallen u.A. die an die Windows API angelehnten Datentypen nicht besonders.
Alles in allem tolles Produkt und super leicht anzuwenden!
horchi
Hallo,
um den Faden doch nochmals aufzunehmen, ...
Wie sicher ist der Ausgabezyklus von 8ms seitens des Betriebssystems (Linux)? Ist es möglich, dass hier bei höherer CPU Last deutliche Verzögerungen auftreten oder ist diese Abfrage an einen nicht maskierbaren Interrupt oder ähnliches gebunden?
Danke und Grüße
horchi
um den Faden doch nochmals aufzunehmen, ...
Wie sicher ist der Ausgabezyklus von 8ms seitens des Betriebssystems (Linux)? Ist es möglich, dass hier bei höherer CPU Last deutliche Verzögerungen auftreten oder ist diese Abfrage an einen nicht maskierbaren Interrupt oder ähnliches gebunden?
Danke und Grüße
horchi
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Dann müsste ich um recht genaue Werte zu erhalten eine externe Uhr mitlaufen lassen, selbst eine Genauigkeit von 10ms wäre sonst in Frage gestellt. Dann bleibt mir wohl nur das umsteigen auf einen externen µController, was den Aufwand leider deutlich in die Höhe treibt :( .Bei USB darf man sich nicht aufs Timing verlassen. Es kommt bei Linux wie bei Windows durchaus zu Verzoegerungen. Wie lange ist unvorhersehbar. Linux duerfte zwar bessere Werte haben, aber das Prinzip ist das gleiche.
Schade, die Schaltung mit dem IO Warrior war so schön einfach.
horchi