Как написать программу для управления LPT портом?

Тема в разделе "WASM.BEGINNERS", создана пользователем X66, 20 дек 2008.

  1. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    Кто нибудь может дать простой текст программы? желательно написанный в паскале.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Booster
    А как без прерываний юзоть. Нужно подвеситсо на прерывание от порта(IoConnectInterrupt() etc.) и когда устройство подаст запрос он инициирует обработку его. Если ты никогда не юзал прерывания, значит устройство весьма простое, например выдали на порт команду, устройство ответило и мы её тутже считали. А темболее тут используется оцифровка сигнала, если тупо цикл опроса сделоть, то это неслабо ядро подвесит.
     
  3. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    Clerk
    мне надо выдать по 1 линии команду и считать по 11 линии ответную команду
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Могет быть. Я делал именно опросом, загрузка цп была конечно неслабая.
    За IoConnectInterrupt спасибо, буду это копать. Хотя насколько мне известно для ком портов в винде уже есть поддержка прерываний через API. Для LPT не в курсе.
     
  5. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    Кто нить мне поможет прогу написать???
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Вобщем прикинул, чтобы вектор найти нужно послать дрову IOCTL_INTERNAL_GET_MORE_PARALLEL_PORT_INFO(http://msdn.microsoft.com/en-us/library/ms799447.aspx), он возвратит структуру MORE_PARALLEL_PORT_INFORMATION(http://msdn.microsoft.com/en-us/library/ms799428.aspx), в которой есть номер вектора и походу порта тоже, хотя это нужно проверить, или хотябы спросить тут у когонибудь, Four-F или есчо у кого, кто хорошё в запросах разбираетсо.
    Далее дров(parport.sys) уже имеет этот вектор, ибо он его захватывоет при запуске, поэтому приконектится к этому прерыванию нормально не получитсо, я бы вначале снял его и подключил своё.
     
  7. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    кто нибудь может просто прогу написать???
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это не просто прога, это дров.
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    фишка LPT в том что максимальная частота передачи ~2МГц дальше трудно получить синхронность на линиях при проводах >1м поэтому эта скорость принудительно аппаратно ограничивается (!) и делается это традиционно начиная с 286 и по сей день через приостановку работы процессора :)) поэтому в многозадачной системе получаем глухой зависон - частота процессора фактически падает до этих 2МГц и нет никакой возможности отдать эти такты другим задачам :) избежать этого можно только в "самом крутом" режиме (ecp он кажется называется) где есть FIFO и прерывание по его заполнению/передаче.

    X66
    если ты даже скачать/распаковать архив не смог, значит он тебе не поможет :)) тем более, что корректно перенести с dos в XP задача нетривиальная ;)
     
  10. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    я вот нашел что то по паскалю
    var d: byte;
    begin
    d:=port[$40];
    writeln(d);
    end.

    только он выводит результат в виде числа от 0 до 255, а мне надо в бинарный вид превести. потом по формуле вычислить температуру. Примерная формула sum = (b1 * 2 ^ 7) + (b2 * 2 ^ 6) + (b3 * 2 ^ 5) + (b4 * 2 ^ 4) + (b5 * 2 ^ 3) + (b6 * 2 ^ 2) + (b7 * 2 ^ 1) + (b8 * 2 ^ 0)
    Ud = Format(sum * 5.083 / 255, "##0.000") 'считаем пропорциональное значение
    Label1.Caption = CStr(Ud) & " Вольт" 'выводим на экран полученное значение
     
  11. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    В описании на AD7819 (стр. 6) нарисована типичная схема управления этим АЦП. Нужна 8-битная шина и двунапрявленные сигналы управления в общем количестве до 4 штук, из которых главный - BUSY.

    Гораздо проще будет взять какой-нить микроконтроллер типа avr'ки с 20 выводами. Соединить его одним портом к АЦП, а стандартным RS-232 (UART) обмениваться с ПК. По RS-232 снимать данные куда проще и без всяких заморочек. Добавление одного корпуса более менее упростит разработку софта. К тому же, как Вам удалось найти комп с LPT?

    Сие уже редкость антикварная. Давно пора на USB переходить. Потому освоение uC будет впрок.
     
  12. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    По моему LPT щас широко распространен.
     
  13. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    А принтеры с LPT?
     
  14. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    uni
    по даташиту видно, что сигнал на компьютер идет только по шине BUSY. АЦП принимает сигнал по выводам 4,5,6,8-15
     
  15. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    принтеры с LPT портом идут
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    X66
    Ну давай схему с описанием, я попробую накидать тестовое приложение по быстрому.
     
  17. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    у меня схема только на листочке карандашом нарисованная, могу отсканить и скинуть
     
  18. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    X66, да ну на...? Что за шутки на ночь?
    Это параллельный АЦП с кучей ног, зачем ему параллельная шина? Только чтобы передавать данные в комп. Это логика, с ней не поспоришь.

    DB0–DB7 - Data Bit 0 to 7. These outputs are three-state TTL-compatible.
    BUSY - ADC Busy Signal. This is a logic output. This signal goes logic high during the conversion process.

    Busy используется как признак завершения преобразования, т.е. "аципирования". Судя по временным диаграммам на стр. 9 мы видим, что сначала мы должны дать сигнал старта преобразования (в одном из режимов), потом дождаться Busy как окончания цикла преобразования, выставить два сигнала CS и RD - в это время можно считывать данные из микросхемы по 8-разрядной шине. Если бы это был ЦАП, то тогда по шине мы выдавали отсчёт.

    Ну стрелку они не туда нарисовали, ну и что, всему верить, что нарисовано? Смотрите на картинки далее стр. 10. Там стрелки в нужном направлении.
     
  19. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    Ну ладно, не печальтесь. С кем не бывает? :)

    Пожурил, могу и посоветовать взглянуть в сторону AD7810. Двухпроводной синхронный интерфейс. Нужно 3 провода. Двумя управляется АЦП, с одного считываются данные.
    Это последовательный АЦП. Видимо вам такой был нужен.

    Но тут программа будет посложнее, т.к. придётся выдавать синхроимпульсы для считывания 10 бит, а не разом 8 читать.
     
  20. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    а мне AD7819 подходит, у меня все контакты задействованы, надо только правильно с выводами разобраться чтобы управлять