Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Takt erstellen (kleine Periodendauer)
MasterOfDesaster
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Erlangen

Themenstarter:

Takt erstellen (kleine Periodendauer)

beantworten | zitieren | melden

Hallo,

ich habe ein Problem: Und zwar soll ich einen Takt an der Seriellen Schnittstelle erzeugen. Und zwar an den Pins RTS und DTR. Dass heisst da geht nichts über die Baudrate (oder??, wenn ja wäre es gelöst). Das Problem ist jetzt einfach die Zeit, und zwar soll ich Periodendauern zwischen 0.5ms und 1ms erstellen.
Meine Frage wie bekomme ich das hin. Also, so das es auch auf jeden Rechner so ist, also nicht einfach ne for-schleife so das es zufällig grade bei mir passt.

Meine bisherigen gedanken:
  1. erstmal mit Thread.Sleep(new Timspan(500000)); //für 0.5 ms // da lag ich um den faktor 100 daneben
  2. dann habe ich aktives warten probiert:
    DateTime start = DateTime.Now;
    //ein tick entspricht 100 Nanosekunden
    while(((DateTime.Now - start).Ticks/10) < microSeconds)
    ;
    Das hat die Periodendauer ungefähr halbiert (zu oben)
  3. Ein Echtzeit-OS muss her!? Windows CE? Ein eigenes (habe ich mal or ner Weile angefangen, wäre echtzeitfähig da es nichts macht außer das




Die ersten beiden Lösugen waren nur mal so Versuche um eben abzuchecken wieviel fehlt. Dabei war mir klar das es nicht klappt.
Achso und der Thread in dem das ist hat schon die höchste Priorität.
Das mit WinCE wäre eine Idee, aber auch net so das wahre.
Ds mit dem eigenen OS. Ist nur so daher gesponnen, da derjenige für den das ist wohl kaum ein OS installieren möchte was ncihts kann außer ein bissl was senden.

Gibt es noch eine andere Möglichkeit als ein anderes OS, vlt. mit einem Treiber???

mfg
private Nachricht | Beiträge des Benutzers
S.H.-Teichhof
myCSharp.de - Member

Avatar #avatar-2460.jpg


Dabei seit:
Beiträge: 1.549
Herkunft: Sindringen

beantworten | zitieren | melden

wie wäre ein Timer?
Wir Arbeiten eigendlich nicht wir nehmen nur das geld
private Nachricht | Beiträge des Benutzers
MasterOfDesaster
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

Das habe ich in der Zwischenzeit auch probiert.
Allerdings nicht mit dem normalen Timer sondern mit dem HighPerfomanceCouner
Ich muss noch messen, deswegen kann ich noch kein Ergebniss sagen.

Der normale Timer ist (angeblich) zu ungenau, wegen der Auflösung.
private Nachricht | Beiträge des Benutzers
MasterOfDesaster
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

Es scheint zu funktionieren.
Mal abwarten wie es sich in den nächsten Tests schlägt

mfg MasterOfDesaster
private Nachricht | Beiträge des Benutzers
Phaiax
myCSharp.de - Member



Dabei seit:
Beiträge: 56

beantworten | zitieren | melden

Falls der PC nur für diese Aufgabe zuständig ist, kann man doch auch Echtzeit bei der CPU-Priorität im Taskmanager einstellen, oder?
private Nachricht | Beiträge des Benutzers
MasterOfDesaster
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

Ich bin mal davon ausgegangen, das das ThreadPriority.Highest entspricht.
Von daher habe ich das schon.
Aber echte Echtzeit wird man damit definitiv nicht erreichen
private Nachricht | Beiträge des Benutzers
Traumzauberbaum
myCSharp.de - Member



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

Naja ne gewissen Anfälligkeit ist auf nem Multi Tasking Betriebssystem nicht auszuschalten. Wenns blöd läuft und der PC entsprechend ausgelastet ist.
e.f.q.

Aus Falschem folgt Beliebiges
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1.439
Herkunft: Linz, Austria

beantworten | zitieren | melden

Noch etwas bezüglich QueryPerformaceCounter:
Beware of QueryPerformanceCounter()
private Nachricht | Beiträge des Benutzers
MasterOfDesaster
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von Traumzauberbaum
Naja ne gewissen Anfälligkeit ist auf nem Multi Tasking Betriebssystem nicht auszuschalten. Wenns blöd läuft und der PC entsprechend ausgelastet ist.

Nicht unbedingt. Das nicht alles superschnell, und innerhalb einer gewissen Zeit fertig ist ist klar. Aber die Dinge die eilig sind müssen halt rechtzeitig fertig sein. Bei entsprechendem Scheduling, prioritätsgesteuert und unterbrechend z.B., klappt es, zumindest mit dem höherprioren Threads. Bei Windows hast du meine volle Zustimmung, acuh bei CE. Linux kann glaube ich auch recht gut echtzeitfähig gemacht werden.
private Nachricht | Beiträge des Benutzers
Traumzauberbaum
myCSharp.de - Member



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

Das geht ja schon rein theoretisch kaum.

Stell dir vor du hast ein Programm, dass alle 1 ms drankommen soll. Das Programm muss soll alle 1 ms nen Takt geben, d.h. es muss auch innerhalb der 1 ms komplett fertig werden. Die benötigte Rechenzeit für einen Takt sei t. Lass das Programm dann (1 ms/t) + 1 mal starten, und es ist unmöglich, das alle innerhalb von 1 ms einen Takt geben.
e.f.q.

Aus Falschem folgt Beliebiges
private Nachricht | Beiträge des Benutzers
MasterOfDesaster
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

@marsgk: Der Artikel stimmt mich ja nicht gerade positiv
Naja es scheint erstmal zu funktionieren, wobe ich schon etwas "schummeln" muss.
Ich muss schon ein paar µs weniger warten als der Takt minmal breit sein sollte. Aber das hängt evtl. auch mit Codelaufzeiten zusammen. irgendwie muss aus meinem port.DtrEnable = true; ja auch noch ne spannung erzeugt werden.
private Nachricht | Beiträge des Benutzers
Huffifluffi
myCSharp.de - Member



Dabei seit:
Beiträge: 2

beantworten | zitieren | melden

Hallo MasterOfDesaster,

hast Du inzwischen eine halbwegs brauchbare Lösung gefunden und könntest sie hier mal posten?
Ich sitze nämlich gerade vor ähnlichem Problem, dass ich einen genaueren Timer benötige als den Standardtimer (das ja nur auf ca 55ms genau ist).
Ich habs jetzt auch mit nem eigenen Timer Thread und dann mit Sleep versucht, bin aber auch nur auf ca 0,5ms genau. Das sind 8ms Gesamtzeit schon eine ganze Menge ;-) Und läuft ja dann schnell auch auseinander wenn die Gegenstelle (serielle Verbindung) alle 8ms etwas erwartet.

