Прерывание от порта LPT. #91707


#0 by ado
Народ, помогите! Как заставить LPT генерить прерывания. Вот есть такой код: uses crt,dos; var tik1,tik2:longint; p,p1:byte; key:char; OldVector:Pointer; Procedure LPTirq;interrupt; {Процедура обработки прерывания} Begin tik1:=tik1+1;              {Увеличиваем счетчик.}   port[$20]:=$20;            {Разрешаем дальнейшие прерывания.} End; BEGIN key:=#1; tik1:=0;tik2:=0; clrscr; p:=port[$37a];             {Читаем регистр управления LPT1.} p:=p or 16;                {Устанавливаем бит 4 (разрешение IRQ).} port[$37a]:=p;             {Отправляем в порт.} p:=port[$21];              {Читаем регистр маски контроллера прерываний.} p:=p and 127;              {Сбрасываем бит 7 (LPT1).} port[$21]:=p;              {Отправляем в порт.} GetIntVec($f,OldVector);   {Соханяем старый,} SetIntVec($f,@LPTirq);     {и устанавливаем новый вектор прерываний.} repeat  if tik1>tik2 then         {Проверяем, не увеличился ли счетчик, и если увеличился,}  begin   tik2:=tik2+1;   writeln(port[$379]);     {выводим регистр состояния порта.}  end;  if keypressed then key:=readkey; until key=#13; SetIntVec($f,OldVector); END. Этот код не работает. То есть, при посылке импульса на любой вход LPT, никакой реакции. При этом, непосредственный опрос порта работает: uses crt,dos; var tik1,tik2:longint; p,p1:byte; key:char; OldVector:Pointer; Procedure LPTirq;interrupt; Begin tik1:=tik1+1; port[$20]:=$20; End; BEGIN key:=#1; tik1:=0;tik2:=0; clrscr; p1:=port[$379];                  {Читаем регистр состояний порта.} repeat  p:=port[$379];                  {Еще раз читаем,}                if p<>p1 then                   {и если значение изменилось,}  begin   writeln(p);                    {выводим на экран}   p1:=p;                         {и запоминаем новое значение.}  end;  if keypressed then key:=readkey; until key=#13; SetIntVec($f,OldVector); END. Этот код работает прекрасно. Но мне надо через прерывания.
#1 by Прапорщик Задов
застрелись
#2 by romix
Это Турбо Паскаль для DOS что ли? Че-то я не понял, а где установка вектора прерывания, и где обработчик?  Или это одна и та же процедура? :-) Типа рекурсивная обработка прерывания получается..:-)
#3 by romix
+2 Все, допер, он после BEGIN. Короче имхо ты проверяешь счетчик сразу после установки вектора, а пазуы не видать. Короче надо подождать, а потом зырить счетчик.
#4 by ado
Дык, я ж его в цикле проверяю.
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С