Delay kleiner als millisekunde

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thalius
Beiträge: 476
Registriert: 17.02.2005 16:17
Wohnort: Basel / Schweiz

Beitrag von Thalius »

hab da was gefunden:

Code: Alles auswählen


; Author: chrizl
; Source: German Pureboard
Procedure DELAYUS(t.l)
  Structure DLong
    lowlong.l
    hilong.l
  EndStructure
  DLong=0
  hitimefreq.DLong
  QueryPerformanceFrequency_(@hitimefreq)
  hitimecount1.DLong
  hitimecount2.DLong
  QueryPerformanceCounter_(@hitimecount1)
  Repeat
    QueryPerformanceCounter_(@hitimecount2)
  Until Int((hitimecount2\lowlong - hitimecount1\lowlong)/(hitimefreq\lowlong/1000000.0))>=t
EndProcedure 
Das könnt Dich interessiern:
http://www.purebasic.fr/german/viewtopic.php?t=8025

und wech!
Thalius
"...smoking hash-tables until until you run out of memory." :P
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

:D super
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ich arbeite mit einer schnittstelle und wenn ich kein Delay benutze kommen die signale zu schnell, wenn ich Delay(1) benutze ist mir das alles zu langsam.
Was für eine Schnittstelle? Was für Daten? Wie werden die Daten verarbeitet? Warum zu schnell?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ich glaube nicht, dass das IC mit der seriellen Schnittstelle angesteuert
werden sollte, wobei die Baudrate dann auch nicht nützlich wäre.

Unter der Hardwareecke ist einiges über eine CNC-Portal-Fräse und dessen
Ansteuerung im µs-Bereich beschrieben, was auch erklärt, was und wofür
so eine kurze Pause zwischen den Signalen gebraucht wird.
Es scheitert nur an dem Echtzeitsystems, da Windows mit einer Zeitscheibe
arbeitet, welches im Hintergrund laufende Programme die jeweiligen Zeiten
zuteilt. Darum wird es auch bei der µs-Delay-Methode
Probleme geben. Unter DOS oder noch besser mit einen Atmel
könnte man bessere Ergebnisse erzielen.

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@Falko: Oder unter Windows die Priorität nach oben schrauben. Das wäre
zumindest eine gute Verbesserung, aber natürlich noch nicht 100%.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

@NTQ

Ja, damit hast du vollkommen Recht. Das ist dann unter Windows
die einzigste Möglichkeit :allright: .

Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Habs mal nach PB v4.x umgestellt und etwas optimiert.

Code: Alles auswählen

; Author: chrizl
; SecendAuthor: mk-soft
; Source: German Pureboard

Procedure DELAYUS(t.l)
  
  Protected hitimefreq.q, hitimecount1.q, hitimecount2.q, hitimediff.q, hitimemax.q
  
  QueryPerformanceFrequency_(@hitimefreq)
  
  hitimemax = hitimefreq * t / 1000000
  QueryPerformanceCounter_(@hitimecount1)
  Repeat
    QueryPerformanceCounter_(@hitimecount2)
    hitimediff = hitimecount2 - hitimecount1
  Until hitimediff >= hitimemax
EndProcedure 


Debug "Start"
QueryPerformanceCounter_(@start.q)
DELAYUS(100)
QueryPerformanceCounter_(@ende.q)
Debug "Ende"

QueryPerformanceFrequency_(@freq.q) 
result.q = (ende-start)
result * 1000000
result / freq
Debug "Zeit: " + StrQ(result)

Mein PC liegt etwa 15-28 uS über der Sollzeit

für lange Pausen nicht zu gebrauchen wegen der vollen CPU-Auslastung

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Dann schalt mal den Debugger aus und ersetze dieses

Code: Alles auswählen

...
MessageRequester("NoDebug","Zeit: " + StrQ(result) )
...
Bei mir liegt das dann 5-6µs minimal darüber. :lol:

korrigiert auf : DELAYUS(95)

komme ich nach Zehn Tests auf genau 100µs, also 0 Abweichung.

[Edit] Wenn ich dann aber folgendes in eine Exe compiliere und dann teste, kommen bei mir Abweichungen bis ca. 6µs was aber hierbei mit
Windowsdiensten, etc. zusammen hängt.

Code: Alles auswählen

; Author: chrizl
; SecendAuthor: mk-soft
; Source: German Pureboard

Procedure DELAYUS(t.l)
 
  Protected hitimefreq.q, hitimecount1.q, hitimecount2.q, hitimediff.q, hitimemax.q
 
  QueryPerformanceFrequency_(@hitimefreq)
 
  hitimemax = hitimefreq * t / 1000000
  QueryPerformanceCounter_(@hitimecount1)
  Repeat
    QueryPerformanceCounter_(@hitimecount2)
    hitimediff = hitimecount2 - hitimecount1
  Until hitimediff >= hitimemax
EndProcedure

For i = 0 To 10
;Debug "Start"
QueryPerformanceCounter_(@start.q)
DELAYUS(95)
QueryPerformanceCounter_(@ende.q)
;Debug "Ende"

QueryPerformanceFrequency_(@freq.q)
result.q = (ende-start)
result * 1000000
result / freq
MessageRequester("NoDebug","Zeit: " + StrQ(result) )
DELAYUS(95)
Next i
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Die Frage ist ob der Counter bei Überlauf auch sauber von Plus ins Minus läuft.
Sonst kann die Differenzberechnung zum Fehler führen und das Programm hängt.

FF :wink:

P.S. Beispiel

Code: Alles auswählen

; test Quad Counter Differenzberechnung

start.q = $7FFFFFFFFFFFFF00
ende.q = start + 1000

diff.q = ende - start

Debug "Start: " + StrQ(start)
Debug "Ende : " + StrQ(ende)
Debug "Diff : " + StrQ(diff)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

der code für Delayus() is genau das was ich gesucht hab, danke @all

>Was für eine Schnittstelle? Was für Daten? Wie werden die Daten verarbeitet? Warum zu schnell?
Ich benutze die Pins DTR, RTS und CTS der RS-232 Schnittstelle um einen I²C-Bus IC (PCF8591) zu steuern...
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Antworten