· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Чтение LPT в режиме ECP на Asm

Посл.отвђт Сообщенiе


Дата: Мар 15, 2004 19:18:18

Всем привет!
Помогите, кто знает, как считывать данные D7...D0 с LPT в режиме ECP с созданием массива из трех колонок (в каждой байт) и N - строк, в реальном масштабе времени с последующим сохранением массива в текстовом файле.

Протокол приема от ПУ через LPT
1. Хост запрашивает изменение направления канала, устанавливая низкий уровень на линии ReverseRequest#(16) “адрес 37Ah бит 2”.
2. ПУ разрешает смену направлений установкой низкого уровня на линии Ack-Reverse#(12) “адрес 379h бит 5” ("0" аппаратно).
3. ПУ помещает данные на шину канала Data0(2)...Data7(9) “адрес 378h биты 0-7” и устанавливает признак цикла данных (высокий уровень) или команды (низкий уровень) на линии PeriphAck(11) “адрес 379h бит 7”.
4. ПУ устанавливает низкий уровень на линии PeriphClk(10) “адрес 379h бит 6”, указывая на действительность данных.
5. Хост отвечает установкой высокого уровня на линии HostAck(14) “адрес 37Ah бит 1”.
6. ПУ устанавливает высокий уровень на линии PeriphClk(10) “адрес 379h бит 6” и этот перепад используется для фиксации данных хостом.
7. Хост устанавливает низкий уровень на линии HostAck(14) “адрес 37Ah бит 1” для указания готовности к приему следующего байта.
В BIOS режим ECP для LPT1 установлен.
Реально данные передаются с Pic-контроллера, необходимо их принять и сохранить в текстовом файле.

Александр


Дата: Мар 15, 2004 19:59:33

aplet
Это всё для DOS? Тогда нужно скачать документацию/туториал по LPT (там даже примеры кода есть для приёма данных в режиме ECP). Название доки не помню, но её(их) легко найти в сети.

ЗЫ: Проблемы начинаются в Windows, особенно NT.


Дата: Мар 16, 2004 09:45:04

Не имеет значения, но проще, конечно, под Dos, система Win98SE. Не получается прочитать данные с базового адреса, а вот с +1 принимаются и на +2 передаются.
Примеров на Asm для чтения LPT в режиме ECP не нашел, вот и обращаюсь к тем, кто знает.

Александр


Дата: Мар 27, 2004 14:11:51

Посмотри описание регистров и примеры на http://www.beyondlogic.org/. Для семейки Windows NT, чтобы изменить IOPL процесса, нужно ставить виртуальный драйвер. Пример небольшого драйвера (NT-сервиса) и кривой код его рантайм установки в виндах находятся там же (предварительно копируешь его в System32\Drivers и там регистрируешь).

А как? Используя базовый адрес порта и смещение на регистр читаеш и записываеш регистры контроллера LPT инструкциями in и out. В упрощении выглядит примерно так:

#define LPT_DATA_OFF 0x0000
#define LPT_STAT_OFF 0x0001
#define LPT_CTRL_OFF 0x0002

mov dx, PortBase + LPT_DATA_OFF ; адрес регистра
in al, dx ; типа читаешь то, что в данный момент находится на D0..D7

mov al, Value ; чо писать
mov dx, PortBase + LPT_CTRL_OFF ; куда писать
out dx, al ; и поехали...

Непомню уже, но с установками BIOS/Windows тоже были какие-то глюки. Адреса регистров и биты конфигурации между DOS и Windows меняются (только местами). Перед началом работы надо запомнить состояние контрольных регистров, вклеить туда свои установки, проверить существует ли порт, вписывая и читая регистр данных. Если не получилось, вернуть состояние всех изменённых регистров и пробовать иначе... и куча подоного мусора... Притом другие программы под Windows паралельно твоей могут безнаказанно менять состояние порта вываливая комунакацию т.к. никакого взаимоисключения нет.

Короче програмировать LPT весело, вот только принятия длинного потока данных в реальном времени с высокой скоростью передачи не вешая компа, без углубления в сторону DDK и системы установки прерываний, добится достаточно таки сложно (однако не невоможно).

К сведенью: порт LPT в режиме ECP (т.е. двусторонняя связь, когда комп умеет принимать данные) работает не на всех матерях. Особенно заметно на старых ноутбуках класса Pentium 133 (временами встречал и таких "потребителей").

Чаще для выполнения терминала, логгера и каждой другой херни, если скоростёнка позволит, юзают RS-232 - просто гораздо меньше промлем. На худой конец привязать даже контроллер по USB гораздо проще чем LPT.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088