|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.02.2013, 06:28 | #1 |
Регистрация: 29.01.2013
Сообщений: 6
|
Война со скоростью (TTimer, Asm, LPT, COM-port)
Всем доброго дня.
Есть компьютер с LPT-портом, специально установленный на станок. На нем программа управления шаговыми двигателями. Задача - отправить на порт LPT байт с командами, потом "обнулить" порт, далее - снова команда, опять обнулить. Все работает, но... Я выбрал для задания времени TTimer, даже два - один выдает команду, второй обнуляет. Расчетное время, для выдачи требуемой скорости станка равно 5 и 3 мс соответственно. Компонент TTimer работает адекватно на времени не менее 200 мс, в моем случае удается сделать максимальную скорость в шесть-десять раз меньше требуемой. Что делать? Есть мысль - необходима вставка на ассемблере, с созданием нити с максимальным приоритетом - но проблема, что я в ассемблере практически не шарю; массив данных привязан к TList (b := byte(List[i]), как-то так). Буду очень признателен дельным советам, или мааааленькому примитивному коду )) А есть задача поинтереснее - как этот байт выдать не на LPT, а на COM с последующим преобразованием в RS485, железо уже есть. Последний раз редактировалось vdnk; 06.02.2013 в 06:41. Причина: Уточнение |
06.02.2013, 07:55 | #2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Windows не является ОС реального времени.
Так что по-хорошему следует установить на комп другую ОС (например QNX) и разрабатывать софт под нее. Средняя погрешность стандартного виндового таймера составляет десятки мс. И с этим ничего не поделаешь. Немного улучшить ситуацию можно, используя мультимедийный таймер, но для этого нужно будет отказаться от стандартных компонентов Delphi и писать свои на WinAPI. Причем, без гарантий, что этого окажется достаточно для Ваших целей. |
06.02.2013, 10:14 | #3 |
Регистрация: 29.01.2013
Сообщений: 6
|
Печально... Как-то вообще безрадостно...
|
06.02.2013, 11:29 | #4 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Вот подобная тема у меня была
http://www.programmersforum.ru/showthread.php?t=225348 ___________________________________ ___________________________________ _ А пакетную отправку данных сделать нельзя? Можно установить и запрограммировать подходящий контроллер, что-бы он сам пакет на мс разбивал. ___________________________________ ___________________________________ _ Если погрешность в несколько мс не критична, можно установить интервал по количеству тактов процессора http://www.delphisources.ru/pages/fa...act_timer.html http://www.delphisources.ru/pages/fa...processor.html http://www.cyberforum.ru/delphi/thread4868.html |
06.02.2013, 11:59 | #5 |
Регистрация: 29.01.2013
Сообщений: 6
|
Вот спасибо!! Сейчас попробую.
А то я уже начал писать что-то вроде b: byte; c: char; .. Thread := TThread.Create(False) .. repeat Out32($378, b); //в LPT записывааем байт; // или ComPort.WriteStr(c); asm // зацикливаемся на 3 мс end; Out32($378, $11) asm // зацикливаемся на 2 мс end; inc(i); // и следующая итеррация |
06.02.2013, 12:50 | #6 |
Регистрация: 29.01.2013
Сообщений: 6
|
Минимальное время THRTimer получается 8 с копейками мс, иногда 11 с копейками.
однако, придется менять систему, такие скачки мне не подходят.. или действительно ставить еще дополнительный контроллер, от чего я и пытался уйти |
06.02.2013, 12:56 | #7 |
Регистрация: 29.01.2013
Сообщений: 6
|
У меня тогда такой вопрос - а как программировать для QNX ? Кажется, встречал компиляторы для Делфей, но не уверен, что там будут работать системные функции.
А подойдет ли для этих целей неграфический добрый ДОС? Не знаю, как у него там со временем, по-моему, все замечательно ? |
06.02.2013, 13:03 | #8 |
Участник клуба
Регистрация: 09.11.2007
Сообщений: 1,762
|
А Windows CE не подойдёт? Вроде это тоже ОС реального времени.
|
06.02.2013, 13:20 | #9 |
Регистрация: 29.01.2013
Сообщений: 6
|
Все. Решил. С милисекундами тормозил немного: все в районе допусков, если ничего лишнего не открывать в Винде. Решил примерно так:
if HRTimer.StartTimer then for i := 0 to 4 do QT := HRTimer.ReadTimer; TButton(Sender).Caption := FloatToStr(QT); получаем примерно 3,5-4 мс (по 0,8 мс на каждый запрос), точнее не получится, думаю. Но уже достаточно для моих целей. ВСЕМ ОГРОМНОЕ СПАСИБО!!! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
движение авто со скоростью | saltonik | Помощь студентам | 9 | 02.04.2011 23:18 |
Копирование файла с заданой скоростью | black_prog | Помощь студентам | 2 | 25.03.2011 16:00 |
проблемы с скоростью интернета | zheka9601 | Общие вопросы C/C++ | 2 | 06.05.2010 20:11 |
Пересечение объектов. Проблема со скоростью движения | Манжосов Денис :) | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 11 | 06.03.2010 19:39 |
OpenGL. Проблема со скоростью передвижения объектов | Blade | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 5 | 26.10.2009 13:40 |