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