![]() |
|
![]() ![]() ![]() |
|
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
При каких условиях возникает прерывание IRQ 7 ?
Пишется обработчик для прерывания от LPT (ассемблерная вставка). Сейчас отлаживаю это под ДОС. Перехватываю прерывание int 0Fh через 25-ю функцию ДОС, но написанный обработчик управление почему-то не получает. Баги в коде более чем возможны; их поиском я занят. Но хотелось бы услышать, когда именно это прерывание возникает? Реально, а не теоретически. Какие сигналы и условия. У меня оно и раньше никогда не работало (но и не нужно было). |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
Когда оно разрешено (см. порт 21h контроллера прерываний). В ДОСе оно обычно маскировано, принтер обслуживается по поллингу. Из общеизвестных программ его используют только программы передачи файлов через принтерный порт. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Прочитал 21-й порт. Старший бит соответствующий IRQ 7 - установлен.
Порт 37A, бит 4 (Еnable) устанавливал как в 0, так и в 1 -никакой разницы. Сигнал ACK (контакт 10 разъема) подаю в ручную. Можно конечно думать, что что-то в коде, но если б баг, то зависание какое-нить, глюк хоть какой-нибудь был бы, а то - ноль эмоций! Полное впечатление, что прерывание не возникает. |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Чтобы избавится от сомнений в корректности кода и проверить: способен ли написанный обработчик хоть что либо возвращать в программу, по чему можно понять что он запускался, я сделал следующее.
Вызвал int 0Fh из совсем другого места программы штатными средствами языка. Обработчик запустился и возвратил результат, который был принят в программе, как и ожидалось. Таким образом, могу с уверенностью говорить, что обработчик работоспособен; это прерывание не возникает. ![]() |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 1 Всего: 6 |
-------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
Какое именно событие, по Вашему мнению, должно привести к возникновению запроса на это прерывание? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Если верить справочнику, то оно должно происходить, когда ACK (конт. 10) устанавливается в 0.
Но на практике этого не происходит. Во всяком случе мне не удалось получить ни разу. А у кого-нибудь реально происходило? Реально на компе, а не по литературе? |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
airyashov: очень интересная статья! Вот бы под VB это прикрутить.
Но пока все-таки я предпочту DOS, потому что прерывание мне нужно для возможно более быстрого считывания состояния порта по стробу. А Винда, прежде чем передать управление драйверу, много всяких операций делать будет, а потом еще сам драйвер, пока функцию вызовет, а потом еще само приложение, пока выполнит команду чтения с порта, опять же через драйвер... Так что этот вариант я отложу на вторые роли, в случае если заработает первый. Я думаю, что гораздо меньшее время я получил бы, если бы сделал в досе простой цикл непрерывного опроса порта на асме. |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 1 Всего: 6 |
если вы пользуетесь принтером, то под DOS встречал такое в "Брэдли Д.Программирование на языке ассемблера для IBM PC":
Один из управляющих битов порта 3BEH (или 37AH) управляет линией прерывания от печатающего устройства. Для того, чтобы печатающее устройство могло посылать свой сигнал прерывания в контроллер 8259, этот бит нужно установить равным 1. Однако адаптер печатающего устройства выдает неверный сигнал прерывания, т.е. выбранный для этой цели сигнал не вызывает правильного прерывания. Поэтому не стоит и пытаться писать программу, которая бы использовала возможности прерывания от адаптера печатающего устройства (если вы не захотите физически изменить плату печатающего устройства). Далее мы приведем пример, который обходит эту проблему с помощью системного таймера. Возможно в BIOS отключено прерывание для LPT, думаю Вам ничего не мешает проверить и под Windows. -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Во-первых, этот бит, как я выше уже писал мною устанавливался. (Кстати, в справочнике написано, что должно быть 0. Я пробовал и 0 и 1).
Во-вторых, сигнал прерывания формируется мною сейчас в ручную (на резисторе), и может быть сделан как в 0, так и в 1, что я тоже испробовал, и так же безрезультатно. В третьих, в БИОС я залез. Там есть настройка периферии, и LPT на выбор можно установить IRQ. У меня выбрано 7. Кроме того в БИОСе есть переключение режимов порта: Normal, Bi-Dir, EPP, EPP+ECP. Я попробовал каждый. Прерывание не возникало ни в одном. Если Бредли так категоричен, что "не стоит и пытаться", это наводит на размышления. Очевидно у него тоже не заработало и он не нашел причину этого. А Вы сами лично, уважаемый airyashov, работали собственноручно с прерыванием от LPT или нет? Добавлено через 5 минут и 45 секунд ЗЫ. Нет, не пользуюсь принтером, а делаю прогу для приема данных через LPT, причем передающее устройство не квитируется((((( А принтер и без прерываний хорошо работает. |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
Не, я ща помру!
Прерывание не имеет никакого отношения к событиям на контактах разъема! Прерывание происходит по окончании вывода символа (на печать) - т.е. оно свидетельствует, что помещенный в регистр данных байт выставлен на внешних цепях! Все! -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Значит справочники врут?..
Пожалуйста посмотрите статью, на которую дал ссылку airyashov выше; особенно ее конец. И, умоляю Вас, не помирайте. Вы нам нужны даже такой ![]() Это сообщение отредактировал(а) JusTalionis - 28.7.2008, 13:00 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
Смотрел. Если учесть что С++ (да и Дельфи) для меня тёмный лес... но даже мне понятно, что сам драйвер предлагается в форме черного ящика. На что он там реагирует - я лично не в курсах, и соответственно понятия не имею, что вызывает возникновение вызова обработчика прерывания, если оно вообще возникает на самом деле за счет генерирования IRQ7. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Тем не менее, автор статьи тоже считает, что прерывание должно вызываться сигналом на 10-ом контакте.
Может быть он заблуждается? |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Спасибо, airyashov, Вы очень хорошие даете ссылки.
ИМХО, эту (последнюю) надо бы скопировать куда-нибудь в FAQ. |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Урря! я отловил прерывание!
![]() Прерывание заработало от 10-го контакта. Спасибо всем участвовавшим; вопрос решен. |
|||
|
||||
airyashov |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 1 Всего: 6 |
тут же ясно сказано было, чтобы было не замаскировано ![]() Порт 21h - OCW1 регистр маски прерываний (IMR) биты 7..0 0 обслуживание прерывания, 1 маскирование прерывания; Это сообщение отредактировал(а) airyashov - 30.7.2008, 12:47 -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
|||
|
||||
JusTalionis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 11.7.2006 Репутация: нет Всего: 17 |
Знаю)))) вот чо-то не сориентировался))))
на всякого мудреца довольно простоты, как известно ;)) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm для Windows/DOS" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для Windows/Dos | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |