Нужна помощь, ардуина уна тормозит
Нужна помощь, ардуина уна тормозит
Доброго времени суток знатоки! Проблема в тормозах при исполнении программы. Вот часть программы отвечающая за управление светом, её задача это включение, выключение, плавная регулировка и плавный розжиг/затухание при включении и выключении, до уровня установленного на входе "яркость" Картинка Для того чтобы реализовать плавный розжиг и плавное затухание я использовал счетчик CTDU ко входу которого я приделал симметричный мультивибратор G-SM со скоростью импульса 1500 микросекунд, ну и как только свет включают то вибратор начинает посылать импульсы в счетчик, тот их считает и увеличивает выходное значение до установленного значения или максимума 254, свет разгорается. Как только поступает сигнал на выключение счетчик меняется на убывание и считает импульсы обратно до нуля, свет плавно гаснет. Всё это прекрасно работало до тех пор пока я не стал писать программу дальше, а именно: После того как я вставил в программу блоки что бы отображать на экране DS1307 время и число: блоки времени счетчик отвечающий за яркость света стал считать в раз эдак 10 медленнее! Вернее не счетчик похоже а вибратор катастрофически замедлился И это еще не всё! После того как был добавлен блок для вывода на тот же экран температуры и влажности с датчика DHT-22 блок датчика температуры злосчастный счетчик во время отсчета значение яркости стал замирать на пару мгновений каждую секунду в тот момент когда происходит опрос датчика DHT-22 (установить опрос пореже, это понятно, помогает но не в этом суть то!)! Короче ну ё-маё (кстати если блок датчика D-22 не на экран выводить а например в регистры модбаса значения записывать он никак на работу мультивибратора не влияет! Планировалось в проект добавить еще управление двумя другими источниками света, rgb подсветкой, управление эл. жалюзи, контролем температуры в помещении и на улице а тут в самом начале уже не работает ничего.... Почему так то????
Последний раз редактировалось Garrison 10 окт 2016, 20:28, всего редактировалось 1 раз.
-
- Лейтенант
- Сообщения: 361
- Зарегистрирован: 07 сен 2015, 23:53
Нужна помощь, ардуина уна тормозит
А если поставить вторую ардуину, которая будет только выводить на DS1307 ?
-
- Лейтенант
- Сообщения: 595
- Зарегистрирован: 10 янв 2016, 13:47
- Благодарил (а): 1 раз
Нужна помощь, ардуина уна тормозит
+1.Слимпер писал(а):Garrison, Экран у вас как подключен напрямую или через I2C?
1. попробуйте подключить через I2C.
2. часы - вещь в принципе тяжелая (, их библиотека съедает сразу немало так места, озу скорее всего тоже.
3. оптимизируйте проект: попробуйте подвигать местами блоки, избегайте пересечения, используйте нумерованные связи. снизьте количество явных связей, используйте переменные.
4. трэш-хардкор-вариант: отключайте (блоком и) опрос датчика при розжиге )
и ссылки перезалейте - не работают, и весь проект в исходнике выложите.
Последний раз редактировалось holodaleksey 12 окт 2016, 21:57, всего редактировалось 1 раз.
Нужна помощь, ардуина уна тормозит
Как раз на оборот, I2C это довольно медленный порт, а тут по нему сразу и экран и часы работаю.holodaleksey писал(а):1. попробуйте подключить через I2C.
Вообще я пробовал тестить, после подключения экрана по I2C программный цикл контроллера у меня увеличивался до 100мс, а если подключить напрямую (1-10мс). Это естественно на почти пустом проекте.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Нужна помощь, ардуина уна тормозит
Повесьте на вход EN дисплея генератор 500/500мс и RTrig (обновление экрана раз в секунду).
А вот с блоком часов ничего уже не сделать, так и будут опрашиваться на каждом цикле.
Автор, добавьте к блоку RTC вход ENable.
А вот с блоком часов ничего уже не сделать, так и будут опрашиваться на каждом цикле.
Автор, добавьте к блоку RTC вход ENable.
Нужна помощь, ардуина уна тормозит
Слимпер писал(а):Экран у вас как подключен напрямую или через I2C?
Экран подключен через I2C, на нем так же висят часы и барометр.holodaleksey писал(а):1. попробуйте подключить через I2C.
А часы вообще по умолчанию раз в секунду опрашиваться должны бы, а не каждый цикл, чему там чаще изменятся то?Boroda писал(а):А вот с блоком часов ничего уже не сделать, так и будут опрашиваться на каждом цикле.
Ну да можно попробовать. Но не поможет сто процентов потому что даже если на все входа EN блоков дисплея установить значение false ну что бы экран вообще ничего не показывал, проект как тормозил так и продолжает тормозить, помогает только полное удаление блоков из проекта. Походу они даже при false состоянии как работали так и работают.Boroda писал(а):Повесьте на вход EN дисплея генератор 500/500мс и RTrig
Работают, весь проект вечером выложу нет проблем.holodaleksey писал(а):и ссылки перезалейте - не работают, и весь проект в исходнике выложите.
Методом дальнейших экспериментов выяснено что чем больше в проекте добавляется блоков вывода на экран тем сильнее замедляется проект. Так же блок опроса датчика DHT-22 неважно куда он выведен (и выведен ли вообще) если он настроен на опрос раз в секунду то связка генератор/счетчик раз в секунду и замирает при выполнении, всё это явно ненормальное поведение... Пока удалил нафиг все блоки вывода на экран (в конце концов он как вспомогательный задумывался, вся инфа выводится по модбасу на настенную панель) ну а датчик температуры сделал с частотой опроса раз в две минуты. Но вообще не гуд такие тормоза на практически пустом месте.
Последний раз редактировалось Garrison 11 окт 2016, 14:42, всего редактировалось 1 раз.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Нужна помощь, ардуина уна тормозит
Ну так в нормальном коде делается один "блок" вывода на индикатор и один массив переменных для вывода. В любом месте программы массив обновляется и ставится флаг "вывод на индикатор" и в следующем цикле программа выводит на индикатор или в прерывании, если используется LED-индикатор. Ну а это ФБД... И оно работает так, как работает... Что-то критичное ко времени не сделаешь. Только блоки на СИ с прерываниями.
Нужна помощь, ардуина уна тормозит
Да, я уже прихожу к мысли что в таком виде в котором есть сейчас FLprog он годится только на "светодиодом поморгать" Чуть больше 3-4 блоков в проекте и все, неадекватное поведение и тормоза.Boroda писал(а):Что-то критичное ко времени не сделаешь. Только блоки на СИ с прерываниями.
Последний раз редактировалось Garrison 11 окт 2016, 14:53, всего редактировалось 1 раз.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Нужна помощь, ардуина уна тормозит
Сам программирую PIC и обычно делаю так: прерывания от таймера0 каждые 1..4мс, в нем считаю все таймера, которые используются в программе, в том числе и часы, опрос кнопок, вывод на LED-индикатор, регулировка его яркости, опрос DS18B20 по одному биту за цикл таймера. А основная программа представляет собой конечный автомат (блоки IF/ENDIF, выполняющие логику устройства, по различным флагам, будь то переполнение таймера, нажатая кнопка, флаг обновления экрана и т.д.). Таким образом основной цикл программы никогда нигде не задерживается надолго, успевая выполнять все. При этом в основном использую кварцы на 4МГц, что равно 1МГц у AVR-контроллеров. При рисовании ФБД такого никогда не добиться. Поэтому если хочется что-то быстрое делать на Arduino и FLprog, то либо писать блок СИ, либо использовать внешнюю микросхему.
Добавлено (11.10.2016, 15:06)
---------------------------------------------
Ну FLprog расчитан под АСУшников - это мелкая и средняя автоматика, диспетчеризация, умные реле (логика, триггеры, таймеры), Modbus... Время +-100мс пофигу (за редким исключением). В этом направлении FLprog справляется на все 200 процентов!
Добавлено (11.10.2016, 15:06)
---------------------------------------------
Ну FLprog расчитан под АСУшников - это мелкая и средняя автоматика, диспетчеризация, умные реле (логика, триггеры, таймеры), Modbus... Время +-100мс пофигу (за редким исключением). В этом направлении FLprog справляется на все 200 процентов!
Нужна помощь, ардуина уна тормозит
Я обычно использую по одному блоку вывода на экран на каждую строку экрана.Garrison писал(а):Методом дальнейших экспериментов выяснено что чем больше в проекте добавляется блоков вывода на экран тем сильнее замедляется проект.
А в остальных местах использую строковую переменную
А вообще если позволяют входы лучше использовать прямое подключение.
Я еще пробовал подключать эти экранчики через шину SPI, через микросхему 74HC595. и то быстрее работает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Нужна помощь, ардуина уна тормозит
Возьмите любой PLC или Умное реле - если и есть индикатор, то только на внутреннем интерфейсе. Если есть быстрые ноги, то максимальная скорость переключения 20мкс без всякого ШИМа, при разрядности 256 шагов период ШИМа будет 5 мс. Но Вы не сможете сделать такой быстрый ШИМ, т.к. минимальный период цикла контроллера 1мс. Это учитывая тактовую частоту контроллера 200..400 МГц, а у ардуинки 16МГц. То, что сделал Автор FLprog - это большое благо и огромная работа, сильно упрощающая нашу жизнь!
Добавлено (11.10.2016, 15:34)
---------------------------------------------
Слимпер, я думаю там еще библиотека LCD - костыль на костыле, никак не оптимизирована. Да еще волшебный String - у нас на склейке стрингов для СМС ПЛК виснут, выполнение программы за максимальное время цикла выходит.
Добавлено (11.10.2016, 15:34)
---------------------------------------------
Слимпер, я думаю там еще библиотека LCD - костыль на костыле, никак не оптимизирована. Да еще волшебный String - у нас на склейке стрингов для СМС ПЛК виснут, выполнение программы за максимальное время цикла выходит.
Последний раз редактировалось Boroda 11 окт 2016, 15:35, всего редактировалось 1 раз.
Нужна помощь, ардуина уна тормозит
Garrison, Вообще есть довольно простой варинат для вашей задачи, разделить задачи на между двумя платами, одна для быстрых задач, а другая датчики и экран.
Добавлено (11.10.2016, 15:44)
---------------------------------------------
Добавлено (11.10.2016, 15:44)
---------------------------------------------
Тут вы не правы, в реали ШИМ можно разогнать до 32кГц, фронты заваленные конечно, но импульсы идут. Но он работает на аппаратных прерываниях. Это я про Atmega.Boroda писал(а):Если есть быстрые ноги, то максимальная скорость переключения 20мкс без всякого ШИМа, при разрядности 256 шагов период ШИМа будет 5 мс. Но Вы не сможете сделать такой быстрый ШИМ, т.к. минимальный период цикла контроллера 1мс. Это учитывая тактовую частоту контроллера 200..400 МГц, а у ардуинки 16МГц
Последний раз редактировалось Слимпер 11 окт 2016, 15:45, всего редактировалось 1 раз.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Нужна помощь, ардуина уна тормозит
Слимпер писал(а):разделить задачи на между двумя платами
Слимпер, так вот если бы FLprog умела запускать платы по событиям или по таймеру, а то ведь все последовательно выполняется. Вот например плату А запускать каждый цикл, а плату Б каждый 10 цикл, а плату С - каждые 100. Вот это было бы круто! Или вместо циклов милисекунды.
Добавлено (11.10.2016, 15:48)
---------------------------------------------
А я про ПЛК. На АВРке то, думаю и побыстрее можно, но на аппаратном уровне.Слимпер писал(а):Тут вы не правы, в реали ШИМ
Последний раз редактировалось Boroda 11 окт 2016, 15:49, всего редактировалось 1 раз.
Нужна помощь, ардуина уна тормозит
Как вариант для можно делать пользовательские блоки с входом EN и так частично реализовать такой принцип, сам часто так делаю.Boroda писал(а):так вот если бы FLprog умела запускать платы по событиям
Я пробовал писать блоки работающие с прерываниями, можно, но есть проблемы.
А датчики я вообще стараюсь опршивать только по очереди, за цикл не больше одного датчика.
Последний раз редактировалось Слимпер 11 окт 2016, 15:52, всего редактировалось 1 раз.
Нужна помощь, ардуина уна тормозит
Да вот я об этом же подумываю, валяется как раз ардуинка мини еще, надо посмотреть как они в связке над этими задачами работать будут.Слимпер писал(а):ообще есть довольно простой варинат для вашей задачи, разделить задачи на между двумя платами, одна для быстрых задач, а другая датчики и экран.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Нужна помощь, ардуина уна тормозит
Тут где-то гуляла тема "Бит Enable на плату", так народ и Автор против был. Говорят в блок пользователя свою схему засунь и вытащи EN, а как туда засунешь блоки, которые есть в меню программы, но нет в меню пользовательского блока? К тому же блок пользователя отбирает из памяти некоторое количество переменных, равное количеству входов/выходов.
Почему проблематично это сделать - не знаю? Судя по коду - обноси плату IF/ENDIF и радуйся, вроде ничего не мешает. Придется только еще один тип переменных добавить - флаги плат. А вообще лучше выбор: постоянно, запускать по внешнему флагу или по таймеру.
Почему проблематично это сделать - не знаю? Судя по коду - обноси плату IF/ENDIF и радуйся, вроде ничего не мешает. Придется только еще один тип переменных добавить - флаги плат. А вообще лучше выбор: постоянно, запускать по внешнему флагу или по таймеру.
Последний раз редактировалось Boroda 11 окт 2016, 16:04, всего редактировалось 1 раз.
Нужна помощь, ардуина уна тормозит
Ну тут получается или оптимизация скорости или компактности. А то что в пользовательских блоках нельзя использовать многие блоки это конечно жалко.Boroda писал(а):Тут где-то гуляла тема "Бит Enable на плату", так народ и Автор против был. Говорят в блок пользователя свою схему засунь и вытащи EN, а как туда засунешь блоки, которые есть в меню программы, но нет в меню пользовательского блока? К тому же блок пользователя отбирает из памяти некоторое количество переменных, равное количеству входов/выходов.
Добавлено (11.10.2016, 16:03)
---------------------------------------------
Ну как вы писали, задач где критично время, не так уж и много. Часто, вообще без разницы 10мс цикл или 500мс, работает и ладно. А если очень надо, то начинаешь изгаляться.
Добавлено (11.10.2016, 16:07)
---------------------------------------------
Я писал блок для работы с энкодером, кончилось тем, что пришлось написать блок на прерываниях по таймеру, зато теперь четко работает. Или нужно было сделать скоростную защиту на отключение, пришлось использовать вход с прерыванием.
Это я привел пример заморочек.
- Boroda
- Капитан
- Сообщения: 836
- Зарегистрирован: 01 май 2016, 01:04
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Нужна помощь, ардуина уна тормозит
Да вот тут человеку делал опрос протокола LLS. Мастер в сети уже был, так вот надо было сниферить СОМ-порт и выдергивать данные от датчика. В проекте использовался индикатор 5110 - жрет времени как слон. Пришлось опрашивать буфер СОМ-порта по прерыванию каждые 1мс, чтоб поймать посылку. Самое интересное - подпрограмма void serialEvent() работает не как прерывание, а в общем цикле (хотя в описании: "Автоматически вызываетcя при поступлении новых данных"). Вот и пришлось выкручиваться.
Последний раз редактировалось Boroda 11 окт 2016, 16:13, всего редактировалось 1 раз.
Нужна помощь, ардуина уна тормозит
Garrison, Вы налепили немеряно экранов, вот они и съели время. Сдерайте один экран на строку. на пример время из трёх блоков блок часов-сложение строк-экран, далее данные датчиков в переменные и вывод на экран.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей