Обработка прерываний LPT порта

Тема в разделе "WASM.BEGINNERS", создана пользователем AndruhaUA, 14 янв 2009.

  1. AndruhaUA

    AndruhaUA New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    5
    Всем привет!
    У меня такая задача: надо измерять частоту импульсов поданых на ЛПТ порт, для етого я решил использовать прерывания, но не знаю как их обрабатывать. В програмировании я слаб. Если вам не трудно помогите написать прогу на С++ (под ДОС) которая бы обрабатывала прерывания, но наверное здесь без асемблера не обойтись поетому придетса делать асемблерные вставки в програму на С(надеюсь такое возможно).
    Или может у кого то есть пример чего то похожего я попробую переделать. Значит надо штоб во время прерывания от ЛПТ порта считались даные с его выводов и записать их в какую то переменную, а дале на С++ я у напишу как обрабатывать ету переменную и какое значение выводить на екран. Заранее благодарен за помочь.
     
  2. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    если тебе ктонить сможет помочь ( т.е написать на С++ под ДОС с ассемблерными вставками на С ) - этот код войдёт в "Золотые Анналы ( от слова "анальный?) " програмирования...
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
  4. AndruhaUA

    AndruhaUA New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    5
    Спасибо за помочь, но ета книга не для моего уровня знаний в области програмирования, да и к тому же там есть пример обработким прерываний с порта но под виндовс, да и што то там все очень сложно, я не могу ничего понять. Но все равно спасибо. Мне б простой примерчик, штоб запускалась програмка при прерывании от порта.
     
  5. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    в ов тулчайне есть все необходимые примеры. и без использования асма. Все на С. Однако, если вы в проганьи - полный 0 - велкам ту каммерс. Учить вас програмировать ни у кого терпения не хватит.
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Главное, поставить правильные вопросы...

    1. Читаешь что-нибудь про LPT-порт. Есть ли irq, связанное с lpt-портом?

    2. Если есть, то пишешь на каком-нибудь турбо-Си, или QC (да хоть на паскале, или на чистом ассемблере - скорость разработки будет почти равноценна), хоть со вставками, хоть как, обработчик прерывания (кажется, можно и без вставок - в борландовских сях ...кажется... были нужные библиотеки). Для дос, естественно. (таки есть irq7, прерывание 0f - то есть задача сводится к написанию этого обработчика)

    Для его написания продолжаем озадачиваться:

    2.0. Мы можем быть уверены, что в любой системе прерывание от лпт есть irq7, и соответствует вектору 0f? Если нет, то как это определить?

    2.1. Как возникает этот самый реквест? при любом изменении на лпт? при заполнении некоторого аппаратного буфера? Или может, только при сигнале продолжительностью не менее 5мс, прямоугольной формы, на 4-ю ногу порта?

    2.2. А какова распиновка лпт-порта, и на какие ноги вообще надо что-либо подать, чтобы получились данные? а чтобы возникло прерывание? Надо ли для этого что-то менять в биосе (в биосах есть минимум 3 варианта настройки)?

    2.3. Через какой порт (номер) или группу портов можно управлять/читать лпт-устройства? Как это делать? (Ральф Браун в помощь)

    2.4. Что надо сделать в обработчике кроме того, что что-то прочитать? Как очистить буфер (а там вообще есть аппаратный буфер?), или как убедить порт, что прерывание обработано (и не надо еще раз этот же реквест делать)? (очевидно, это либо автоматом, при чтении из порта, либо при записи куда-то чего-то)

    2.5. ...

    ну и по ходу выяснения наверно еще вопросы возникнут правильные :)))

    ЗЫ: а вот насчет "запускалась программка" не знаю. При прерывании запустится программка - обработчик irq, резидент. При этом будет прервана работа какой-то из запущенных программ дос. Запустить из обработчика прерывания еще какую-то программку - значит нагрузить себя излишним геммороем. Я вижу такие варианты -

    1. все что нужно, происходит в резидентном обработчике - например, выводится куда-то в файл. А потом анализируешь созданный файл в спокойной обстановке.

    2. обработчик irq запишет что-то куда-то в память, организуя буфер FIFO, а специально запущенная пользователем программа (что-то типа лпт-терминала) будет периодически туда поглядывать, на предмет изменений. Примерно как с клавиатурой... Учитывая, что нужна частота, это должно быть оптимальным вариантом. Можно обойтись без резидента. Программа перехватывает irq7, при каждом новом сигнале определяет интервал времени по таймеру (для частоты более 18Гц придется еще и таймер перепрограммировать, и прерывание перехватить, от таймера, irq0)... и что-то считает, или график строит, или чего там надо.

    ЗЗЫ: нет, я не буду этим заниматься :)))
     
  7. AndruhaUA

    AndruhaUA New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    5
    Да я с тобой согласен нужно просто написать обработчик прерывания от порта(остальное я уже сам сделаю без помочи), штоб он при прерывании считал содержимое буфера порта и записал в память(в какую то переменную), или просто изменить резидентный обработчик, но как ето сделать я не знаю.
     
  8. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Метод решения задачи зависит от того, какие частоты импульсов необходимо измерять. Если частота следования импульсов не выше, чем у системного таймера (~18 Гц), используем измерение по таймеру. Если выше, используем счётчик тактов процессора. Так или иначе, решение представляется следующим:
    Импульсы, частоту которых следует определить подаются на ногу 10 порта. (ACK)
    По приходу на неё имульса возникает IRQ7 для LPT1 или IRQ5 для LPT2. Предверительно в регистре управления портом выработка прерывания должна быть разрешена.
    Обработчик прерывания считывает значение счётчика тактов процессора (или таймера), вычитает из него предыдущее (сохранённое в памяти), результат вычитания кладёт куда-то в память.

    Основная часть программы в цикле (по флагу, по счётчику) смотрит на значение, вычисляемое обработчиком. Производит необходимое усреднение по нескольким значениям и вычисление частоты (периода) с выводом на экран (в файл, на принтер, графопостроитель нужное подчеркнуть или дописать :)
    Литература
    Зубков - Программирование для DOS, windows, UNIX. (есть в сети)
    Также можно посмотреть
    http://hardwarebook.info/ - цоколёвка разъёма
    IO.PRT - описание регистров порта
    Готовые процедуры для измерения тактовой частоты процессора можно найти в сети. Она необходимы для калибровки счётчика тактов.
     
  9. AndruhaUA

    AndruhaUA New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    5
    Привет, пасиб што проник в мою "проблему". Принцип ее решения у меня почти такой же. Частота импульсов 5000 Гц, но перед тем как подать на 10 ногу порта я подам их на счетник который уменшит частоту в 10 раз тоисть макс частота прерываний от порта будет 500 раз в сек(500 Гц), при каждом прерывании какая то переменная будет возростать на 1. А тепер то чего я не знаю как сделать, надо каждую секунду вызывать какое то прерывание , обработчик которого будет делать обчисления над переменной и выводить значение на екран а потом обнулить переменную и все начнетса сначала. Но надо штоб прерывания от порта имело большый приоритет, тоисть во время обчислений и вывода на екран продолжалось изменение переменной в которою записываються количество импульсов. Но и ето еще не всьо, входных сигналов есть два но я использую два ЛПТ порта, и вычесления проводить над двумя, но ето уже в програме напишем. Так што сечас меня больше всего интересует как зделать прерывания каждую секунду(не важно какое только штоб с меншым приорететом от портового прерывавния).
    Есть и другой вариант решения даной задачи. Можно нашу переменную в которую записываетса количество импульсов разделить на время за которое ета переменная возростала, время можно считать с системной даты(наверное можно и использовать системный таймер но о нем я ничего не знаю но обезательно поищу инфу и почитаю),но если я не ошыбаюсь системная дата в секундах, тогда очень большая погрешность получитса.в принцепе на екран можно выводить каждые 2 сек.Но все равно если допусти мы начали измерения , прошло 2 сек и мы начинаем делить нашу переменную, в которой значения допустим ровно 800, на 2 сек, получим рез 400 но пока мы делаем вычесления переменна все время возростает и пока дойдет дело до деления в ней уже будет 860 а дельть мы по прежднему будим на 2. Вот такие дела, а с первым вариантом, тоисть с использованием прерываний каждую сек етого не будет(я так думаю но не уверен на все 100). Так што пожалуйста подскажите как ызвать какое то прерывание каждую секунду.
     
  10. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    AndruhaUA Тебе надо учебник русского языка прочесть. Мой мозг взорван на пятой строчке твоего сообщения.
    Прерывание 1c вызывается каждые 55 мсек. Вешай на него счётчик и выводи на экран с нужной регулярностью.
    Как я предложил по-моему сделать проще.
    И давай конкретные вопросы.
     
  11. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    AndruhaUA
    У меня такая задача: надо измерять частоту импульсов поданых на ЛПТ порт, для етого я решил использовать прерывания, но не знаю как их обрабатывать - нафига тебе прерывания ? Дождался ближайшего импулься, прочитал счетчик таймера (можно системного), запомнил, пропустил через себя 100/1000/... импульсов (зависит от скорости/частоты их появления), опять прочитал счетчик, взял разность и высчитал частоту. Элементарно.
     
  12. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    offtop/ колхоз всё это, ИМХО если делать счётчик/частотомер - то по нормальному на контроллере или ПЛИС а связь с компом ч-з RS232.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    http://www.pcports.ru/xDRV_sys.php
     
  14. Exp10der

    Exp10der Мастер дзена

    Публикаций:
    0
    Регистрация:
    27 авг 2007
    Сообщения:
    337
    Адрес:
    Красноярск
    там дров кривоватый - он прерывание наглухо перехватывает
     
  15. AndruhaUA

    AndruhaUA New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    5
    Привет Вовчик, извини но я и правда плохо владею руским.
    Дождался ближайшего импулься, прочитал счетчик таймера (можно системного), запомнил, пропустил через себя 100/1000/... импульсов, я не понял а откуда мне знать што прпишел импульс? Опрашывать порт все время или как?
    Вовчик нужна твоя помочь я уже нашел в С++ функции для изменения вектора прерываний, но вот пролблемка при закорочывании 10 ножки лпт порта там прерывание идет по спаду напрежения, прерывания не происходит, в регистре управления разришения на прерывания я установил, вектор прерывания имеет номер irq+8, тоисть 7+8=15. Что я не так делаю? Да не плохо было б он-лайн пообшатся моя ася 379-942-744.
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    для реального режима int 0Fh | IRQ7 | LPT1 для защищенного режима скорее всего вектор перенесли. Вопрос только куда.