· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Таймер на м/сх 8254

Посл.отвђт Сообщен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:53

new08:
;здесь код нового обработчика

  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