Wenn noch jemand anders eine Idee hat, dann immer her damit

MfG
Fluffi
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Es gibt überhaupt keine Möglichkeit Windows-Anwendungen (!) zu irgendeiner Art von Genauigkeit zu verpflichten. Weder 0,5 ms noch 2 Sec. Zugesicherte Genauigkeiten jenseits des Kernels erfordern immer ein Echtzeit-BS bzw. eine Echtzeiterweiterung .

Anders sieht das bei Kernel-Code (Treiber) aus.

Hier z.B. ein Kernel-Tool für "Serielle DV in Echtzeit":

http://www.firmenpresse.de/artikel1801.html

Wenn man also selbst eine zuverlässige, zeitgesteuerte Kommunikation - wie in diesem Fall - realisieren möchte, kommt man um einen Treiber nicht drum herum, und die kann man mit .NET nicht schreiben....
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers
Huffifluffi
myCSharp.de - Member



Dabei seit:
Beiträge: 2

beantworten | zitieren | melden

Das Problem an dem angepriesenen Produkt ist, dass dazu auch Hardware benötigt wird (soweit ich das überflogen habe und soweit ich schon dutzende andere Produkte gesehen habe) und außerdem auch nicht wenig kostet :-(. Und damit schon mal völlig unpraktikabel für Software, die einfach so auf verschiedenen Rechnern laufen soll.
Und Bei den Preisen kann man sich auch fix selber was bauen. Ein einfacher Prozessor, der in gewissen Zeitabständen ein Signal an den Seriellen Port schickt. Und schon hat man Eventgetriggert seinen Takt, den man nach belieben nutzen kann und dann auch auf größere Abstände multiplizieren. Aber das ist wie gesagt bei dem Problem hier nicht der Sinn :-/
So ähnlich habe ich es schon mal bei einem anderen Produkt gemacht. Da hatte ich durch das angesprochene Produkt selbst eine Art externe clock.

Ich muss mit den Mitteln die ich habe (also nur Software) eine möglichst hohe Genauigkeit erreichen. Das das dann auch nicht zu 100% verpflichtend fürs System ist, ist mir klar. Aber es wäre gut möglichst nahe heranzukommen ;-)

Da halte ich den Ansatz mit dem HighResTimer für garnicht mal schlecht. Deshalb wollte ich mal wissen was draus geworden ist und wie die Erfahrungen jetzt damit sind..

MfG
Fluffi
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Huffifluffi am .
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Zitat
Original von Huffifluffi
Das Problem an dem angepriesenen Produkt ist, dass dazu auch Hardware benötigt wird

Da musst du was Falsches geklickt haben. Hier nochmal:

http://www.kithara.de/ge/prod.php?sub=kser
Zitat
Aber es wäre gut möglichst nahe heranzukommen ;-)

Es gibt nur gut genug oder nicht..

Es ist nicht eine Frage des Timers (oder welcher davon), es ist eine Frage des Thread-Schedulings. Und wenn das System ordentlich mit Interrupts zu tun hat, dann geht die Latenz nach oben.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von svenson am .
private Nachricht | Beiträge des Benutzers