Нужна помощь, ардуина уна тормозит

Garrison
Рядовой
Сообщения: 19
Зарегистрирован: 09.12.2015{, 21:54}
Репутация: 0
Откуда: Ярославль
Имя: Garrison

Нужна помощь, ардуина уна тормозит

#1

Сообщение Garrison » 10.10.2016{, 20:27}

Доброго времени суток знатоки! Проблема в тормозах при исполнении программы. Вот часть программы отвечающая за управление светом, её задача это включение, выключение, плавная регулировка и плавный розжиг/затухание при включении и выключении, до уровня установленного на входе "яркость" Картинка   Для того чтобы реализовать плавный розжиг и плавное затухание я использовал счетчик CTDU ко входу которого я приделал симметричный мультивибратор G-SM со скоростью импульса 1500 микросекунд, ну и как только свет включают то вибратор начинает посылать импульсы в счетчик, тот их считает и увеличивает выходное значение до установленного значения или максимума 254, свет разгорается. Как только поступает сигнал на выключение счетчик меняется на убывание и считает импульсы обратно до нуля, свет плавно гаснет. Всё это прекрасно работало до тех пор пока я не стал писать программу дальше, а именно: После того как я вставил в программу блоки что бы отображать на экране DS1307  время и число: блоки времени  счетчик отвечающий за яркость света стал считать в раз эдак 10 медленнее! Вернее не счетчик похоже а вибратор катастрофически замедлился   И это еще не всё! После того как был добавлен блок для вывода на тот же экран температуры и влажности с датчика DHT-22  блок датчика температуры  злосчастный счетчик  во время отсчета значение яркости стал замирать на пару мгновений каждую секунду в тот момент когда происходит опрос датчика  DHT-22 (установить опрос пореже, это понятно, помогает но не в этом суть то!)!    Короче ну ё-маё  (кстати если блок датчика D-22 не на экран выводить а например в регистры модбаса значения записывать он никак на работу мультивибратора не влияет!    Планировалось в проект добавить еще управление двумя другими источниками света, rgb подсветкой, управление  эл. жалюзи, контролем температуры в помещении и на улице а тут в самом начале уже не работает ничего.... Почему так то????
Последний раз редактировалось Garrison 10.10.2016{, 20:28}, всего редактировалось 1 раз.

OlegAn1962
Лейтенант
Сообщения: 361
Зарегистрирован: 07.09.2015{, 23:53}
Репутация: 0

Нужна помощь, ардуина уна тормозит

#2

Сообщение OlegAn1962 » 11.10.2016{, 02:16}

А если поставить вторую ардуину, которая будет только выводить на DS1307  ?

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

Нужна помощь, ардуина уна тормозит

#3

Сообщение Слимпер » 11.10.2016{, 07:59}

Garrison, Экран у вас как подключен напрямую или через I2C?

holodaleksey
Лейтенант
Сообщения: 566
Зарегистрирован: 10.01.2016{, 13:47}
Репутация: 14

Нужна помощь, ардуина уна тормозит

#4

Сообщение holodaleksey » 11.10.2016{, 08:49}

Слимпер писал(а):Garrison, Экран у вас как подключен напрямую или через I2C?
+1.
1. попробуйте подключить через I2C.
2. часы - вещь в принципе тяжелая (, их библиотека съедает сразу немало так места, озу скорее всего тоже.
3. оптимизируйте проект: попробуйте подвигать местами блоки, избегайте пересечения, используйте нумерованные связи. снизьте количество явных связей, используйте переменные.
4. трэш-хардкор-вариант: отключайте (блоком и) опрос датчика при розжиге )

и ссылки перезалейте - не работают, и весь проект в исходнике выложите.
Последний раз редактировалось holodaleksey 12.10.2016{, 21:57}, всего редактировалось 1 раз.
Подпись удалена мною по требованию администрации форума, что является нарушение демократии )

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

Нужна помощь, ардуина уна тормозит

#5

Сообщение Слимпер » 11.10.2016{, 11:00}

holodaleksey писал(а):1. попробуйте подключить через I2C.
Как раз на оборот, I2C это довольно медленный порт, а тут по нему сразу и экран и часы работаю.
Вообще я пробовал тестить, после подключения экрана по I2C программный цикл контроллера у меня увеличивался до 100мс, а если подключить напрямую (1-10мс). Это естественно на почти пустом проекте.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Нужна помощь, ардуина уна тормозит

