Добрый день. Задача: мониторинг температурных датчиков, висящих на 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
Берёшь контроллер, мне нравятся Microchip, частота у ник в десятках мегогерц и памяти хватает, программируешь его и вешаеш прерывание на LPT.
Предлагаю изменить схему подключения датчиков. 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. Так как прога будет работать по прерыванию то нагрузка на проц минимальна. Удачи Вам.
da-007 bt - работает быстро один такт. Дело в том что LPT работает на частоте порядка 500 кГц (Надо поискать на какой точно можеи и меньше) и проц просто подвисает на чтение из порта. Надо вешать обработчик на прерывания. IRQ 5 для LPT2 IRQ 7 для LPT1 Кстати а чеето у тебя датчики подключенны не к линии данных а клиниям статуса? Есть еще режим передачи ECP он быстрее примерно 2МГц. Можно задействовать DMA.
RamMerLabs Ее нет =)) Это очень простые датчики, вроде... SMT-30 маркировка, но не уверен. Напрямую в LPT + питание 5 вольт. Поставил на всякий случай по SMD конденсатору рядом с датчиком - чтобы сгладить питание (наверное, это лишнее)... Хотя, некоторые еще и предохранители на 100 мА ставят... Clerk Проще новые датчики купить, которые будут сразу код температуры выдавать =) Но лениво пересобирать - там не только датчики =) S_Alex В будущем датчики сменю... А пока охота обойтись софтовыми мерами =) Pavia Мда... Тогда значит, быстрее не получится... А у меня данные уже заняты другой штукой =)) А где про это можно почитать?
для измерения температуры лучше воспользоваться счётчиком, не помню маркировку микросхемы. я так понял датчик даёт частоту, изменяется температура - изменяется ченерируемая частота. измерив частоту получаем температуру. Если смущает загрузка проца (не пердставляю как можно с малой загрузкой проца точно измерить частоту сигнала), тогда надо брать в руки паяльник, или заказать в мастерской. смысл такой: микросхема обнуляется подачей лог. 1 на соответствующий вход. потом подаётся разрешающий счёт сигнал (лог. 1), через 2 секунды сигнал убираем (лог. 0), ну и после этого считываем показания микросхемы. Далее по кругу : подключаем к ней другой датчик , если таковой имеется, опять обнуляем , и т.д. количество ввод/вывод ножек LPT позволяет такое сотворить . А чем собственно загрузка процессора смущает ?