Napsal: 4. 2. 2009, 7:56
Já jsem to vyhrabal z jednoho starého Amára. Kdysi dávno jsem to zkoušel. Pivař moc nejsu ( u nás je špíš ta trnková ) ale když bude cesta okolo ...
Největší české fórum o strojírenství, CNC strojích a 3D tiskárnách
https://forum.strojirenstvi.cz/
Ono ten VB asi nebude to pravé ořechové. Interpretovaný jazyk plus Widle plus spousta balastu, než se ten OUT procedí všema vrstvama Windows až ke skutečné instrukci OUT.zavadils píše:Nepříšel náhodou někdo jak generovat impulzy ve visual basicu řádově v mikrosekundách. V milisekundách mi to chodí parádně. Motory se točí, ale je to dost malá frekvence. Budu rád za každé info. Díkes
HonzaCh píše:Ono ten VB asi nebude to pravé ořechové. Interpretovaný jazyk plus Widle plus spousta balastu, než se ten OUT procedí všema vrstvama Windows až ke skutečné instrukci OUT.zavadils píše:Nepříšel náhodou někdo jak generovat impulzy ve visual basicu řádově v mikrosekundách. V milisekundách mi to chodí parádně. Motory se točí, ale je to dost malá frekvence. Budu rád za každé info. Díkes
Můžeš zkusit optimalizaci -- vyházet z cyklů všechny výpočty a jiné zbytečnosti (jako kreslení po obrazovce) -- a nastavit výkonnému vláknu nebo aspoň celému programu co nejvyšší prioritu (realtime). Moc od toho ale nečekej, kdyby to bylo tak snadné, nebyl by MACH u mnohých na indexu (a rozhodně citlivý na konfiguraci PC a widlí).
Můžeš zkusit ten DOS (ale čistý DOS, ne okno DOSu ve woknech) a případně nějaký překládaný jazyk (C/Pascal/asembler...). Ale to bude asi mimo Tvou mísu, jinak by ses asi neptal...
HTH,
H.
zavadils píše:Vyhazovat z cyklů asi nic nemusím. protože bez nějaký zpomalovací prodlevy to vygenereje frekvenci větší než je schopen pobrat KM. Našel jsem nějakou funkci "QueryPerformanceCounter", ale nevím jak ji rozchodit.
nevalnou informační hodnotu, se skutečným použitím této fce Ti těžko můžeme pomoct.zavadils píše:Našel jsem nějakou funkci "QueryPerformanceCounter",...
1. rychlý je to právě bez použití zpomalování, ale s použitím delay nebo sleep v milisekundách je to už moc pomalé.HonzaCh píše:zavadils píše:Vyhazovat z cyklů asi nic nemusím. protože bez nějaký zpomalovací prodlevy to vygenereje frekvenci větší než je schopen pobrat KM. Našel jsem nějakou funkci "QueryPerformanceCounter", ale nevím jak ji rozchodit.H.
- Tak to jsem nějak mimo. Zájem byl o mikrosekundy s tím, že milisekundy chodí, ale to je pro Tebe příliš pomalé a chceš/potřebuješ rychlejc, a včil je to rychlý až moc?
![]()
![]()
Mimochodem, běžných 200 kroků na otáčku krát třeba 300RPM (5ot/s) ~ 1kHz (1ms perioda impulsů, změna úrovně signálu co 500μs). Když dojde na mikrokrokování, musí to být adekvátně rychlejší.
Windows (a jeho preemptivní multitasking a další složitosti) Ti nezaručí rovnoměrné rozložení pulsů na výstupu. Někde tu byl obrázek s notami na buben, které generuje někomu MACH (pokud si vzpomínám). I PC lze donutit k řízení, ale bez těch Windows, dokonce bez klasického DOSu. Průchodnější je většinou spíš ten zmíněný mikrořadič.- Co je na QueryPerformanceCounter podle popisu na MSDN složitého? Zavolat s adresou 64bitového integeru (ve VC knihovnách deklarováno jako union)... Akorát to existuje jen pro Win2000 a novější.
Jak se to dělá ve VB snad najdeš v helpu, stisknout <F1> je rychlejší, než psát příspěvek. Tenhle jazyk neznám, ale na uvedeném odkazu je přímo ukázka kódu ve VB6, stačí to jen obkreslit!A kde jinde samostatně hledat informaci, než u zdroje, což je v případě microsoftích produktů kupodivu profláknutně známá Microsoft Developer Network na webu Microsoftu, kterou najde jako jeden z prvích hitů i konkurenční Google???
I s překladem Ti google pomůže, a i když to není Vrchlický, na porozumnění to při spojení s originálem snad stačí.
- Nějakých funkcí je ve Win32 API šest půlek. Bez dalšího má tvrzení
nevalnou informační hodnotu, se skutečným použitím této fce Ti těžko můžeme pomoct.zavadils píše:Našel jsem nějakou funkci "QueryPerformanceCounter",...
Aha I. To už je informace.zavadils píše:1. rychlý je to právě bez použití zpomalování, ale s použitím delay nebo sleep v milisekundách je to už moc pomalé.
Aha II.zavadils píše:2. k funkci QueryPerformanceCounter jsem v MSDN příklad našel, to mě taky napadlo, ale jen tak to obšlehnout a tvrdit že je to jednoduchý, když neznám visual basic no nevím. Propblém je, že při použítí této funkce mi to vrátí jako nejmenší rozlišovací schopnot stejně 1 ms. Což mi nic nepomůže. Takže nevím jestli někdo ví jak přesně tuto funkci použít přesně, tak mi klidně může písnout. Díkes
HonzaCh píše:Aha I. To už je informace.zavadils píše:1. rychlý je to právě bez použití zpomalování, ale s použitím delay nebo sleep v milisekundách je to už moc pomalé.
Aha II.zavadils píše:2. k funkci QueryPerformanceCounter jsem v MSDN příklad našel, to mě taky napadlo, ale jen tak to obšlehnout a tvrdit že je to jednoduchý, když neznám visual basic no nevím. Propblém je, že při použítí této funkce mi to vrátí jako nejmenší rozlišovací schopnot stejně 1 ms. Což mi nic nepomůže. Takže nevím jestli někdo ví jak přesně tuto funkci použít přesně, tak mi klidně může písnout. Díkes
To je přesně to, co jsem psal v bodu 3. QueryPerformanceCounter() je sama o sobě na použití jednoduchá fce s jediným parametrem a obšlehnout její volání z MSDNka (jak jinak si přeložit Našel jsem…ale nevím jak ji rozchodit. — ona totiž chodí, je součástí jádra) je jednoduché a za tím si stojím i bez znalosti VB. Ale až teď jsme se dozvěděli nějaký kontext.
Na její použití pro čekání potřebuješ i "brášku" — QueryPerformanceFrequency(). Ta ti řekne, jak rychle ty interní hodiny tikají, z čehož se dá zjistit, jakému času odpovídá změna čítače (counter) o jedničku (t=1/f).
Když tohle víš, můžeš si spočítat, jaká změna odpovídá požadovanému čekání (delta=f*dobaCekaniVSekundach); na začátku čekání zavoláš QueryPerformanceCounter, a pak periodicky znovu voláš QueryPerformanceCounter tak dlouho, dokud absolutní hodnota rozdílu obou stavů čítače (modulo 2^64) nepřesáhne spočítanou.
Zanese se tam jistá chyba (volání fce a výpočet na počátku i v cyklu něco trvá). Je třeba taky řešit, jak se použitý jazyk chová při přetečení počítání v 64 bitech (ve VB ten typ CURRENCY).
Obecně se to dá optimalizovat počítáním v celočíselné aritmetice a případně předvypočtením koncového stavu (netřeba odčítat, jen porovnávat, ale zase je nutno ošetřit přetečení), ale to už do značné míry závisí na použitém programovacím jazyku (a ten Tvůj VB neznám).
V každém případě je celý princip téhle dvojice fcí včetně kompenzace chyby způsobené voláním téhle fce naznačen v onom zmíněném VB6 Code Snippet-u pro QueryPerformanceFrequency().
HTH,
H.
Obávám se, že a) ne, b) si úplně nerozumíme.zavadils píše:Tak jsem použíl toto:
Dim Ctr1 As Currency, Ctr2 As Currency
QueryPerformanceCounter Ctr1
QueryPerformanceCounter Ctr2
mOverhead = Ctr2 - Ctr1
QueryPerformanceFrequency mFrequency
QueryPerformanceCounter mStart
QueryPerformanceCounter mStop
mElapsed = ((mStop - mStart - mOverhead) / mFrequency) * 1000
Debug.Print "----------------------------------------------------"
Debug.Print Time
Debug.Print "mStart= "; mStop
Debug.Print "mStop= "; mStart
Debug.Print "mOverhead= "; mOverhead
Debug.Print "mFrequency= "; mFrequency
Debug.Print "Elapsed="; Format$(mElapsed, "0.0000")
a Výsledek je:
----------------------------------------------------
19:12:19
mStart= 2254702287,3732
mStop= 2254702287,3231
mOverhead= 0,1111
mFrequency= 261209
Elapsed=-0,0002
Chápu to dobře, že to tedy dokáže vygenerovat cca 261 kHz?