Форум РадиоКот https://radiokot.ru/forum/ |
|
delay в в паскале. https://radiokot.ru/forum/viewtopic.php?f=24&t=139482 |
Страница 1 из 1 |
Автор: | tda777 [ Чт дек 15, 2016 16:57:36 ] |
Заголовок сообщения: | delay в в паскале. |
Добрый вечер, по идее 1 принимается за одну мили секунду 1000 секунда у меня же чтоб получить задержку в 0.5 сек приходится прописывать 50000, может в настройках как то можно поправить? |
Автор: | Мурик [ Чт дек 15, 2016 18:51:23 ] |
Заголовок сообщения: | Re: delay в в паскале. |
Какой паскаль? Запускаете DOS код под виндой? Тога задержка может не совпадать с реальной. |
Автор: | tda777 [ Чт дек 15, 2016 23:06:14 ] |
Заголовок сообщения: | Re: delay в в паскале. |
среда турбо паскаль win98 . Неужели могут такие расхождения могут быть. Просто самою большую задержку могу сделать все во лишь 0.5 сек. А если надо хоть 5 мин приходится много раз писать по 0.5. Вобще программная задержка годится для таймеров ? Добавлено after 2 hours 6 minutes 30 seconds: попробовал программку часы, секунды идут правильно там привязка часам компьютера, может можно както привязать время к другим программам чтоб они на него опирались. |
Автор: | minakan [ Пт дек 16, 2016 01:48:52 ] |
Заголовок сообщения: | 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; |
Автор: | tda777 [ Пт дек 16, 2016 14:14:46 ] |
Заголовок сообщения: | Re: delay в в паскале. |
Нашёл пач который решает эту проблему, теперь задержка работает корректно. Добавлено after 2 minutes 12 seconds: minakan спасибо. |
Автор: | кошка Муся [ Пт дек 16, 2016 15:34:33 ] |
Заголовок сообщения: | Re: delay в в паскале. |
Рад, что решили проблему. ДОСовские программки и турбо паскаль советую пускать под эмулятором ДОСа: "DOSBox"(виндовский работает менее корректно).-посмотри загрузку компа. Когда я перешел с 386 компа на пентьюум, то ВР при запуске выдавал ошибку переполнения, т.к. при-иницилизации проги с подключением модуля "CRT'(куда входи "delay") происходит калибровка скорострельности проца для создания нужной задежки. Там, если посмотреть ASM-код, цикл считать до N, а дальше смотрится по ДОС времени время цикла. С появление шустрых процов ДОС-таймеры не успевали обновиться и возникала ошибки "деление на 0" или переполнение. Патч появился быстро, наверное его Вы м скачали (там длину цикла увеличили). Меня удивляет, что не было "Run time error"- скорей всего вы это галочками заблокировали. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |