Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Вниз

Таймеры+LPT   Найти похожие ветки 

 
Dark Demon   (2003-05-28 01:46) [0]

Всем привет!

Люди - может кто подскажет ответ на следующий вопрос:
Мне надо реализовать вывод данных в LPT порт с определенной частотой (прога под винду 9x и выше). Беда в следующем - частота вывода данных в среднем должна составлять от 12 до 50 кГц. Если верить виндовому хелпу на стандартном таймере больше 1 кГц не получишь. Каким образом можно решить эту проблему?

Заранее спасибо за ответ.


 
Нуу   (2003-05-28 04:25) [1]

Либо DOS, либо драйвер.


 
DeMoN_Astra   (2003-05-28 09:10) [2]

угу. а еще - вообще отказываться от таймера - вывод только по внешним синхроимпульсам...


 
pasha676   (2003-05-28 09:25) [3]


> Либо DOS, либо драйвер.

Либо ассемблерная вставка на системном таймере время считать.


 
Zakharov Anton   (2003-05-28 10:27) [4]

Используй приведенный ниже код пп. delay_mks(Value).
У меня работает: задержки до 5 mks.


unit Timer_and_Delay;

interface

uses windows;

const
SleepTime: dword = 200; {используется для определения частоты процессора}

Var
CPUFrequency: dword = 0; {частота процессора MHz}
LCPUFrequencyMS: single; {0.001/CPUFrequency}
LCPUFrequencyMKS: single; {1/CPUFrequency}
procedure delay_mks(Value: Integer); {формирование задержки в mks}
function cpuGetSpeed: word;
function cpuGetTick: Int64;
Function cpuGetms(Tick: Int64) :dword;
Function cpuGetmks(Tick: Int64) :dword;
function cpucalcms(const Tick1,Tick2:Int64 ):Int64;
Function cpucalcmks(const Tick1,Tick2:Int64 ):Int64;

implementation

var
inited:boolean=false;

procedure delay_mks(Value: Integer);
var
tick1, tick2: Int64;
begin
tick1 := cpugettick;
tick2 := cpugettick;
while cpucalcmks(tick1, tick2)+5 < Value do
tick2 := cpugettick;
end;

function cpugettick:Int64;
asm
dw 310Fh // rdtsc
end;

Function cpugetms(Tick: Int64): dword;
begin
asm
dw 310Fh // rdtsc
sub eax, dword [Tick]
sbb edx, dword [Tick+4]
mov dword[Tick], eax
mov dword[Tick+4], edx
end;
if not inited then cpugetspeed;
Result := round(Tick*LCPUFrequencyMS);
end;

Function cpugetmks(Tick:Int64): dword;
begin
asm
dw 310Fh // rdtsc
sub eax, dword [Tick]
sbb edx, dword [Tick+4]
mov dword[Tick], eax
mov dword[Tick+4], edx
end;
if not inited then cpugetspeed;
result:=round(Tick*LCPUFrequencyMKS);
end;

function cpucalcmks(const Tick1, Tick2: Int64 ): Int64;
begin
if not inited then cpugetspeed;
Result := round(abs(Tick2-Tick1)*LCPUFrequencyMKS);
end;

function cpucalcms(const Tick1, Tick2: Int64 ): Int64;
begin
if not inited then cpugetspeed;
result:=round(abs(Tick2-Tick1)*LCPUFrequencyMS);
end;

function CPUGetSpeed: word;
var
cpufreq: dword;
len:integer;
rh:HKEY;
i1,i2,t:Int64;
pr:dword;
begin
Result := 0;
if CPUFrequency <> 0 then
begin
Result := CPUFrequency;
exit;
end;
if RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\DESCRIPTION\System\CentralProcessor\0",
0, KEY_READ, rh) = ERROR_SUCCESS then
begin
if RegQueryValueEx(rh,"~MHz", nil,@pr, @cpufreq, @len) = ERROR_SUCCESS then
begin
Result := cpufreq;
CPUFrequency := cpufreq;
end
else
begin
pr := GetThreadPriority(GetCurrentThread );
SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
QueryPerformanceCounter( i1 );
t := cpugettick;
Sleep(SleepTime);
asm
dw 310Fh // rdtsc
sub eax, dword[t]
sbb edx, dword[t+4]
mov dword[t], eax
mov dword[t+4], edx
end;
QueryPerformanceCounter( i2 );
i2 := i2-i1;
QueryPerformanceFrequency( i1 );
i2 := i2*1000000 div i1;
Result := round(t/(i2));
CPUFrequency := Result;
SetThreadPriority(GetCurrentThread,pr);
end;
RegCloseKey( rh );
end;
LCPUFrequencyMS := 0.001/CPUFrequency;
LCPUFrequencyMKS := 1/CPUFrequency;
inited := true;
end;


end.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
14-33304
egort
2003-07-24 11:47
2003.08.11
Люди Кто знает как поставить Delphi 4 на windows 2000 server


1-33128
Last
2003-07-30 11:38
2003.08.11
Filter


1-33153
IgorRu
2003-07-26 21:37
2003.08.11
Как сохранить Форму в файл и затем в работающем проекте восст....


9-33040
Trix)(
2003-02-11 19:15
2003.08.11
HELP ME


3-33058
mikhasenko.anton
2003-07-18 14:13
2003.08.11
Компонент TDBF - не могу понять почему при создании





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский