Как оптимизировать ввод-вывод LPT?

Тема в разделе "WASM.A&O", создана пользователем da-007, 17 апр 2008.

  1. da-007

    da-007 New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    13
    Добрый день.

    Задача: мониторинг температурных датчиков, висящих на LPT-порту (порте?); периодичность получения температуры - раз в две секунды. Термодатчики выдают сигнал с изменяющейся скважностью, поэтому необходимо 20-30 тыс. чтений на каждое измерение температуры - чем больше, тем точнее определим. Три термодатчика - три бита (каждый датчик на своем проводе: каждый датчик управляет "своим" битом LPT). Интересует оптимизация на скорость работы; чтение температур вынесено в отдельный поток.

    Иными словами: нужно прочесть 30 тыс значений из LPT порта, и определить, сколько раз были установлены нужные мне биты.

    Получилось так (синтаксис С--):

    --------
    EBX = ESI = EDI = 0; // Sensor0, Sensor1, Sensor2

    EAX = 0;
    EDX = 0x379;
    ECX = 30000;
    loop (ECX)
    {
    $ in AL, DX;

    $ bt EAX, SMT_SENSOR_0
    $ adc EBX, 0

    $ bt EAX, SMT_SENSOR_1
    $ adc ESI, 0

    $ bt EAX, SMT_SENSOR_2
    $ adc EDI, 0
    }

    Sensor0 = EBX; Sensor1 = ESI; Sensor2 = EDI;

    // Тут идет пересчет показаний каждого датчика в температуры по условной формуле "чтений всего" / "положительных бит" * K
    --------

    Cобственно, вопрос - можно ли это дело ускорить, дабы уменьшить загрузку процессора? Может, есть какой-то хитрый способ быстро считать 30 тыс. значений в память, а потом пробежаться по массиву? Или, может, я зря использую bt, а быстрее будет через прямое сравнение + jz? Вариант "сменить термодатчики" не предлагать =))

    Пасиба =)

    PS: OS: Win32
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    немного не по теме: можно взглянуть не схему подключения датчиков? просто для интереса. :)
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Берёшь контроллер, мне нравятся Microchip, частота у ник в десятках мегогерц и памяти хватает, программируешь его и вешаеш прерывание на LPT.
     
  4. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Предлагаю изменить схему подключения датчиков.

    1. Выхода всех датчиков подключаются к мультиплексору.
    2. Выход мультиплексора к устройству выделения фронтов (УВФ) (отслеживает изменение линии)
    3. Выход УВФ к линии ACK LPT порта (10 вывод)
    4. Канал мультиплексора задается линиями D0-D1 (2 и 3 вывод)
    5. Выход мультиплексора также подключаем к линии Busy (11 вывод)

    Как работает?

    1. Устанавливаем разрешение прерывания от линии ACK и канал мультиплексора.
    2. По прерыванию проверяем состояние линии Busy, таким образом мы проверим фронт или спад импульса.
    3. Если фронт импульса, то запомнить время поступления и вычислить период поступления импульсов.
    4. Если спад импульса, то вычислить длительность импульса.
    5. Определить скважность.
    6. Расчитать температуру по скважности импульсов.
    7. Установить следующий канал мультиплексора.
    8. Повторить с п.2.

    Так как прога будет работать по прерыванию то нагрузка на проц минимальна.
    Удачи Вам.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    da-007
    bt - работает быстро один такт.
    Дело в том что LPT работает на частоте порядка 500 кГц (Надо поискать на какой точно можеи и меньше) и проц просто подвисает на чтение из порта. Надо вешать обработчик на прерывания.
    IRQ 5 для LPT2
    IRQ 7 для LPT1

    Кстати а чеето у тебя датчики подключенны не к линии данных а клиниям статуса?

    Есть еще режим передачи ECP он быстрее примерно 2МГц.

    Можно задействовать DMA.
     
  6. da-007

    da-007 New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    13
    RamMerLabs
    Ее нет =)) Это очень простые датчики, вроде... SMT-30 маркировка, но не уверен. Напрямую в LPT + питание 5 вольт. Поставил на всякий случай по SMD конденсатору рядом с датчиком - чтобы сгладить питание (наверное, это лишнее)... Хотя, некоторые еще и предохранители на 100 мА ставят...

    Clerk
    Проще новые датчики купить, которые будут сразу код температуры выдавать =) Но лениво пересобирать - там не только датчики =)

    S_Alex
    В будущем датчики сменю... А пока охота обойтись софтовыми мерами =)

    Pavia
    Мда... Тогда значит, быстрее не получится...

    А у меня данные уже заняты другой штукой =))

    А где про это можно почитать?
     
  7. ksacvet777

    ksacvet777 Александр

    Публикаций:
    0
    Регистрация:
    9 ноя 2006
    Сообщения:
    180
    Адрес:
    Кемеровская обл.
    для измерения температуры лучше воспользоваться счётчиком, не помню маркировку микросхемы. я так понял датчик даёт частоту, изменяется температура - изменяется ченерируемая частота. измерив частоту получаем температуру.

    Если смущает загрузка проца (не пердставляю как можно с малой загрузкой проца точно измерить частоту сигнала), тогда надо брать в руки паяльник,
    или заказать в мастерской.

    смысл такой: микросхема обнуляется подачей лог. 1 на соответствующий вход. потом подаётся разрешающий счёт сигнал (лог. 1), через 2 секунды сигнал убираем (лог. 0), ну и после этого считываем показания микросхемы. Далее по кругу : подключаем к ней другой датчик , если таковой имеется, опять обнуляем , и т.д.

    количество ввод/вывод ножек LPT позволяет такое сотворить .

    А чем собственно загрузка процессора смущает ?
     
  8. Clerk

    Clerk Забанен

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