IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Хочу прерывание на Паскале от СОМ-порта, (Турбо Паскаль)
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


Программка (запускается под DOS, Win98):


Код

Uses crt, dos;

Label Finish, ll00;

Const
  baud = 38400;
  COM=$3F8 { $2F8 };
  intr=$0C { $0B };

Var
  stv, srv : pointer;
  cnt : word;
  b : byte;
  key : char;
  speed_fr : word;

{----------------------------------------------------------------------------------}
{$F+}
Procedure int_1c; interrupt;
  Begin
    inc(cnt);
    if cnt=18 then begin cnt:=0; write ('g') end;
  End;
{$F-}
{-----------------------------------------------------------------------------------}
{$F+}
Procedure int_rs; interrupt;
  Begin
    b:=port[COM];
    write (b,' ');
  End;
{$F-}
{----------------------------------------------------------------------------------}

BEGIN
  speed_fr:=trunc(115200/baud+0.5);
  port[COM+3]:=$80; { ўЄ«. гбв ­®ўЄ бЄ®p®бвЁ }
  port[COM+1]:=hi(speed_fr); port[COM+0]:=lo(speed_fr);
  port[COM+3]:=$00; { 5 bit, 1 stop, parity=none }
  port[COM+4]:=0;
  port[COM+2]:=$03; { FIFO on }
  port[COM+1]:=$01; { interrupt when rec'd data is available }

  getintvec($1C,stv);
  getintvec(intr,srv);

  cnt:=0;
  setintvec($1C,addr(int_1c));
  setintvec(intr,addr(int_rs));

ll00 :
  if keypressed then begin
    key:=readkey;
    goto Finish;
  end;

{  b:=port[COM+5]; }
{  if (b and $01)<>0 then begin }
{    b:=port[COM]; }
{    write (b,' '); }
{  end; }

  goto ll00;

Finish :
  setintvec($1C,stv);
  setintvec(intr,srv);
  halt;
END.



Процедурка int_1c - для тренировки - раз в сек пишет "g"; работает. По ее образу и подобию - int_rs - должна нaпечатать принятые с СОМ данные. Не работает. Что не так?
Порт настраивается нормально, в этом легко убедиться раскомментировав 5 строчек выше "goto ll00;"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 17:32
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name