Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Pausen im µs Bereich (https://www.delphipraxis.net/134779-pausen-im-%B5s-bereich.html)

nEmai 28. Mai 2009 17:53


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.

jaenicke 28. Mai 2009 17:55

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.

Namenloser 28. Mai 2009 17:57

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.

Bernhard Geyer 28. Mai 2009 17:59

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.

Apollonius 28. Mai 2009 18:02

Re: Pausen im µs Bereich
 
Für Treiber gibt es unter Windows die Routine MSDN-Library durchsuchenKeStallExecutionProcessor. Möglicherweise kannst du diese auch aus dem User-Mode aufrufen.

jaenicke 28. Mai 2009 18:21

Re: Pausen im µs Bereich
 
Direkt sicher nicht, aber man könnte vielleicht einen Treiber schreiben, der einem bei der Steuerung hilft.

nEmai 28. Mai 2009 18:23

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.

Meflin 28. Mai 2009 18:24

Re: Pausen im µs Bereich
 
Du hast auf deinem Mikrocontroller Windows laufen :gruebel:

nEmai 28. Mai 2009 18:27

Re: Pausen im µs Bereich
 
Zitat:

Zitat von Meflin
Du hast auf deinem Mikrocontroller Windows laufen :gruebel:

So ein willste auch, ne :wink:

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.

Klaus01 28. Mai 2009 18:42

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

OldGrumpy 28. Mai 2009 18:53

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?

nEmai 28. Mai 2009 18:53

Re: Pausen im µs Bereich
 
Zitat:

Zitat von Klaus01
.. 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

Leider nein, es handelt sich hier um die Strobe Leitung, die sagt dem PIC erst, dass was passieren soll, beziehungsweise sie hängt an einem seiner Interrupteingänge. Das Signal muss ne gewisse Zeit gehalten werden, ich weiß nicht wie lang. Deshalb will ich mit dem Delay etwas experimentieren.

Delphi-Quellcode:
procedure EnableStrobe();
begin
  SetPortBit($378, 4);
  Sleep(1);
  ClrPortBit($378, 4);
end;
Das Sleep(1) ist der Knackpunkt.. so ein Sleep(0,2) wäre mir lieb z.B.

Mfg.

jfheins 28. Mai 2009 18:55

Re: Pausen im µs Bereich
 
Ich weis nicht obs wegoptimiert wird, aber du kannst ja mal ein
Delphi-Quellcode:
for i := 0 to 10000 do
asm
  NOP;
end;
probieren :stupid:

Apollonius 28. Mai 2009 18:58

Re: Pausen im µs Bereich
 
Du solltest besser den Pause-Befehl nehmen - der ist für solche Anwendungen gedacht.

nEmai 28. Mai 2009 18:59

Re: Pausen im µs Bereich
 
Zitat:

Zitat von jfheins
Ich weis nicht obs wegoptimiert wird, aber du kannst ja mal ein
Delphi-Quellcode:
for i := 0 to 10000 do
asm
  NOP;
end;
probieren :stupid:

Genial das funktioniert! Sag mir mal einer dass es NOP auch im x86 Assembler gibt. :-D
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:

himitsu 28. Mai 2009 19:12

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:
for i := 0 to 10000 do if i = 0 then ;
und wenn dich die Dauer interessiert ... einfach mal messen
Delphi-Quellcode:
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;
oder
Delphi-Quellcode:
QueryPerformanceFrequency(Freq);
QueryPerformanceCounter(Start);
  for i := 1 to 10000 * Durchlaeufe do if i = 0 then ;
QueryPerformanceCounter(Stopp);
Dauer := (Stopp - Start) / Freq / Durchlaeufe;

mischerr 28. Mai 2009 20:44

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 18:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz