Forum: Mikrocontroller und Digitale Elektronik Echtzeitübertragung in USB


von Martin Kerner (Gast)


Lesenswert?

Hallo,

für ein Elektronikprojekt muß ich eine Schaltung per USB
an einen Windows-PC anbinden. Der PC sendet dazu ca. 20kByte Daten
pro Sekunde an die Schaltung, wobei eine wichtige Bedingung ist, daß
die Daten in Echtzeit übertragen werden. Während der gesamten
Übertragung (kann bis zu 30min dauern) muß die Echtzeitbedingung
eingehalten werden.

Leider habe ich von Windows-Programmierung überhaupt keine Ahnung, hab
früher unter Dos in Pascal programmiert, da war Echtzeit kein Problem.
In der Zeitschrift c't steht, daß der USB-Modus "Full-Speed
Interrupt"
für zeitkritische Anwendungen geeignet wäre.

Daher meine Frage an Euch: Kann man in diesem Übertragungsmodus
wirklich
garantieren, daß z.B. jede Millisekunde ein Datenpaket ankommt?
Was wäre, wenn der PC-Benutzer zwischenzeitlich ein anderes Programm
ausführt, das die volle Rechenleistung erfordert oder ein Programm im
Hintergrund plötzlich auf die Festplatte zugreift o.ä.?

Ach ja, falls möglich möchte ich einen gewöhnlichen Mikrocontroller
mit USB einsetzen, z.B. den Cypress EZ.

Gruß und Danke, Martin.

von Benedikt (Gast)


Lesenswert?

Das kannst du so vergessen. Die Zugriffszeiten von Festplatten sind
schon höher. Du müsstet die Daten erst in den Arbeitsspeicher laden
usw.
Zusätzlich musst du für dein Programm höchte Priorität setzen, wenn du
das nicht irgendwie per Hardwarepuffer im Hintergrund hinbekommst.

Ob USB in Echtzeit überträgt, bezweifle ich auch.

von Stefan Kleinwort (Gast)


Lesenswert?

Hallo,

>für ein Elektronikprojekt muß ich eine Schaltung per USB
>an einen Windows-PC anbinden. Der PC sendet dazu ca. 20kByte Daten
>pro Sekunde an die Schaltung, wobei eine wichtige Bedingung ist, daß
>die Daten in Echtzeit übertragen werden. Während der gesamten
>Übertragung (kann bis zu 30min dauern) muß die Echtzeitbedingung
>eingehalten werden.

Was bedeutet für Dich genau "Echtzeit"? Wieviel zeitlicher Versatz
ist konkret tolerabel?

>Leider habe ich von Windows-Programmierung überhaupt keine Ahnung,
>hab früher unter Dos in Pascal programmiert, da war Echtzeit kein
>Problem. In der Zeitschrift c't steht, daß der USB-Modus
"Full-Speed
>Interrupt" für zeitkritische Anwendungen geeignet wäre.
>
>Daher meine Frage an Euch: Kann man in diesem Übertragungsmodus
>wirklich
>garantieren, daß z.B. jede Millisekunde ein Datenpaket ankommt?

Von der USB-Seite her schon. Es eignen sich entweder Interrupt (mit
Fehlerkorrektur, max. 64 Bytes pro 1ms-Frame) oder Isochron-Modus (ohne
Fehlerkorr., max. 1024 Bytes pro 1ms-Frame).

>Was wäre, wenn der PC-Benutzer zwischenzeitlich ein anderes Programm
>ausführt, das die volle Rechenleistung erfordert oder ein Programm im
>Hintergrund plötzlich auf die Festplatte zugreift o.ä.?

Das ist eine ganz andere Frage, die die USB-Übertragung im Prinzip
nicht tangiert. Prinzipiell ist es bei Windows ja möglich, sein eigenes
Programm in den Vordergrund zu drängeln. Dazu solltest Du aber besser
noch andere fragen.

Das Hauptproblem bei USB liegt auf der PC-Treiber-Seite. Wenn Du keine
Verwendung für mehrere USB-Pipes (im Prinzip parallele
Übertragungswege) hast, dann würde ich an Deiner Stelle die FTDI-Chips
noch genauer anschauen. Da sind virtuelle COM-Port-Treiber vorhanden
(Geschwindigkeit kann hier bis ca. 1Mbaud gehen) oder auch Libs für
Delphi und C.

Stefan

von Dominik (Gast)


Lesenswert?

Ich kann dir den USB - Portbaustein von Cypress empfehlen den man fertig
programmiert über www.modul-bus.de beziehen kann. Ich arbeite seit
kurzem auch damit und programmiere mit Delphi.

von Martin Kerner (Gast)


Lesenswert?

Hallo,

erstmal Danke für die Antworten.

Noch ein paar Erläuterungen zu meiner Frage:

Der Mikrocontroller gibt timergesteuert jede
Millisekunde die empfangenen Daten an die Schaltung weiter. Es
spielt also keine Rolle, wenn der PC die Datenpakete einmal
nach 0,5ms und dann nach 1,5ms abschickt. Die Datenpakete müssen
nur durchschnittlich alle 1 Millisekunde am Mikrocontroller eintreffen.
Es darf eben nicht passieren, daß plötzlich
20ms lang keine Pakete eintreffen.

Kann ich ein Programm so schreiben, daß es in dem Moment,
in dem die Datenübertragung startet, höchste Priorität beansprucht,
und alle anderen Programme ausbremst? Das wäre natürlich super...

Theoretisch ist es natürlich möglich, auf Seite des Mikrocontrollers
einen Buffer (Ram) einzusetzen, der die Daten zwischenspeichert,
aber das ist halt aufwendig und das möchte ich nur im Notfall machen.

Gruß, Martin.

von Werner (Gast)


Lesenswert?

Echtzeit sagt nichts über die benötigte Zeit aus. Es sagt nur aus, das
maximal in einer definierten Zeit auf jedes Ereignis reagiert wird.
Wenn die Anforderung 1ms ist, so halte ich das ganze für sehr eng.
Echtzeit kann aber auch bedeuten, das jedes Ereignis innerhalb 1s
abgearbeitet wird. Das ist dann denke ich möglich

Werner

von Fiffi (Gast)


Lesenswert?

Hallo Martin,

>Kann ich ein Programm so schreiben, daß es in dem Moment,
>in dem die Datenübertragung startet, höchste Priorität beansprucht,
>und alle anderen Programme ausbremst? Das wäre natürlich super...

Bei zeitkritischen Dingen habe Ich bisher nur schlechte Erfahrungen mit
Windows gemacht.

Unter Windows gibt es verschiedene "Programmarten":
- normale Windows Programme
- Service
- Kernel Treiber

Dein zeitkritischer Programmteil müsste ein Service oder Kernel Treiber
sein.

Einen Kernel-Treiber zu schreiben ist nicht trivial!

Um einen Kernel-Treiber zu debuggen, brauchst du einen zweiten PC auf
dem einen spezielle Windows Version läuft (eine Debug Version, sie sind
u.a. im MSDN Abo enthalten). Desweiteren muss dein Entwicklungsrechner
mit dem Debug-Rechner über eine parallele Schnittstelle verbunden
sein.

(Ich habe dies nicht ausprobiert, da es mir zu aufwändig ist ...)

Wenn es um eine professionelle Lösung geht, schau dir mal QNX
( www.qnx.com ) an. Es ist ein Echtzeit-UNIX. Du kannst dir auch eine
Test-Version bestellen, oder eine vollfunktionsfähige Version für den
nicht kommerzielle Gebrauch herunterladen.


Gruß

Fiffi

von Benedikt (Gast)


Lesenswert?

Unter Windows muss das gehen.

Es gibt z.B.IR Fernbedienungs Empfänger für den COM Port. Da muss auch
einpaar tausendmal pro Sekunde der Zustand abgefragt werden.

von crazy horse (Gast)


Lesenswert?

Echtzeit kontra Windows: da habe ich auch nur schlechte Erfahrungen
gemacht, das wird ein Riesenaufwand mit ungewissem Ausgang.
Ich würde auf jeden Fall direkt auf ein Design mit ausreichend grossem
Zwischenspeicher setzen, mit 64kb bist du doch schon gut dabei. Das ist
auf jeden Fall ein funktionierender Weg, und so gross ist der AUfwand
doch wirklich nicht, einen RAM an einen Controller zu pappen.

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
Noch kein Account? Hier anmelden.