#6

Сообщение Boroda » 11.10.2016{, 13:32}

Повесьте на вход EN дисплея генератор 500/500мс и RTrig (обновление экрана раз в секунду).
А вот с блоком часов ничего уже не сделать, так и будут опрашиваться на каждом цикле.
Автор, добавьте к блоку RTC вход ENable.

Garrison
Рядовой
Сообщения: 19
Зарегистрирован: 09.12.2015{, 21:54}
Репутация: 0
Откуда: Ярославль
Имя: Garrison

Нужна помощь, ардуина уна тормозит

#7

Сообщение Garrison » 11.10.2016{, 14:32}

Слимпер писал(а):Экран у вас как подключен напрямую или через I2C?
holodaleksey писал(а):1. попробуйте подключить через I2C.
Экран подключен через  I2C, на нем так же висят часы и барометр.
Boroda писал(а):А вот с блоком часов ничего уже не сделать, так и будут опрашиваться на каждом цикле.
А часы вообще по умолчанию раз в секунду опрашиваться должны бы, а не каждый цикл, чему там чаще изменятся то?
Boroda писал(а):Повесьте на вход EN дисплея генератор 500/500мс и RTrig
Ну да можно попробовать. Но не поможет сто процентов потому что даже если на все входа EN  блоков дисплея установить значение false ну что бы экран вообще ничего не показывал, проект как тормозил так и продолжает тормозить, помогает только полное удаление блоков из проекта. Походу они даже при false состоянии как работали так и работают.
holodaleksey писал(а):и ссылки перезалейте - не работают, и весь проект в исходнике выложите.
Работают, весь проект вечером выложу нет проблем.

Методом дальнейших экспериментов выяснено что чем больше в проекте добавляется блоков вывода на экран тем сильнее замедляется проект. Так же блок опроса датчика DHT-22 неважно куда он выведен (и выведен ли вообще) если он настроен на опрос раз в секунду то связка генератор/счетчик раз в секунду и замирает при выполнении, всё это явно ненормальное поведение... Пока удалил нафиг все блоки вывода на экран (в конце концов он как вспомогательный задумывался, вся инфа выводится по модбасу на настенную панель) ну а датчик температуры сделал с частотой опроса раз в две минуты. Но вообще не гуд такие тормоза на  практически пустом месте.
Последний раз редактировалось Garrison 11.10.2016{, 14:42}, всего редактировалось 1 раз.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Нужна помощь, ардуина уна тормозит

#8

Сообщение Boroda » 11.10.2016{, 14:43}

Ну так в нормальном коде делается один "блок" вывода на индикатор и один массив переменных для вывода. В любом месте программы массив обновляется и ставится флаг "вывод на индикатор" и в следующем цикле программа выводит на индикатор или в прерывании, если используется LED-индикатор. Ну а это ФБД... И оно работает так, как работает... Что-то критичное ко времени не сделаешь. Только блоки на СИ с прерываниями.

Garrison
Рядовой
Сообщения: 19
Зарегистрирован: 09.12.2015{, 21:54}
Репутация: 0
Откуда: Ярославль
Имя: Garrison

Нужна помощь, ардуина уна тормозит

#9

Сообщение Garrison » 11.10.2016{, 14:52}

Boroda писал(а):Что-то критичное ко времени не сделаешь. Только блоки на СИ с прерываниями.
Да, я уже прихожу к мысли что в таком виде в котором есть сейчас FLprog он годится только на "светодиодом поморгать" Чуть больше 3-4 блоков в проекте и все, неадекватное поведение и тормоза.
Последний раз редактировалось Garrison 11.10.2016{, 14:53}, всего редактировалось 1 раз.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Нужна помощь, ардуина уна тормозит

#10

Сообщение Boroda » 11.10.2016{, 15:06}

