Вот кусок ТЗ
"Алгоритм записи:
CLK 2 нога разъёма LPT – порта.
DATA 3 нога разъёма LPT – порта.
Исходно состояние выводов CLK и DATA высокое. Падение фронта CLK означает начало передачи информации в прибор. Низкий уровень CLK держится 0.1 мсек. В течение этого времени надо установить старший бит байта данных на выводе DATA. Далее (по истечении 0.1 мсек) состояние CLK переводится в высокое и ждём ещё 0.1 мсек. Затем процесс повторяется для остальных битов."
Вопросы:
1. Что мне писать в 378-ой порт? (или в другой?)
2. Реально ли перещелкивать с такой частотой значение в порту? Чего-то я не припомню в винде таймера точнее 1 мсек.
Здравствуйте, Demon, Вы писали:
D>Господа!
D>Вот кусок ТЗ D>"Алгоритм записи: D>CLK 2 нога разъёма LPT – порта. D>DATA 3 нога разъёма LPT – порта. D>Исходно состояние выводов CLK и DATA высокое. Падение фронта CLK означает начало передачи информации в прибор. Низкий уровень CLK держится 0.1 мсек. В течение этого времени надо установить старший бит байта данных на выводе DATA. Далее (по истечении 0.1 мсек) состояние CLK переводится в высокое и ждём ещё 0.1 мсек. Затем процесс повторяется для остальных битов."
D>Вопросы: D>1. Что мне писать в 378-ой порт? (или в другой?) D>2. Реально ли перещелкивать с такой частотой значение в порту? Чего-то я не припомню в винде таймера точнее 1 мсек.
2 нога это D0 регистра адреса, а 3 нога — D1. Следовательно, чтобы выставить CLK-->1, надо ставить в выводимом байте разряд 0, соотв., DATA разряд 1.
Насчёт 0.1 мс надо бы просить разработчиков ТЗ уточнить, это строго "0.1 мс", или "не менее 0.1 мс"
Вообще можно сделать такую задержку. Самый простой вариант — читать тот же порт 378 в цикле.
На одно чтение приходится примерно 0.6-0.8 мкс.
Более правильный способ — KeDelayExecutionThread() внутри драйвера.
Здравствуйте, CH3COOH, Вы писали:
D>>Вот кусок ТЗ D>>"Алгоритм записи: D>>CLK 2 нога разъёма LPT – порта. D>>DATA 3 нога разъёма LPT – порта. D>>Исходно состояние выводов CLK и DATA высокое. Падение фронта CLK означает начало передачи информации в прибор. Низкий уровень CLK держится 0.1 мсек. В течение этого времени надо установить старший бит байта данных на выводе DATA. Далее (по истечении 0.1 мсек) состояние CLK переводится в высокое и ждём ещё 0.1 мсек. Затем процесс повторяется для остальных битов."
D>>Вопросы: D>>1. Что мне писать в 378-ой порт? (или в другой?)
CHC>2 нога это D0 регистра адреса, а 3 нога — D1. Следовательно, чтобы выставить CLK-->1, надо ставить в выводимом байте разряд 0, соотв., DATA разряд 1.
Т.е. вот так?
mov dx,378h
//запись бита '0' из потока данных
mov al,0
out dx,al
// sleep 0.1 msec
mov al,80h
out dx,al
// sleep 0.1 msec
//запись бита '1' из потока данных
mov al,40h
out dx,al
// sleep 0.1 msec
mov al,C0h
out dx,al
Здравствуйте, Demon, Вы писали:
D>Здравствуйте, CH3COOH, Вы писали:
D>>>Вот кусок ТЗ D>>>"Алгоритм записи: D>>>CLK 2 нога разъёма LPT – порта. D>>>DATA 3 нога разъёма LPT – порта. D>>>Исходно состояние выводов CLK и DATA высокое. Падение фронта CLK означает начало передачи информации в прибор. Низкий уровень CLK держится 0.1 мсек. В течение этого времени надо установить старший бит байта данных на выводе DATA. Далее (по истечении 0.1 мсек) состояние CLK переводится в высокое и ждём ещё 0.1 мсек. Затем процесс повторяется для остальных битов."
D>>>Вопросы: D>>>1. Что мне писать в 378-ой порт? (или в другой?)
CHC>>2 нога это D0 регистра адреса, а 3 нога — D1. Следовательно, чтобы выставить CLK-->1, надо ставить в выводимом байте разряд 0, соотв., DATA разряд 1.
D>Т.е. вот так? D>
D> mov dx,378h
D>//запись бита '0' из потока данных
D> mov al,0
D> out dx,al
D> // sleep 0.1 msec
D> mov al,80h
D> out dx,al
D> // sleep 0.1 msec mov al,1
out dx,al
D>//запись бита '1' из потока данных
D> mov al,40h
D> out dx,al
D> // sleep 0.1 msec
D> mov al,C0h
D> out dx,al
mov al,1
out dx,al
D>
Судя по ТЗ, ты должен вернуть CLK в высокое состояние после передачи каждого бита(выделено болдом).
Странно, что разработчики не посадили CLK на 1-ю ногу LPT порта(Strobe) — было бы очень удобно, не надо его сбрасывать в исходное состояние — это производится автоматически. Да и время импульса на ноге 1 отмеряется самим контроллером LPT и является величиной постоянной и известной
Хотя, если это все только в учебных целях, то другое дело.
Re: разъясните плиз про LPT
От:
Аноним
Дата:
18.11.03 12:48
Оценка:
Здравствуйте, Demon, Вы писали:
D>Господа!
D>Вот кусок ТЗ D>"Алгоритм записи: D>CLK 2 нога разъёма LPT – порта. D>DATA 3 нога разъёма LPT – порта. D>Исходно состояние выводов CLK и DATA высокое. Падение фронта CLK означает начало передачи информации в прибор. Низкий уровень CLK держится 0.1 мсек. В течение этого времени надо установить старший бит байта данных на выводе DATA. Далее (по истечении 0.1 мсек) состояние CLK переводится в высокое и ждём ещё 0.1 мсек. Затем процесс повторяется для остальных битов."
D>Вопросы: D>1. Что мне писать в 378-ой порт? (или в другой?) D>2. Реально ли перещелкивать с такой частотой значение в порту? Чего-то я не припомню в винде таймера точнее 1 мсек.
Ответ. Точно просчитать время в винде НЕ НЕАЛЬНО, т.к. винда — ОС НЕ РЕАЛЬНОГО ВРЕМЕНИ!
Таймера, конечно, меньше чем на 1 мС нет, но можно использовать счетчики производительности. Там отсчет идет в единицах по 100 нС. Две функции: установка частоты и чего-то еще (см MSDN). Далее в ТЗ должна быть указана погрешность в частоте ибо точно такой период сделать вряд-ли у кого получится. Далее, насколько я знаю, у ЛПТ порта ножки 2-8 — выводы данных, => нет никаких проблем в порт записать байт меняя поочередно младший бит.
Основная проблема — доступ к портам в винде (98 обходится обычным outport, а вот 2000 не позволит напрямую писать в порт — здесь лажа). Мона написать свой драйвер ЛПТ порта, который обрабатывает все запросы и передает их дальше+имеется твоя функция записи. Словом выбирай.
Здравствуйте, Demon, Вы писали:
D>Вот кусок ТЗ D>"Алгоритм записи: D>CLK 2 нога разъёма LPT – порта. D>DATA 3 нога разъёма LPT – порта. D>Исходно состояние выводов CLK и DATA высокое. Падение фронта CLK означает начало передачи информации в прибор. Низкий уровень CLK держится 0.1 мсек. В течение этого времени надо установить старший бит байта данных на выводе DATA. Далее (по истечении 0.1 мсек) состояние CLK переводится в высокое и ждём ещё 0.1 мсек. Затем процесс повторяется для остальных битов."
Замахаешься ты под виндой релтайм делать Если на времена жесткие ограничения придется писать драйвер м не факт что все получится. D>Вопросы: D>1. Что мне писать в 378-ой порт? (или в другой?)
сходи www.beyondlogic.org там описания работы порта есть, краткие правда.
D>2. Реально ли перещелкивать с такой частотой значение в порту? Чего-то я не припомню в винде таймера точнее 1 мсек.
Что-то типа GetPerfomanceTimer, ну и rdtsc.