Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывание от LPT 
V
    Опции темы
JusTalionis
Дата 26.7.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



При каких условиях возникает прерывание IRQ 7 ?

Пишется обработчик для прерывания от LPT  (ассемблерная вставка).

Сейчас отлаживаю это под ДОС.

Перехватываю прерывание int 0Fh через 25-ю функцию ДОС, но написанный обработчик управление почему-то не получает.
Баги в коде более чем возможны; их поиском я занят. Но хотелось бы услышать, когда именно это прерывание возникает? Реально, а не теоретически.
Какие сигналы и условия.
У меня оно и раньше никогда не работало (но и не нужно было).

PM MAIL   Вверх
Akina
Дата 26.7.2008, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(JusTalionis @  26.7.2008,  18:20 Найти цитируемый пост)
когда именно это прерывание возникает? Реально, а не теоретически.

Когда оно разрешено (см. порт 21h контроллера прерываний). 
В ДОСе оно обычно маскировано, принтер обслуживается по поллингу. Из общеизвестных программ его используют только программы передачи файлов через принтерный порт.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 27.7.2008, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



Прочитал 21-й порт. Старший бит соответствующий IRQ 7 - установлен.
Порт 37A, бит 4 (Еnable) устанавливал как в 0, так и в 1 -никакой разницы.
Сигнал ACK (контакт 10 разъема) подаю в ручную.

Можно конечно думать, что что-то в коде, но если б баг, то зависание какое-нить, глюк хоть какой-нибудь был бы, а то - ноль эмоций!
Полное впечатление, что прерывание не возникает.

PM MAIL   Вверх
JusTalionis
Дата 27.7.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



Чтобы избавится от сомнений в корректности кода и проверить: способен ли написанный обработчик хоть что либо возвращать в программу, по чему можно понять что он запускался, я сделал следующее.
Вызвал int 0Fh из совсем другого места программы штатными средствами языка. Обработчик запустился и возвратил результат, который был принят в программе, как и ожидалось.
Таким образом, могу с уверенностью говорить, что обработчик работоспособен; это прерывание не возникает.

 smile Помогите понять, почему.
PM MAIL   Вверх
airyashov
Дата 28.7.2008, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 1
Всего: 6



посмотрите вот это
http://www.pcports.ru/xDRV_sys.php


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Akina
Дата 28.7.2008, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(JusTalionis @  27.7.2008,  11:27 Найти цитируемый пост)
это прерывание не возникает.

  Помогите понять, почему. 

Какое именно событие, по Вашему мнению, должно привести к возникновению запроса на это прерывание?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 28.7.2008, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



Если верить справочнику, то оно должно происходить, когда ACK (конт. 10) устанавливается в 0.
Но на практике этого не происходит. Во всяком случе мне не удалось получить ни разу.
А у кого-нибудь реально происходило? Реально на компе, а не по литературе?

PM MAIL   Вверх
JusTalionis
Дата 28.7.2008, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



airyashov: очень интересная статья! Вот бы под VB это прикрутить.
Но пока все-таки я предпочту DOS, потому что прерывание мне нужно для возможно более быстрого считывания состояния порта по стробу. А Винда, прежде чем передать управление драйверу, много всяких операций делать будет, а потом еще сам драйвер, пока функцию вызовет, а потом еще само приложение, пока выполнит команду чтения с порта, опять же через драйвер...
Так что этот вариант я отложу на вторые роли, в случае если заработает первый.
Я думаю, что гораздо меньшее время я получил бы, если бы сделал в досе простой цикл непрерывного опроса порта на асме.

PM MAIL   Вверх
airyashov
Дата 28.7.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 1
Всего: 6



