Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.16;
Скачать: CL | DM;

Вниз

Хелп!!! Что за глюка с прерыванием !!! TP7   Найти похожие ветки 

 
YAndrey   (2002-09-02 15:08) [0]

Нужна прога на TP7 работающая с COM портом,
Перехватывающая прерывание !!!!

Информация передается и принимается, а прерывания не происходит!
В чем здесь глюк?


uses Сrt,WinDos;
var
ptrIntFromRs232 : Pointer;
Fl : Boolean;
N :Byte;

ByteFromPort:byte;
{-------------------------------------------------------------------}
procedure InitPortRs232;
begin
Port[$3FB]:=128; {Устанавливаем бит DLAB}

{Скорость работы порта 9600 бод/c}
Port[$3F9]:=0; {Старший байт делителя}
Port[$3F8]:=$0C; {Младший байт делителя}


Port[$3FB]:=$23;
{ бит=
11 8 бит данных
0 1 стоп бит
00 нет четности
1 без бита четности
0
0 бит DLAB
}

Port[$39F]:=$FF; {Разрешить прерывание по завершению передачи символа}
end;
{-------------------------------------------------------------------}

procedure WriteByte(ByteOutToPort:byte);
Begin
Port[$3F8]:=ByteOutToPort;
end;
{-------------------------------------------------------------------}

{ Сделал как в Хелпе }
{$F+}
procedure IntFromRs232;Interrupt;
var SourceOfInt:byte;
begin
SourceOfInt:=Port[$3FA];{Rg Идентификации прерывания}
N:=N+1;

If Fl Then NoSound Else Sound(1000);
Fl:=Not Fl;

end;
{$F-}
{-------------------------------------------------------------------}

Begin
N:=0;
InitPortRs232;

GetIntVec($C, ptrIntFromRs232);
SetIntVec($C, @IntFromRs232);

WriteByte(1);
WriteByte(2);
WriteByte(3);
WriteByte(23);
WriteByte(45);
WriteByte(76);

Writeln(N); {= раз произошло прерывание}
WriteLn("Нажмите любую клавишу для снятия обработчика...");
readln;
SetIntVec($C, ptrIntFromRs232);

End.


 
YAndrey   (2002-09-02 16:34) [1]

Вспомните кто-нибудь старый, добрый ПАСКАЛЬ!!!


 
BillyJeans ©   (2002-09-02 16:48) [2]

If Fl Then NoSound Else Sound(1000);
Fl:=Not Fl;

а что за Fl???


 
Dimk   (2002-09-02 17:40) [3]

У меня есть модуль - я делал его давно.
Отдам как есть. Он работал. Разбираться будешь сам OK?
Пиши мыло.


 
км   (2002-09-02 19:09) [4]

в твоей процедуре старый обработчик вызывается?


 
YAndrey   (2002-09-03 08:03) [5]

BillyJeans:
Fl - просто переменная, 1-е прерывание произошло -- звук врубтлся, 2-ое произошло -- звук вырубился и так д.
На нее можно забить.

Dimk: Спасибочки, бросай!!!
AndreyMyMail@rambler.ru

КМ:
Неа, это простенькая програмулька чтобы проверить будет прерывание или нет, - а его нет!!!




 
Dimk   (2002-09-03 09:19) [6]

To YAndrey
Приехало?


 
Anatoly Podgoretsky ©   (2002-09-03 09:30) [7]

Как определяешь что не приходили прерывания, но так как у тебя нет вызова предыдущего обработчика, то в лучшем случае у тебя будет только одно.


 
BillyJeans ©   (2002-09-03 09:39) [8]

хм, а зачем ты ловишь прерывание?
если скажем прога прямо в порт пишет:
out 3F8h, byte
как ты тут ловить будешь?


 
Dimk   (2002-09-03 09:44) [9]

А оно возникнет если разрешено.
Причем возникает по изменению статуса линии (DTR, DSR и тд)
если последний байт передан
если байт принят.


 
YAndrey   (2002-09-03 10:56) [10]

Dimk - Ага, приехало (пока не разбирался)
Сенгькс

Anatoly Podgoretsky - Так и одног не происходит! N=0

BillyJeans , Dimk - Мне пока важно только происходит Int или нет
поэтому я разрешил все прерывания




... Прогу немного изменил -----все равно остается N=0 !!! перед <<<Нажмите любую клавишу для снятия обработчика...">>.




uses crt,WinDos;
var
ptrIntFromRs232 : Pointer;
Fl : Boolean;
N :Byte;

ByteFromPort:byte;

{ ByteOutToPort:byte;}
{-------------------------------------------------------------------}
procedure InitPortRs232;
var bb:byte;
begin
Port[$3FB]:=128; {Устанавливаем бит DLAB}

{Скорость работы порта 9600 бод/c}
Port[$3F9]:=0; {Старший байт делителя}
Port[$3F8]:=$0C; {Младший байт делителя}
{-----}
Port[$3FB]:=$23;
{ бит=
11 8 бит данных
0 1 стоп бит
00 нет четности
1 без бита четности
0
0 бит DLAB
}
{-----}
Port[$39F]:=$FF; {Разрешить прерывание по завершению передачи символа}


{\\\\\\\\\\\\\\\}
asm
cli ; запретить прерывания
end;

{; in al,21h ; IMR 1-го контроллера прерываний
; and al,not 10h
; out 21h,al ; разрешить прерывания от COM1
}
bb:=port[$21];
bb:= bb and not $10;
port[$21]:=bb;

asm
sti
end;

{\\\\\\\\\\\\\\\}

end;
{-------------------------------------------------------------------}
procedure ReadByte;
begin
ByteFromPort:=Port[$3F8];
end;
{-------------------------------------------------------------------}
procedure WriteByte(ByteOutToPort:byte);
Begin
Port[$3F8]:=ByteOutToPort;
end;
{-------------------------------------------------------------------}

{$F+}
procedure IntFromRs232;Interrupt;
var SourceOfInt:byte;
begin
SourceOfInt:=Port[$3FA];{Rg Идентификации прерывания}
N:=N+1;

{ If Fl Then NoSound Else Sound(1000);Fl:=Not Fl; }

asm
mov al, 20h
out 20h, al
iret
end;

end;
{$F-}

{-------------------------------------------------------------------}

Begin
N:=0;
InitPortRs232;

GetIntVec($C, ptrIntFromRs232);
SetIntVec($C, @IntFromRs232);

WriteByte(1);
Delay(3000);
WriteByte(2);
Delay(3000);
WriteByte(3);
Delay(3000);
WriteByte(23);
Delay(3000);
WriteByte(45);
Delay(3000);
WriteByte(76);

Writeln(N);
WriteLn("Нажмите любую клавишу для снятия обработчика...");
readln;
SetIntVec($1C, ptrIntFromRs232);
End.





 
Dimk   (2002-09-03 11:14) [11]

Port[$39F]:=$FF; {Разрешить прерывание по завершению передачи символа}

Надо похоже $3F9

Пришлось доку читать :0)



Страницы: 1 вся ветка

Текущий архив: 2002.09.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
1-50684
Ionv
2002-09-04 08:10
2002.09.16
Помогите начинающему!!!


8-50871
Darts
2002-05-18 16:30
2002.09.16
Быстрый вывод графики


1-50807
CrazyAngel
2002-09-02 21:26
2002.09.16
Access to process memory


14-50926
Sock
2002-08-20 19:35
2002.09.16
?


8-50873
fore_3
2002-05-16 12:54
2002.09.16
Проблема с перемоткой DVD