Использование Ассемблера в Паскале.

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Delphin
Сообщения: 2
Зарегистрирован: 18 окт 2004, 11:23
Контактная информация:

Доброго времени суток, о All !!!

По роду деятельности занимаюсь программированием в среде 1С, и поэтому напрочь забыл другие языки....
Вопрос в следующем:
В среде ТурбоПаскаль необходимо написать функцию, которая бы вытаскивала из LPT порта 5 битов банных, и по окончании опроса кидала бы туда бит обнуления. К LPT прикручена плата, обслуживающая датчик. Причем, сам опрос должен происходить ровно 100 раз в секунду (или 10), лучше вообще через произвольный период времени. Далее данные складываются в файл и затем обрабатываются - но это я сам уже :-). А вот сопряжение -Ето промблемма......
ОС - Дос эмуляция под windiws9х.

Заранее Благодарен за намеки? подсказки, куски кода..... :-)
если не затруднит - можно на личку savchenko_mail@rambler.ru
ICQ 331556383
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Проблема в чем? В использовании ассемблера или параллельного порта?

Если первое, то

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

asm
   ...
end;
Что касается платы, то она просто формирует TTL-уровни на разных контактах, или она еще умеет посылать стробирующий сигнал, по переднему фронту которого надо начать чтение?
Delphin
Сообщения: 2
Зарегистрирован: 18 окт 2004, 11:23
Контактная информация:

Проблема в том, чтобы программа САМА 10 раз в секунду его опрашивала, схема только формирует уровни на входе, никаких стробов не предусмотрено.
Это можно сделать паскалевским Delay(Х); но тогда придется колибровать размер Х под каждую конкретную машину. В принципе это выход, но скорее всего есть альтернативный вариант - как-то привязаться к таймеру БИОСа - а вот как - эт я не знаю. :?:
Спасибо заранее.....
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Вообще-то Delay сам настраивается на конкретную машину и опрделяет задержку в милисекундах.

Но есть большая проблема - быстрых пеньках в CRT.TPU возникает ошибка у которой есть решение (уже обсуждалось тут), но это решение делает неприменимым Delay, так как сделает его независимым от X :(

Другая сторона вопроса - это вытесняющая многозадачность. Если ОС Вашему приложению не выделит квант времени, но оно просто может "профукать" несколько изменений датчика (например, во время записи чего-нибудь на диск). Т.е. высокую точность обеспечить не удастся в любом случае.
В принципе это выход, но скорее всего есть альтернативный вариант
Надо определиться, желаете ли Вы использовать эту программу только как ДОС-приложение в DOS/Windows 9x? В WinAPI есть функция Sleep. Есть таймеры в Windows. Есть прерывание таймера, и для ДОС не сложно сделать обработчик этого прерывания. Однано тик таймера - это 18.2 раза в секунду - т.е. для Вашей задачи маловато будет!

Проще сделать так, как это делает Delay, но для счетчика использовать бОльшую разрядную сетку. Если дизасемблировать программу, использующую Delay, то видно, что при инициализации библиотеки CRT.TPU подсчитывается сколько раз протикает таймер при выполнении процедуры с пустым циклом на N итераций, затем вычисляется сколько итераций должна занимать одна милисекунда. Затем функция Delay вызывает X раз эту внутреннюю процедуру (которая не включена в секцию interface). В принципе, не так уж важно Ассемблер Вы будете использовать для этого или паскаль....
Ответить