Проблема считывания данных из LPT

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
[km]REX
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб окт 30, 2010 18:06:31

Проблема считывания данных из LPT

Сообщение [km]REX »

Используя библиотеку inpout32.dll, написал тестовую программку для ЛПТ-порта.
При выводе данных на информационную шину - все нормально, 0 и 1 меняются.

Но вот при использовании функции Inp32(888) возникли проблемы.
1) Когда отпраляю данные (например Out32(888,125), а затем считываю Inp32(888), все ОК - приходит число - 125.
2) Затем сожаю любую линию на "землю" (конечно же через ограничительный резистор), то результат не меняется - так же число 125.

Посмотрел на сайте - http://cxem.net/comp/comp87.php, что еще нужно настроить шину данных на ввод. Подал как там и сказано в регистр управления число - 43, но результата нет: Считываемое значение не отличается от записанного.

Подскажите в чем может быть проблема!
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Проблема считывания данных из LPT

Сообщение ChipKiller »

Подскажите в чем может быть проблема!
... проблема в том, что у LPT существует много режимов работы - возможно "нужный", если возможно, придется выбрать в BIOSe.
Mickle
Поставщик валерьянки для Кота
Сообщения: 2337
Зарегистрирован: Чт сен 09, 2010 07:32:24
Откуда: г. Рыбинск

Re: Проблема считывания данных из LPT

Сообщение Mickle »

Если в BIOS установлен режим работы параллельного порта, как ECP или ECP+EPP, а в регистре ECP ECR установлен режим 001b ("двунаправленный байтовый"), тогда 5-й бит порта управления позволит изменять направление передачи.
Инициализация интерфейса может выглядеть примерно так:

Код: Выделить всё

    mov     dx,BasePort
    add     dx,402h             {ECP ECR address}
    in      al,dx               {load current value}
    and     al,00011111b        {clear mode bits}
    or      al,00100000b
    out     dx,al               {set bidirectional byte mode}
    mov     dx,BasePort
    add     dx,2
    mov     al,00100000b        {set read data mode and no interrupts}
    out     dx,al
[km]REX
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб окт 30, 2010 18:06:31

Re: Проблема считывания данных из LPT

Сообщение [km]REX »

Спасибо, надо попробовать !
[km]REX
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб окт 30, 2010 18:06:31

Re: Проблема считывания данных из LPT

Сообщение [km]REX »

Если в BIOS ставлю только EPP, то байт считывается с шины данных.

А если же ECP+EPP,то не считывается. Понимаю так, что не получается задать режим LPT-порту на прием. Может кроме как взведения 5-ого бита в регистре управления, что то еще нужно ?

а в регистре ECP ECR установлен режим 001b
. Что за ECR ? И где он ?
Mickle
Поставщик валерьянки для Кота
Сообщения: 2337
Зарегистрирован: Чт сен 09, 2010 07:32:24
Откуда: г. Рыбинск

Re: Проблема считывания данных из LPT

Сообщение Mickle »

ECR - это один из конфигурационных регистров ECP. Он находится в адресном пространстве портов ввода-вывода по смещению 402h относительно базового адреса LPT порта. Старшие 3 бита этого регистра позволяют менять режим работы ECP:
000 - Режим стандартного параллельного порта (SPP)
001 - Режим PS/2 (то же, что и 000, только двунаправленный)
010 - Режим с поддержкой FIFO/DMA
011 - Режим ECP
100 - Зарезервирован (режим EPP)
101 - Зарезервирован
110 - Тестовый режим
111 - Режим конфигурации

Таким образом, если порт сконфигурирован в BIOS как ECP и меня интересует двунаправленный режим, то я должен:
1) Определить адрес ECR регистра. Допуская, что базовый адрес параллельного порта BasePort = 378h, прибавляем к нему 402h и получаем 77Ah.
2) Прочитать текущее значение регистра ECR.
3) Установить его старшие три бита в соответствии с выбранным режимом (001b).
4) Записать новое значение обратно в ECR.
Теперь я могу менять направление обмена данными с помощью 5-го (6-го по счёту) бита в регистре управления принтером (адрес BasePort+2 или 37Ah).
P.S. Тот кусочек кода, который я привёл ранее, проделывает именно эту последовательность.
[km]REX
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Сб окт 30, 2010 18:06:31

Re: Проблема считывания данных из LPT

Сообщение [km]REX »

Спасибо Mickle ! :beer:
Совсем разобрался. Теперь все работает 8)
Vanyok07_3
Родился
Сообщения: 1
Зарегистрирован: Пн апр 16, 2012 00:38:54

Re: Проблема считывания данных из LPT

Сообщение Vanyok07_3 »

Доброго времени суток. Вижу что тему давно не затрагивали, но т.к. разобрались может и мне ответите и поможете чем нибудь. Мне нужно разобраться с LPT и управлять через него и параллельный адаптер кр580вв55а. Но это пока еще не важно, мне для начала нужно научится работать с портом чтобы ничего не спалить. Мне дали задание, настроить порт в режим би-дирекшн установить порт данных на ввод. Далее с контрол порта посылать сигнал и считывать их на порту данных. Но я не пойму вот какую вещь, я перевожу порт в bi-directional выставляю пятый бит контрол порта в 1 тоесть линии на ввод. И у меня на линиях 2-9 все 1 то есть число 255. Я читал в статье на схем.нет что вроде должно быть так. Но мне преподаватель говорит что должно все перейти в ноль и принимать. Вот этот момент вобщем не понятен. Как убедится что линии настроились на ввод и что если перемычкой с контрол порта подать 1. Спасибо
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Проблема считывания данных из LPT

Сообщение Alexeyslav »

Пока выводы порта висят в воздухе - там может быть все что угодно. Подключи на вывод порта мультивибратор с частотой 1Гц, тогда ты можешь убедится что порт находится в режиме ввода по меняющемуся состоянию считанных данных.

Вообще не советую работать с LPT через порты... в любой момент времени виндовс может опросить "принтер" с непредсказуемыми последствиями для себя и твоей программы.

И чтобы управлять BB55 нужно как минимум 5 дополнительных сигналов на вывод.
Mickle
Поставщик валерьянки для Кота
Сообщения: 2337
Зарегистрирован: Чт сен 09, 2010 07:32:24
Откуда: г. Рыбинск

Re: Проблема считывания данных из LPT

Сообщение Mickle »

И входы и выходы LPT на всех современных (и не очень) Multi IO/LPC чипах подключены к +5 В через "подтягивающие" резисторы с сопротивлением порядка нескольких кОм.
Чтобы Windows не опрашивала периодически порт, нужно импортировать в реестр следующий ключ:

Код: Выделить всё

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Parport\Parameters]
"DisableWarmPoll"=dword:00000001

Как установить "двунаправленный байтовый" режим с помощью регистра ECP ECR описано в данном топике. Без этого переключить порт данных на ввод вряд ли получится.
Ответить

Вернуться в «Интеграция с ПК»