Посоветуйте! Как использовать LCD без задержек?

mills
Offline
Зарегистрирован: 07.04.2015

Добрый день, уважаемые!

Посоветуйте! 

Кручу Мегой 6 шаговиков по dir, step, enable через драйверы с микрошагом 1/4. 

Библиотека AccelStepper 

http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.ht...

У каждого шаговика своя задача. Но вот выявилась проблема. Как только пытаюсь 1 раз в секунду выдать данные на LCD http://amperka.ru/product/text-lcd-20x4, получаю затык в частоте импульсов. Такой сбой в частоте импульсов создает предпосылки для пропуска шагов... (инерция роторов 57 шаговиков велика). LCD подключал и по 4 и по 8, особой разницы не замечено... 

Может кто посоветует "многозадачную" библиотеку LCD без delay-ных задержек? 

Или подскажет, будут ли задержки в частоте импульсов при подключении LCD по I2C ?

Диапазон используемых скоростей от 200 импульсов в секунду до 3000... "Затык" чувствуется на любых скоростях.

Зарание спасибо за опытные советы.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

mills, по моему тут главный виновник  -сама библа степпера, она не использует таймеры, не использует прерывания..  ей все всегда будут мешать.

mills
Offline
Зарегистрирован: 07.04.2015

dimax,

Возможно, но у нее разгон и торможение есть.  При других вычислениях и 8ми веточных кейсах, а так же опросах клавиатуры ничего не мешает. Работает как нужно.  Просаживается частота импульсов при работе сразу 6 моторов, но плавно. Думаю, как раз delayная реализация в LCD библиотеке мешает.

В дальнейшем моторы планирую крутить на DUE, должно хватить частоты для максимальных скоростей и осутствия просадки, но подозреваю, что при обращении к lcd будет тот же "затык", т.к. снижение максимальной скорости решает проблему просадки частоты, но не убирает "затык" от LCD... :(

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Могу предложить другой подход - прикрутить к LCD Ардуино Про Мини (вообще - не важно какую Ардуину) и пусть она занимается выводом данных на экран. Можно и конопки туда прикрутить. А Мега пусть занимается шаговиками.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Один из вариантов "многозадачности" это делать вывод по таймеру. Шаг таймера не меньше минимальной задержки при выводе на экран. Тогда можно для дисплея выделить место в памяти под строки и выводить постоянно (пример есть у Di Halt, но там ассемблер, обновление всего экрана, если не ошибаюсь несколько раз в секунду).

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

Разумеется это не даст 100% результат, всё равно степпер будет плавать, однако влияние будет меньше, потому что задержек не будет при выводе на экран, плюс постоянный вывод на экран - это вывод без задержек, т.е. в обработчике нужно взять указатель на буфер, считать значение, выдать в регистр дисплея, увеличить указатель и сохранить его до следующего раза. Ну и в конце буфера перекинуть его на начало.

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

Кстати, задержки можно с помощью этого же таймера реализовать, т.е. если нужна задержка, то пропускаем столько обработчиков, на сколько нужна задержка.

UPD: Я ошибся, у Di Haltа тоже есть задержки. Надо будет провентилировать этот вопрос да написать свой такой вЕлик. Вроде должно всё получиться. Немного гемора есть, но не так уж и много. А всего то лишь конечный автомат немного подумать, немного помаять ардуину.

А вообще правильно говорят, если система критична к задержкам, нужно дисплей отдельным модулем делать, со своим МК.

 

vvadim
Offline
Зарегистрирован: 23.05.2012
mills
Offline
Зарегистрирован: 07.04.2015

Gippopotam пишет:

Могу предложить другой подход - прикрутить к LCD Ардуино Про Мини (вообще - не важно какую Ардуину) и пусть она занимается выводом данных на экран. Можно и конопки туда прикрутить. А Мега пусть занимается шаговиками.

kisoft пишет:

Один из вариантов "многозадачности" это делать вывод по таймеру...

...А вообще правильно говорят, если система критична к задержкам, нужно дисплей отдельным модулем делать, со своим МК.

Вот тоже подумал, что это будет проще и надежней всего :))

Тема в точку... Спасибо.  Пробовали библу https://github.com/Void1509/lcdLib1602 от sva1509 ?

Попробую на досуге.

По сабжу выяснил, что частоте мешайт и реализация keypad 4х4 :)) getKey заметно сказывается. Поменял ее на простой digitalRead c антизвоном. Думаю на DUE не увидел бы. Вывод на LCD сделал в том месте где "незаметно". Благо нашлось такое место :)

Про скорость вывода на LCD по I2C надо бы проверить, но пока нету под рукой модуля к сожалению. Если кто знает, просветите.

Однако в рамках проекта все решил, Благодаря Вам уважаемые! Спасибо чистосердечное!