![]() |
Pausen im µs Bereich
Hallo,
brauche für ein Mikrokontrollerprojekt Pausen im mittleren bis unteren µs-Bereich (ca 10-200 oder so) in meinem Programm. Sleep, Timer, GetTickCount &Co sind da ja leider komplett unnütz. Wie könnte man das machen? MfG. |
Re: Pausen im µs Bereich
Windows ist kein Echtzeitbetriebssystem. Sowas ist praktisch nicht möglich. Du kannst höchstens einfach Schleifen laufen lassen und so eine ungenaue Pause einbauen. Eine zeitlich genauere Steuerung ist unmöglich, es sei denn du nutzt externe Geräte dafür.
|
Re: Pausen im µs Bereich
Du könntest dir mal QueryPerformanceCounter anschauen, ob der allerdings genau genug für dich ist, weiß ich nicht (ist auch je nach System anders). Ansonsten gebe ich jaenicke recht.
|
Re: Pausen im µs Bereich
Es gibt AFAIK Echtzeit-Aufsätze auf Windows die in gewissen Rahmen echzeitfähigkeit ermöglichen. Weiß ober nicht ob man diese mit Delphi-Programmen verwenden kann.
|
Re: Pausen im µs Bereich
Für Treiber gibt es unter Windows die Routine
![]() |
Re: Pausen im µs Bereich
Direkt sicher nicht, aber man könnte vielleicht einen Treiber schreiben, der einem bei der Steuerung hilft.
|
Re: Pausen im µs Bereich
Jungs nicht übertreiben :wink:
Mir würd ne schleife die 200µs läuft schon reichen, aber irgendwie krieg ich das nicht so recht hin, bzw es will ums verrecken nicht funktionieren.. MfG. |
Re: Pausen im µs Bereich
Du hast auf deinem Mikrocontroller Windows laufen :gruebel:
|
Re: Pausen im µs Bereich
Zitat:
Ne, käse. Ich schick mit nem Delphiprog via LPT Bilder an nen PIC, der mir diese auf nem Grafik Display anzeigt. Der Bildaufbau is bisher elendig langsam, weil ich noch Sleep(1) benutz. Das zu fünfteln is das Ziel. Mfg. |
Re: Pausen im µs Bereich
.. und wenn Du das sleep ganz herausnimmst, LPT ist ja auch nicht das schnellste?
Oder kannst Du die Verzögerung nicht auf dem PIC bewerkstelligen? Grüße Klaus |
Re: Pausen im µs Bereich
Hardware-Handshake ist doch auf dem LPT eh schon vorgesehen, hast Du keinen I/O-Pin mehr frei um die vom System vorgesehene Flusskontrolle zu nutzen?
|
Re: Pausen im µs Bereich
Zitat:
Delphi-Quellcode:
Das Sleep(1) ist der Knackpunkt.. so ein Sleep(0,2) wäre mir lieb z.B.
procedure EnableStrobe();
begin SetPortBit($378, 4); Sleep(1); ClrPortBit($378, 4); end; Mfg. |
Re: Pausen im µs Bereich
Ich weis nicht obs wegoptimiert wird, aber du kannst ja mal ein
Delphi-Quellcode:
probieren :stupid:
for i := 0 to 10000 do
asm NOP; end; |
Re: Pausen im µs Bereich
Du solltest besser den Pause-Befehl nehmen - der ist für solche Anwendungen gedacht.
|
Re: Pausen im µs Bereich
Zitat:
Danke, perfekt. (Ich hab an der Grenze noch etwas gedreht, weiß nicht wie lange es im Endeffekt verzögert, aber das Bild wird auf Klick aufgebaut) MfG, Danke und bis zum nächsten Mal :thumb: |
Re: Pausen im µs Bereich
PS: Sleep(1) ist bei aktuellen Betriebssystemen 0 bis 16 ms lang, also durchschnittlich 8ms
ich mach es meistens so:
Delphi-Quellcode:
und wenn dich die Dauer interessiert ... einfach mal messen
for i := 0 to 10000 do if i = 0 then ;
Delphi-Quellcode:
oder
QueryPerformanceFrequency(Freq);
QueryPerformanceCounter(Start); for k := 1 to Durchlaeufe do for i := 0 to 10000 do if i = 0 then ; QueryPerformanceCounter(Stopp); Dauer := (Stopp - Start) / Freq / Durchlaeufe;
Delphi-Quellcode:
QueryPerformanceFrequency(Freq);
QueryPerformanceCounter(Start); for i := 1 to 10000 * Durchlaeufe do if i = 0 then ; QueryPerformanceCounter(Stopp); Dauer := (Stopp - Start) / Freq / Durchlaeufe; |
Re: Pausen im µs Bereich
Ich hatte vor Jahren mal ein Projekt wo ich ne SW für nen Programmer von Atmel am LPT als Ersatz für das mitgelieferte DOS-Tool geschrieben habe. War so'n Teil für 89Cx usw. dessen Schaltpläne irgendwo bei Atmel auf der Seite liegen.
Ich habs auch über QueryPerformanceCounter / QueryPerformanceFrequency gelöst. Erst mit QPF den Wert per Sekunde ermitteln, dann mit QPC einen Startwert lesen, mein Delta zu Startwert berechnen und mit QPC solange lesen bis AktuellerWert >= Startwert + Delta. Hat gereicht und war genau genug. Michael Nachtrag: Der Zugriff lief damals über so ne freie IO.DLL unter W2k und XP. Ich hatte mit nem Oszi mal gemessen und kam auf bis zu 0.5µ runter. Ich hatte auch einen Testmode über den man einen zusätzlichen Kompensationswert mit Hilfe eines Oszis ermitteln und konfigurieren konnte. Das ganze war natürlich machinen- und lastabhängig. Aber wer flasht schon unter Last? ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz