Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывание от 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   Вверх
JusTalionis
Дата 29.7.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


Опытный
**


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

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



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

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


Опытный
**


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

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



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

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

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



Это сообщение отредактировал(а) airyashov - 30.7.2008, 12:47


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


Опытный
**


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

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



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

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

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


 




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


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

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