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

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

  1. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    Значит получается ПК получает данные по выводам 8-15, после того, как получит сигналы на выводах 5 и 6?
     
  2. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    X66, вас может оправдать только название этого раздела :)
    Шаг 1. Ставим Лингво 12
    Шаг 2. Внимательно вчитываемся в datasheet, чтобы не задавать совсем простых вопросов.

    ~ - знак инверсии
    ~CS - Chip Select. This is a logic input. ~CS is used in conjunction with
    ~RD to enable outputs.

    ~RD - Read Pin. This is a logic input. When ~CS is low and ~RD goes low, the DB7–DB0 leave their high impedance state and data is driven onto the data bus.

    По-русски это означает, что CS (это вход у АЦП) - это сигнал выбора чипа, т.е. микросхемы. Он нужен, если у Вас на плате не один канал АЦП, а много каналов, но все подключёны к одному порту микроконтроллера. Чтобы опрашивать их поочерёдно, но они не мешали друг другу нужно управлять этим сигналом для выбора конкретного устройства АЦПирования. Такой сигнал есть практически во всех похожих микросхемах.

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

    Эти логические сигналы нужны для организации правильной логики работы с периферией. Т.о. в принципе может быть их можно выдавать вместе, но это нужно посмотреть подробней руководство. Т.е. возможно их можно объединить.

    Что касаемо ввода через LPT, то насколько я помню, чтобы включить двунаправленный режим работы LPT порта нужно его настроить на один из расширенных режимов работы. Возможно по умолчанию он включен. Дело в том, что в далеком досовском прошлом это был только вывод на принтер, без ввода, а обратная связь была по 5 дополнительным проводам. Лет 10 назад решили, что это глупо уже и расширили программным и аппаратным способом взаимодействие с LPT, но сам интерфейс (кабель) остался тот же. С принтером теперь можно общаться прямо по этой же шине, но это нужно было включать особым образом в BIOS.

    Теперь всем управляет винда. Не совсем очевидно даже для меня какие функции нужно пользовать, чтобы организовать взаимодействие с АЦП посредством LPT. Нужно считывать данные по шине и одновременно управлять дополнительными сигналами, которые по природе были ранее входами.

    Всё-таки, займитесь лучше микроконтроллерным вариантом.
     
  3. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    да у меня курсач, там по любому параллельный АЦП надо использоватьи LPT порт
     
  4. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    Ну ладно, раз уж так хотите, то идите сюда:
    http://www.pcports.ru/Articles.php

    Про принтер можете почитать тут ещё:
    http://www.frolov-lib.ru/books/bsp/v33/index.html
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Скачал даташит. Короче, прерывания никакие не нужны(для последовательного ацп былибы нужны). Режим работы пар порта задаётся в биос(разумеется если перепрограммируется аппаратура, то в биос лезть не нужно). Для чтения данных с порта данных в BIOS должен быть установлен EPP или ECP режим работы параллельного порта. Вначале нужно разобратьсо с распиновкой пар. порта.
    [​IMG]
    Необходимый уровень сигнала на порту создаётся соединением ножки на общий провод через сопротивление ~300Ом.(Если транзистор : Pin->Коллектор->Эмиттер->Земля;n-p-n).
    Значит подключить нужно так:
    Контакты порта [2%9] подключаем соотвественно к [8%15] чипа, это 8-миразрядная шина данных.
    Контакт порта номер 15 подключаем к ножке 7 чипа, это будет вход BUSY, соответственно в порту это будет 3-й бит.
    Контакт номер 1 порта подключаем к ножке 4 чипа, это будет выход CONVST, соответственно первый разряд(i0) порта управления.
    Контакт номер 14 порта подключаем к ножке 6 чипа, это будет выход RD, соответственно второй разряд(i1) порта управления.
    Контакт номер 16 порта подключаем к ножке 5 чипа, эхто будет выход CS и третий разряй(i2) порта управления.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Работать будет так:
    > В начале работы переводим порт данных в режим чтения, это делоетсо установкой в 1 пятого бита в порту управления. Также сброшены биты 0 и 1, а бит 2 установлен в 1 в порту управления(соответственно CONVST, RD и CS(инвесный).
    > Выводим сигнал CONVST.
    > Делоем задержку, не менее 100μs.
    > Читаем в цикле BUSY, покуда не спадёт.
    > Выбираем чип, установив CS в низкий уровень.
    > Разрешаем чтение, установив RD в низкий уровень.
    > Читаем слово из порта данных.
    > Устанавливаем RD в высокий уровень.
    > Устанавливаем CS в высокий уровень.
    Примерно кодес будет таким:
    Код (Text):
    1. ;Initialize..
    2.     mov edx,37Ah
    3.     in al,dx
    4.     jmp short $+2
    5.     or al,100100b
    6.     out dx,al
    7.     jmp short $+2
    8. ;[...]
    9.  
    10. ;bl - result, fc - status.
    11. AcceptData proc C
    12.     mov edx,37Ah
    13.     in al,dx
    14.     jmp short $+2
    15.     or al,100101b
    16.     out dx,al
    17.     dec edx
    18. wait_:
    19.     mov ecx,100
    20. @@:
    21.     loop @b
    22.     in al,dx
    23.     test al,1000b
    24.     jz accept_
    25.     ;[Timeout check, fc -> 1 & return]
    26.     jnc wait_
    27.     stc
    28.     jmp exit_
    29. accept_:
    30.     inc edx
    31.     jmp short $+2
    32.     in al,dx
    33.     jmp short $+2
    34.     or al,100111b
    35.     out dx,al
    36.     mov ecx,10
    37. @@:
    38.     loop @b
    39.     in al,dx
    40.     jmp short $+2
    41.     and al,11111011b
    42.     out dx,al
    43.     jmp short $+2
    44.     mov ecx,10
    45. @@:
    46.     loop @b
    47.     dec edx
    48.     dec edx
    49.     in al,dx
    50.     push eax
    51.     inc edx
    52.     inc edx
    53.     in al,dx
    54.     jmp short $+2
    55.     or al,100100b
    56.     out dx,al
    57.     pop eax
    58.     clc ;Error flag
    59. exit_:
    60.     ret
    Вот набросал потестить, попробуй(или есчо не спаял ?):
     
  7. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    Уже все спаяно
    4 вывод АЦП 1 контакт LPT
    5 - 14
    6- 36
    7-11
    8,9,10...15-2,3,4...9
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ну я хз.)
     
  9. X66

    X66 New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2008
    Сообщения:
    26
    я знаю прогу для com порта, но это не то
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    X66
    В комерс. Не удивлюсь, если щас скажешь что чип не AD7819 и порт не 25-pin :lol: .
     
  11. X66

    X66 New Member

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

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Давно написано, лежит на
    http://www.pcports.ru/xDRV_sys.php

    Дров(+либа) достаточно крутой (с обработкой прерывания если нада) + примеры работы с ним на C/C++/DelpheObjectPascal
     
  13. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    Ссылку уже давали на предыдущей странице.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Порченый дров, тупо HalGetInterruptVector/IoConnectInterrupt, всё фиксировано и IRQ и адреса портов .D
    И вообще, лучше с таким дровом в панель управления не заходить, а то мало ли чего..
     
  15. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    inpout32.dll

    в пакете с длл - примеры на си, бейсике и еще на чем-то
     
  16. X66

    X66 New Member

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

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кстати, кто знает почему в IOAPIC замаскирован канал IRQ, тоесть если считать так:
    Код (Text):
    1.     invoke MmMapIoSpace, 0FEC00000h, 0, PAGE_SIZE, FALSE
    2.     .if Eax
    3.     cli
    4.     mov dword ptr [eax],(10h + 2*7) ;IRQ7
    5.     mov ebx,dword ptr [eax + 10h]
    6.     sti
    7.     invoke MmUnmapIoSpace, eax, PAGE_SIZE
    8.     mov eax,ebx
    9.     .endif
    Возвращаетсо 0x100FF, почему ?