Добрый вечер, по идее 1 принимается за одну мили секунду 1000 секунда у меня же
чтоб получить задержку в 0.5 сек приходится прописывать 50000, может в настройках как то можно
поправить?
delay в в паскале.
- Реклама
Re: delay в в паскале.
Какой паскаль? Запускаете DOS код под виндой? Тога задержка может не совпадать с реальной.
Re: delay в в паскале.
среда турбо паскаль win98 . Неужели могут такие расхождения могут быть. Просто самою большую
задержку могу сделать все во лишь 0.5 сек. А если надо хоть 5 мин приходится много раз писать по 0.5.
Вобще программная задержка годится для таймеров ?
Добавлено after 2 hours 6 minutes 30 seconds:
попробовал программку часы, секунды идут правильно там привязка часам компьютера,
может можно както привязать время к другим программам чтоб они на него опирались.
задержку могу сделать все во лишь 0.5 сек. А если надо хоть 5 мин приходится много раз писать по 0.5.
Вобще программная задержка годится для таймеров ?
Добавлено after 2 hours 6 minutes 30 seconds:
попробовал программку часы, секунды идут правильно там привязка часам компьютера,
может можно както привязать время к другим программам чтоб они на него опирались.
- minakan
- Поставщик валерьянки для Кота
- Сообщения: 2209
- Зарегистрирован: Вт июл 27, 2010 11:31:59
- Откуда: Кххх
Re: delay в в паскале.
Можно крутить задержки, но потом на другую машину перенести проблемы...
Можно сесть на прерывание и тогда неважно какой проц там стоит.
Когда то выловил сырец, два прибора крутятся на основе этого кода.
Для отладки подобного надо пост карту, и кидать туда коды, т.к. при ошибке виснет насмерть.
Однако сейчас писать что то новое на паскале я бы не стал.
Можно сесть на прерывание и тогда неважно какой проц там стоит.
Когда то выловил сырец, два прибора крутятся на основе этого кода.
Для отладки подобного надо пост карту, и кидать туда коды, т.к. при ошибке виснет насмерть.
Однако сейчас писать что то новое на паскале я бы не стал.
Спойлер
Код: Выделить всё
var c : char;
arcon : word;
cnt1, cnt2, cnt3 : word;
ruled : word;
skvaj : byte;
oddeven : boolean;
buf,old_buf,diff : word;
diff2 :longint;
first_path : boolean;
circlecnt : word;
ismrk : boolean;
circlemrk : word;
oldInt10 : pointer;
datafilecount : word;
bufer : longint; {timer 2 storage}
{$F+}
procedure int10(Flags, CS, IP, AX, BX, CX, DX, SI, DI, DS, ES, BP: Word); Interrupt;
var s1: string;
begin
asm cli end;
circlemrk:=circlecnt;
ismrk :=true;
asm
mov al, 20h
out 0a0h, al
out 20h, al
sti end;
end;
{$F-}
const TIMERINTR = 8;
PIT_FREQ = $1234DD;
var BIOSTimerHandler : procedure;
clock_ticks, counter : longint;
highl:boolean; odd:boolean;
{ ──────────────────────────────────────────────────────────────────────┘
The clock_ticks variable will keep track of how many cycles the PIT has
had, it'll be intialised to 0. The counter variable will hold the new
channel 0 counter value. We'll also be adding this number to clock_ticks
every time our handler is called.
Next we need to do some initialization:
──────────────────────────────────────────────────────────────────────┐
}
procedure SetTimer(TimerHandler : pointer; frequency : word);
begin
{ Do some initialization }
clock_ticks := 0;
counter := $1234DD div frequency;
{ Store the current BIOS handler and set up our own }
GetIntVec(TIMERINTR, @BIOSTimerHandler);
SetIntVec(TIMERINTR, TimerHandler);
{ Set the PIT channel 0 frequency }
Port[$43] := $34;
Port[$40] := counter mod 256;
Port[$40] := counter div 256;
end;
{ ──────────────────────────────────────────────────────────────────────┘
Pretty straightforward stuff. We save the address of the BIOS handler,
install our own, set up the variables we'll use and program PIT channel 0
for the divide-by-N mode at the frequency we need.
This next bit is what we need to do once our program is finished. It just
resets everything back to normal.
──────────────────────────────────────────────────────────────────────┐
}
procedure CleanUpTimer;
begin
{ Restore the normal clock frequency }
Port[$43] := $34;
Port[$40] := 0;
Port[$40] := 0;
{ Restore the normal ticker handler }
SetIntVec(TIMERINTR, @BIOSTimerHandler);
end;
{ ──────────────────────────────────────────────────────────────────────┘
Ok, here's our actual handler. This particular handler just writes an
asterix (*) to the screen. Then it does the checks to see if the BIOS
handler should be called. If so it calls it, if not it acknowledges the
interrupt itself.
──────────────────────────────────────────────────────────────────────┐
}
procedure Handler; Interrupt;
begin
{ DO WHATEVER WE WANT TO DO IN HERE }
{ -----------------------------------
таймерное прерывание, реализация рабочих режимов}
case ruled of
10 : begin
ruled:=21;
end;
21 : begin
ruled:=22;
end;
300 : begin
ruled:=0;
end;
end; {case}
{ Adjust the count of clock ticks }
clock_ticks := clock_ticks + counter;
{ Is it time for the BIOS handler to do it's thang? }
if clock_ticks >= $10000 then
begin
{ Yep! So adjust the count and call the BIOS handler }
clock_ticks := clock_ticks - $10000;
asm pushf end;
BIOSTimerHandler;
end
{ If not then just acknowledge the interrupt }
else
Port[$20] := $20;
end;
Re: delay в в паскале.
Нашёл пач который решает эту проблему, теперь задержка работает корректно. 
Добавлено after 2 minutes 12 seconds:
minakan спасибо.
Добавлено after 2 minutes 12 seconds:
minakan спасибо.
- Реклама
-
кошка Муся
- Открыл глаза
- Сообщения: 69
- Зарегистрирован: Сб июл 11, 2009 18:56:07
- Откуда: Новосибирск. Академгородок
Re: delay в в паскале.
Рад, что решили проблему.
ДОСовские программки и турбо паскаль советую пускать под эмулятором ДОСа: "DOSBox"(виндовский работает менее корректно).-посмотри загрузку компа.
Когда я перешел с 386 компа на пентьюум, то ВР при запуске выдавал ошибку переполнения, т.к. при-иницилизации проги
с подключением модуля "CRT'(куда входи "delay") происходит калибровка скорострельности проца для создания нужной задежки. Там, если посмотреть ASM-код, цикл считать до N, а дальше смотрится по ДОС времени время цикла.
С появление шустрых процов ДОС-таймеры не успевали обновиться и возникала ошибки "деление на 0" или переполнение. Патч появился быстро, наверное его Вы м скачали (там длину цикла увеличили).
Меня удивляет, что не было "Run time error"- скорей всего вы это галочками заблокировали.
ДОСовские программки и турбо паскаль советую пускать под эмулятором ДОСа: "DOSBox"(виндовский работает менее корректно).-посмотри загрузку компа.
Когда я перешел с 386 компа на пентьюум, то ВР при запуске выдавал ошибку переполнения, т.к. при-иницилизации проги
с подключением модуля "CRT'(куда входи "delay") происходит калибровка скорострельности проца для создания нужной задежки. Там, если посмотреть ASM-код, цикл считать до N, а дальше смотрится по ДОС времени время цикла.
С появление шустрых процов ДОС-таймеры не успевали обновиться и возникала ошибки "деление на 0" или переполнение. Патч появился быстро, наверное его Вы м скачали (там длину цикла увеличили).
Меня удивляет, что не было "Run time error"- скорей всего вы это галочками заблокировали.