Сам программирую PIC и обычно делаю так: прерывания от таймера0 каждые 1..4мс, в нем считаю все таймера, которые используются в программе, в том числе и часы, опрос кнопок, вывод на LED-индикатор, регулировка его яркости, опрос DS18B20 по одному биту за цикл таймера. А основная программа представляет собой конечный автомат (блоки IF/ENDIF, выполняющие логику устройства, по различным флагам, будь то переполнение таймера, нажатая кнопка, флаг обновления экрана и т.д.). Таким образом основной цикл программы никогда нигде не задерживается надолго, успевая выполнять все. При этом в основном использую кварцы на 4МГц, что равно 1МГц у AVR-контроллеров. При рисовании ФБД такого никогда не добиться. Поэтому если хочется что-то быстрое делать на Arduino и FLprog, то либо писать блок СИ, либо использовать внешнюю микросхему.

Добавлено (11.10.2016, 15:06)
---------------------------------------------
Ну FLprog расчитан под АСУшников - это мелкая и средняя автоматика, диспетчеризация, умные реле (логика, триггеры, таймеры), Modbus... Время +-100мс пофигу (за редким исключением). В этом направлении FLprog справляется на все 200 процентов!

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

Нужна помощь, ардуина уна тормозит

#11

Сообщение Слимпер » 11.10.2016{, 15:29}

Garrison писал(а):Методом дальнейших экспериментов выяснено что чем больше в проекте добавляется блоков вывода на экран тем сильнее замедляется проект.
Я обычно использую по одному блоку вывода на экран на каждую строку экрана.
А в  остальных местах использую строковую переменную 

А вообще если позволяют входы лучше использовать прямое подключение.
Я еще пробовал подключать эти экранчики через шину SPI, через микросхему 74HC595.  и то быстрее работает.
Вложения
0819449.png

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Нужна помощь, ардуина уна тормозит

#12

Сообщение Boroda » 11.10.2016{, 15:34}

Возьмите любой PLC или Умное реле - если и есть индикатор, то только на внутреннем интерфейсе. Если есть быстрые ноги, то максимальная скорость переключения 20мкс без всякого ШИМа, при разрядности 256 шагов период ШИМа будет 5 мс. Но Вы не сможете сделать такой быстрый ШИМ, т.к. минимальный период цикла контроллера 1мс. Это учитывая тактовую частоту контроллера 200..400 МГц, а у ардуинки 16МГц. То, что сделал Автор FLprog - это большое благо и огромная работа, сильно упрощающая нашу жизнь!

Добавлено (11.10.2016, 15:34)
---------------------------------------------
Слимпер, я думаю там еще библиотека LCD - костыль на костыле, никак не оптимизирована. Да еще волшебный String - у нас на склейке стрингов для СМС ПЛК виснут, выполнение программы за максимальное время цикла выходит.
Последний раз редактировалось Boroda 11.10.2016{, 15:35}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

Нужна помощь, ардуина уна тормозит

#13

Сообщение Слимпер » 11.10.2016{, 15:44}

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

Добавлено (11.10.2016, 15:44)
---------------------------------------------
Boroda писал(а):Если есть быстрые ноги, то максимальная скорость переключения 20мкс без всякого ШИМа, при разрядности 256 шагов период ШИМа будет 5 мс. Но Вы не сможете сделать такой быстрый ШИМ, т.к. минимальный период цикла контроллера 1мс. Это учитывая тактовую частоту контроллера 200..400 МГц, а у ардуинки 16МГц
Тут вы не правы, в реали ШИМ можно разогнать до 32кГц, фронты заваленные конечно, но импульсы идут. Но он работает на аппаратных прерываниях. Это я про Atmega.
Последний раз редактировалось Слимпер 11.10.2016{, 15:45}, всего редактировалось 1 раз.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Нужна помощь, ардуина уна тормозит

#14

Сообщение Boroda » 11.10.2016{, 15:48}

Слимпер писал(а):разделить задачи на между двумя платами

Слимпер
, так вот если бы FLprog умела запускать платы по событиям или по таймеру, а то ведь все последовательно выполняется. Вот например плату А запускать каждый цикл, а плату Б каждый 10 цикл, а плату С - каждые 100. Вот это было бы круто! Или вместо циклов милисекунды.

Добавлено (11.10.2016, 15:48)
---------------------------------------------
Слимпер писал(а):Тут вы не правы, в реали ШИМ
А я про ПЛК. На АВРке то, думаю и побыстрее можно, но на аппаратном уровне.
Последний раз редактировалось Boroda 11.10.2016{, 15:49}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

Нужна помощь, ардуина уна тормозит

#15

Сообщение Слимпер » 11.10.2016{, 15:51}

Boroda писал(а):так вот если бы FLprog умела запускать платы по событиям
Как вариант для можно делать пользовательские блоки с входом EN и так частично реализовать такой принцип, сам часто так делаю.
Я пробовал писать блоки работающие с прерываниями, можно, но есть проблемы.
А датчики я вообще стараюсь опршивать только по очереди, за цикл не больше одного датчика.
Последний раз редактировалось Слимпер 11.10.2016{, 15:52}, всего редактировалось 1 раз.

Garrison
Рядовой
Сообщения: 19
Зарегистрирован: 09.12.2015{, 21:54}
Репутация: 0
Откуда: Ярославль
Имя: Garrison

Нужна помощь, ардуина уна тормозит

#16

Сообщение Garrison » 11.10.2016{, 15:55}

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

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Нужна помощь, ардуина уна тормозит

#17

Сообщение Boroda » 11.10.2016{, 15:56}

Тут где-то гуляла тема "Бит Enable на плату", так народ и Автор против был. Говорят в блок пользователя свою схему засунь и вытащи EN, а как туда засунешь блоки, которые есть в меню программы, но нет в меню пользовательского блока? К тому же блок пользователя отбирает из памяти некоторое количество переменных, равное количеству входов/выходов.

Почему проблематично это сделать - не знаю? Судя по коду - обноси плату IF/ENDIF и радуйся, вроде ничего не мешает. Придется только еще один тип переменных добавить - флаги плат. А вообще лучше выбор: постоянно, запускать по внешнему флагу или по таймеру.
Последний раз редактировалось Boroda 11.10.2016{, 16:04}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

Нужна помощь, ардуина уна тормозит

#18

Сообщение Слимпер » 11.10.2016{, 16:07}

Boroda писал(а):Тут где-то гуляла тема "Бит Enable на плату", так народ и Автор против был. Говорят в блок пользователя свою схему засунь и вытащи EN, а как туда засунешь блоки, которые есть в меню программы, но нет в меню пользовательского блока? К тому же блок пользователя отбирает из памяти некоторое количество переменных, равное количеству входов/выходов.
Ну тут получается или оптимизация скорости или компактности. А то что в пользовательских блоках нельзя использовать многие блоки это конечно жалко.

Добавлено (11.10.2016, 16:03)
---------------------------------------------
Ну как вы писали, задач где критично время, не так уж и много. Часто, вообще без разницы  10мс цикл или 500мс, работает и ладно. А если очень надо, то начинаешь изгаляться.

Добавлено (11.10.2016, 16:07)
---------------------------------------------
Я писал блок для работы с энкодером, кончилось тем, что пришлось написать блок на прерываниях по таймеру, зато теперь четко работает. Или нужно было сделать скоростную защиту на отключение, пришлось использовать вход с прерыванием.
Это я привел пример заморочек.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

Нужна помощь, ардуина уна тормозит

#19

Сообщение Boroda » 11.10.2016{, 16:11}

Да вот тут человеку делал опрос протокола LLS. Мастер в сети уже был, так вот надо было сниферить СОМ-порт и выдергивать данные от датчика. В проекте использовался индикатор 5110 - жрет времени как слон. Пришлось опрашивать буфер СОМ-порта по прерыванию каждые 1мс, чтоб поймать посылку. Самое интересное - подпрограмма void serialEvent() работает не как прерывание, а в общем цикле (хотя в описании: "Автоматически вызываетcя при поступлении новых данных"). Вот и пришлось выкручиваться.
Последний раз редактировалось Boroda 11.10.2016{, 16:13}, всего редактировалось 1 раз.

Аватара пользователя
slavas
Лейтенант
Сообщения: 595
Зарегистрирован: 14.09.2015{, 22:29}
Репутация: 1
Откуда: Санкт-Петербург

Нужна помощь, ардуина уна тормозит

#20

Сообщение slavas » 11.10.2016{, 18:48}

Garrison, Вы налепили немеряно экранов, вот они и съели время. Сдерайте один экран на строку. на пример время из трёх блоков блок часов-сложение строк-экран, далее данные датчиков в переменные и вывод на экран.

Ответить

Вернуться в «ATmega328,168»