Текущий архив: 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.47 MB
Время: 0.006 c