|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 22, 2004 22:29:37 Здрасте друзья и братья!!!!! Помогите!!!! 1.Как мне используя системный таймер в режиме меандра (канал 0) на другой частоте (более 18,2 гц) после выполнения программы восстановить системное время?????? 2. Или как мне запретить каждое n-прерывание (08Н) от таймера??? ЗЫ: Разъясняю... Ставлю таймер на большую частоту(допустим в 10 раз) => прерывание будет в 10 раз быстрее приходить и часы по адресу (вроде 0000:004С???) будут идти быстрее.... Так вот надо сделать фишку чтобы часы прибавляли единичку не каждый раз от прерывания 08Н а каждый десятый????? А моя подпрограмма вызывалась от прихода каждого прерывания!!!!!! И все это желательно организовать на паскале или на ассемблере (а то я на СИ не шарю :)) |
|
|
Дата: Янв 22, 2004 22:57:26 murdor Нужно завести счетчик, который будет подсчитывать число вызовов прерывания и старый обработчик вызывать при каждом N-ом вызове. Или в конце считать время из CMOS'а и установить его в качестве текущего. |
|
|
Дата: Янв 23, 2004 01:04:02 Black_mirror может и примерчик где мона надыбать а? А то я как делать вроде понимаю, а вроде чего-то мне не хватает для полной картины... А как вызывать старый обработчик... а то я как-то пока не врублюсь???? Допустим я захватил прерывание 08Н (при увеличенной частоте таймера).. вопрос: при таком раскладе это прерывание будет обрабатывать только моя подпрограмма или и системный счетчик тоже будет тикать???? Не пойму пока никак??????????? |
|
|
Дата: Янв 23, 2004 01:26:53new08: ;здесь код нового обработчика dec [cs:cnt] js .callold iret .callold: mov [cs:cnt],N-1 jmp dword [cs:oldip] cnt dw 0 oldip dw ?;сюда нужно поместить адрес старого обработчика oldcs dw ?;перед установкой нового |
|
|
Дата: Янв 23, 2004 01:29:47 Ага.... Ща буду разбираться!!!! |
|
|
Дата: Янв 23, 2004 01:40:39 Так все-таки допустим я делаю так: 1.Сохраняю вектор старого обработчика прерываний в какой-то переменной.. 2.Назначаю новый обработчик этого прерывания (допустим это будет какая-то моя подпрограмма, которая выполняется по прерыванию)..... ВОПРОС: вот при таком раскладе системные часы будут стоять, пока я не верну назад из какой-то переменной вектор старого обработчика или как????? |
|
|
Дата: Янв 23, 2004 01:50:56 murdor Если не будешь вызывать старый обработчик, то естественно будут стоять. Только не системные часы, а досовские. А из CMOS'а будет читаться правильное время. |
|
|
Дата: Янв 23, 2004 02:38:58 Блин!!!! Я тута замутил свою пробную програмку на Паскале.... В чистом досе... Но при ее запуске все виснет.... Походу ч все делаю не так как надо... А как то правильно будет????? Пример: program TimeNew; uses Crt,WinDos; const cnt=1193; var x:byte; vec:pointer; procedure Freq; Interrupt; begin GotoXY(20,12); TextColor(Green); Writeln(x); inc(x); end; procedure SetNewSpeed; Assembler; {процед.перепрограмм. таймера на более выс.ск-ть счета} asm cli; mov al,00000110b; out 43h,al; {задаю режим таймера} mov ax,cnt; {загружаю таймер числом 1193 DEC} out 40h,al; mov al,ah; out 40h,al; sti; end; procedure SetOldSpeed; Assembler; {процед. восстановл. прежней частоты счета} asm cli; mov al,00000110b; out 43h,al; mov ax,0; out 40h,al; mov al,ah; out 40h,al; sti; end; begin x:=0; clrscr; GetIntVec($08,vec); {сохран стар. вект. в перем.VEC} SetIntVec($08,@Freq);{устанавливаю новый вектор} SetNewSpeed; {загр.таймера новым числом} repeat until KeyPressed;{ждемс пока ничего не нажмали} SetOldSpeed;{восстановление прежней частоты счета} SetIntVec($08,vec);{восстановление прежнего вектора прерыв.} end. |
|
|
Дата: Янв 23, 2004 03:22:27 НАКОНЕЦ -ТО СВЕРШИЛОСЬ!!!!! Ну я и дурень..... надо было просто сбросить контроллер прерываний т.е. кое-что дописать в проге: ........ inc(x); {вот это надо дописать} asm mov al,20h; out 20h,al; end; И тогда все заработает!!!!! И даже часики то ОСТАНАВЛИВАЮТСЯ ... УРА!!!!! Black_mirror спасибо огромное .... Ты был прав!!!!! |
|
|
Дата: Янв 23, 2004 03:23:32 Теперь мона идти баеньки... |
|
|
Дата: Янв 23, 2004 16:57:57 murdor Вот, я пробовал хз когда... Помню, работало, но на очень больших ускорениях таймера DOS иногда зависал. С чем это было связано - не разбирался. Хотя я там еще порты флоппи-контроллера юзал, может из-за него... _964405773__QuickTimer.zip |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.075 |