Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Прерывание от LPT


Автор: JusTalionis 26.7.2008, 17:20
При каких условиях возникает прерывание IRQ 7 ?

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

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

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

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

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

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

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

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

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

Автор: airyashov 28.7.2008, 07:55
посмотрите вот это
http://www.pcports.ru/xDRV_sys.php

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

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

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

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

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

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

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

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

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

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

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

Автор: Akina 28.7.2008, 11:50
Не, я ща помру! 

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

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

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

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

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

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

Автор: JusTalionis 29.7.2008, 11:00
Спасибо, airyashov, Вы очень хорошие даете ссылки.
ИМХО, эту (последнюю) надо бы скопировать куда-нибудь в FAQ.

Автор: JusTalionis 29.7.2008, 18:20
Урря! я отловил прерывание!  smile Все было просто: соответствующий бит порта 21h должен быть сброшен, а четвертый бит 37Ah - установлен, а не наборот, как мне казалось почему-то.
Прерывание заработало от 10-го контакта.
Спасибо всем участвовавшим; вопрос решен.

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

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

тут же ясно сказано было, чтобы было не замаскировано smile
Порт 21h - OCW1 регистр маски прерываний (IMR)
биты 7..0 0 обслуживание прерывания,
1 маскирование прерывания;


Автор: JusTalionis 30.7.2008, 18:42
Знаю)))) вот чо-то не сориентировался))))
на всякого мудреца довольно простоты, как известно ;))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)