если вы пользуетесь принтером, то под DOS встречал такое в "Брэдли Д.Программирование на  языке ассемблера для  IBM PC":
Один из управляющих битов порта 3BEH (или 37AH) управляет
    линией прерывания от печатающего устройства. Для того, чтобы
    печатающее устройство могло посылать свой сигнал прерывания в
    контроллер 8259, этот бит нужно установить равным 1. Однако адаптер
    печатающего устройства выдает неверный сигнал прерывания, т.е.
    выбранный для этой цели сигнал не вызывает правильного прерывания.
    Поэтому не стоит и пытаться писать программу, которая бы
    использовала возможности прерывания от адаптера печатающего
    устройства (если вы не захотите физически изменить плату
    печатающего устройства). Далее мы приведем пример, который обходит
    эту проблему с помощью системного таймера.

Возможно в BIOS отключено прерывание для LPT, думаю Вам ничего не мешает проверить и под Windows.


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
JusTalionis
Дата 28.7.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



Во-первых, этот бит, как я выше уже писал мною устанавливался. (Кстати, в справочнике написано, что должно быть 0. Я пробовал и 0 и 1).
Во-вторых, сигнал прерывания формируется мною сейчас в ручную (на резисторе), и может быть сделан как в 0, так и в 1, что я тоже испробовал, и так же безрезультатно.
В третьих, в БИОС я залез. Там есть настройка периферии, и LPT на выбор можно установить IRQ. У меня выбрано 7.
Кроме того в БИОСе есть переключение режимов порта: Normal, Bi-Dir, EPP, EPP+ECP. Я попробовал каждый. Прерывание не возникало ни в одном.

Если Бредли так категоричен, что "не стоит и пытаться", это наводит на размышления. Очевидно у него тоже не заработало и он не нашел причину этого.

А Вы сами лично, уважаемый airyashov, работали собственноручно с прерыванием от LPT или нет?

Добавлено через 5 минут и 45 секунд
ЗЫ. 
Нет, не пользуюсь принтером, а делаю прогу для приема данных через LPT, причем передающее устройство не квитируется(((((
А принтер и без прерываний хорошо работает.

PM MAIL   Вверх
Akina
Дата 28.7.2008, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Не, я ща помру! 

Прерывание не имеет никакого отношения к событиям на контактах разъема! Прерывание происходит  по окончании  вывода символа  (на печать) - т.е. оно свидетельствует, что помещенный в регистр данных байт выставлен на внешних цепях! Все!


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 28.7.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



Значит справочники врут?..
Пожалуйста посмотрите статью, на которую дал ссылку airyashov выше; особенно ее конец.
И, умоляю Вас, не помирайте. Вы нам нужны даже такой smile 

Это сообщение отредактировал(а) JusTalionis - 28.7.2008, 13:00
PM MAIL   Вверх
Akina
Дата 28.7.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(JusTalionis @  28.7.2008,  13:59 Найти цитируемый пост)
Пожалуйста посмотрите статью, на которую дал ссылку airyashov выше; особенно ее конец.

Смотрел. Если учесть что С++ (да и Дельфи) для меня тёмный лес... но даже мне понятно, что сам драйвер предлагается в форме черного ящика. На что он там реагирует - я лично не в курсах, и соответственно понятия не имею, что вызывает возникновение вызова обработчика прерывания, если оно вообще возникает на самом деле за счет генерирования IRQ7.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
JusTalionis
Дата 28.7.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: нет
Всего: 17



Тем не менее, автор статьи тоже считает, что прерывание должно вызываться сигналом на 10-ом контакте.
Может быть он заблуждается?

PM MAIL   Вверх
airyashov
Дата 29.7.2008, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 1
Всего: 6



Запрос аппаратного прерывания (обычно IRQ7 или IRQ5) вырабатывается по отрицательному перепаду сигнала на выводе 10 разъема интерфейса (Ack#) при установке CR.4=1. Во избежание ложных прерываний контакт 10 соединен резистором с шиной +5 В. Прерывание вырабатывается, когда принтер подтверждает прием предыдущего байта. Как уже было сказано, BIOS это прерывание не использует и не обслуживает.
http://www.sibsutis.ru/~mavr/PC/LPT/1.HTM



--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.