Hallo zusammen, ich möchte einen Zustandswechsel eines Digitalausgangs von einem Mikrocontroller mit möglichst geringer Latenz und Jitter auf meinem PC verarbeiten können. Der Mikrocontroller wird in meinem Aufbau primär dafür genutzt, um eine (Zeilen-)Kamera zu triggern und den dafür notwendigen Zeilentakt von 40 kHz zu generieren und an die Kamera über einen Digitalausgang zu schicken. Die Zeilen werden im PC als Frames mit jeweils 32 Zeilen empfangen. Ich möchte nun zu einem späteren/beliebigen Zeitpunkt in Software und unabhängig vom Bildeinzug, die gerade aktuell vom Mikrocontroller getriggerte Zeilennummer erfragen können. Wichtig ist hierbei, dass die Abfrage des Zeilennummer wenig CPU Zeit kostet, d.h. kontinuierliches Polling auf der CPU kann ich mir nicht leisten. Da ich leider kein RTOS verwenden kann (wegen spezieller Treiber), ist mir ein Polling mithilfe eines (kurzen <= 1ms) Softwaretimers ohnehin "suspekt". Die Frage ist, wie ich mit möglichst geringer Latenz/Jitter, aber gleichzeitig niedriger Rechenauslastung auf der CPU an den gewünschten Zeilenzähler komme. Für den Zeilenzähler habe ich 64-Bit angedacht, so dass ich nicht nicht zur Laufzeit mit Überläufen beschäftigen muss. D.h. rechnerisch muss ich 320 Kbit/s vom Mikrocontroller zum PC bei 40 kHz übertragen. Gibt es hierfür eine einfache und robuste Schnittstelle, zwischen Mikrocontroller und PC, die ihr empfehlen könnt? Für die Verbindung zwischen Mikrocontroller und PC habe ich derzeit nur UART per RS232 verfügbar ;) Ich hatte angedacht USB3 zu nutzen, da bei anständigen Treibern die Latenz auf USB3 gut sein soll: https://stackoverflow.com/questions/13831008/what-is-the-minimum-latency-of-usb-3-0 https://www.cypress.com/documentation/development-kitsboards/cyusb3kit-003-ez-usb-fx3-superspeed-explorer-kit Die Frage ist, wie schnell bei einem Zustandswechsel auf dem Eingang die Software per Interrupt geweckt werden kann und in welchen Abständen. Ich schätze mal, dass ich 25 us hiermit nicht hinbekomme, weiß es aber nicht wirklich. Mein Ziel wäre es im Schnitt alle 250 us einen Wert für den Zeilenzähler zu bekommen, was ich natürlich in einem Dauertest messen werde. Findet ihr den Ansatz über USB3 sinnvoll oder könnt ihr eine andere Schnittstelle empfehlen? Viele Grüße Timo
:
Verschoben durch Moderator
Timo schrieb: > auf meinem PC verarbeiten Welches Betriebssystem mit welcher Echtzeitextension? > Mein Ziel wäre es im Schnitt alle 250 us einen Wert für den Zeilenzähler > zu bekommen Und wie lange darf da die längste Pause sein, weil Windows wieder mal irgendwas unheimlich Wichtiges zu erledigen hat oder der USB wegen einer EMV Störung grad wieder mal rumzickt? Sieh dir an, wie andere Geräte funktionieren, die in diesen Zeitbereichen unterwegs sind: die haben eigene "Intelligenz", die Daten aufbereitet, mit Zeitstempeln versieht und dann bei nächster Gelegenheit (was bei einem "normalen" Windows schon mal ein paar ms später sein kann) zur Verarbeitung zum PC schickt. Timo schrieb: > Die Frage ist, wie schnell bei einem Zustandswechsel auf dem Eingang die > Software per Interrupt geweckt werden kann und in welchen Abständen. Irgendwie stellst du dir das ein wenig abstrakt vor. Irgendein Interrupt ist schon ewige Zeiten Geschichte, bis letztlich dann der Thread/Task in deiner Software angetriggert wird. Du musst dir diesen Verarbeitungspfad ausdrücklich zu Gemüte führen.
Timo schrieb: > Findet ihr den Ansatz über USB3 sinnvoll oder könnt ihr eine andere > Schnittstelle empfehlen? Es gibt noch Mainboards mit einem COM-Port-Header.
Timo schrieb: > Findet ihr den Ansatz über USB3 sinnvoll oder könnt ihr eine andere > Schnittstelle empfehlen? Solange du Standard-Windows oder Linux benutzt ist die Hardware weitgehend egal, die bestimmt nicht die Antwortzeiten. Georg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.