FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Пятница, 09.12.2016, 12:36
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 3123»
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » Нужна помощь, ардуина уна тормозит
Нужна помощь, ардуина уна тормозит
Garrison
Дата: Понедельник, 10.10.2016, 20:27 | Сообщение # 1
Рядовой
Группа: Проверенные
Сообщений: 14
Награды: 1
Репутация: 0
Статус: Offline
Доброго времени суток знатоки! Проблема в тормозах при исполнении программы. Вот часть программы отвечающая за управление светом, её задача это включение, выключение, плавная регулировка и плавный розжиг/затухание при включении и выключении, до уровня установленного на входе "яркость" Картинка   Для того чтобы реализовать плавный розжиг и плавное затухание я использовал счетчик CTDU ко входу которого я приделал симметричный мультивибратор G-SM со скоростью импульса 1500 микросекунд, ну и как только свет включают то вибратор начинает посылать импульсы в счетчик, тот их считает и увеличивает выходное значение до установленного значения или максимума 254, свет разгорается. Как только поступает сигнал на выключение счетчик меняется на убывание и считает импульсы обратно до нуля, свет плавно гаснет. Всё это прекрасно работало до тех пор пока я не стал писать программу дальше, а именно: После того как я вставил в программу блоки что бы отображать на экране DS1307  время и число: блоки времени  счетчик отвечающий за яркость света стал считать в раз эдак 10 медленнее! Вернее не счетчик похоже а вибратор катастрофически замедлился  cry  И это еще не всё! После того как был добавлен блок для вывода на тот же экран температуры и влажности с датчика DHT-22  блок датчика температуры  злосчастный счетчик  во время отсчета значение яркости стал замирать на пару мгновений каждую секунду в тот момент когда происходит опрос датчика  DHT-22 (установить опрос пореже, это понятно, помогает но не в этом суть то!)!    Короче ну ё-маё  sad (кстати если блок датчика D-22 не на экран выводить а например в регистры модбаса значения записывать он никак на работу мультивибратора не влияет!    Планировалось в проект добавить еще управление двумя другими источниками света, rgb подсветкой, управление  эл. жалюзи, контролем температуры в помещении и на улице а тут в самом начале уже не работает ничего.... Почему так то????

Сообщение отредактировал Garrison - Понедельник, 10.10.2016, 20:28
 
OlegAn1962 Дата: Вторник, 11.10.2016, 02:16 | Сообщение # 2
Майор
Группа: Проверенные
Сообщений: 120
Награды: 0
Репутация: 0
Статус: Offline
А если поставить вторую ардуину, которая будет только выводить на DS1307  ?
 
Слимпер Дата: Вторник, 11.10.2016, 07:59 | Сообщение # 3
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 31
Репутация: 23
Статус: Offline
Garrison, Экран у вас как подключен напрямую или через I2C?
 
holodaleksey Дата: Вторник, 11.10.2016, 08:49 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 106
Награды: 1
Репутация: 1
Статус: Offline
Цитата Слимпер ()
Garrison, Экран у вас как подключен напрямую или через I2C?
+1.
1. попробуйте подключить через I2C.
2. часы - вещь в принципе тяжелая (, их библиотека съедает сразу немало так места, озу скорее всего тоже.
3. оптимизируйте проект: попробуйте подвигать местами блоки, избегайте пересечения, используйте нумерованные связи. снизьте количество явных связей, используйте переменные.
4. трэш-хардкор-вариант: отключайте (блоком и) опрос датчика при розжиге )

и ссылки перезалейте - не работают, и весь проект в исходнике выложите.


Сообщение отредактировал holodaleksey - Среда, 12.10.2016, 21:57
 
Слимпер Дата: Вторник, 11.10.2016, 11:00 | Сообщение # 5
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 31
Репутация: 23
Статус: Offline
Цитата holodaleksey ()
1. попробуйте подключить через I2C.
Как раз на оборот, I2C это довольно медленный порт, а тут по нему сразу и экран и часы работаю.
Вообще я пробовал тестить, после подключения экрана по I2C программный цикл контроллера у меня увеличивался до 100мс, а если подключить напрямую (1-10мс). Это естественно на почти пустом проекте.
 
Boroda Дата: Вторник, 11.10.2016, 13:32 | Сообщение # 6
Майор
Группа: Проверенные
Сообщений: 150
Награды: 8
Репутация: 8
Статус: Offline
Повесьте на вход EN дисплея генератор 500/500мс и RTrig (обновление экрана раз в секунду).
А вот с блоком часов ничего уже не сделать, так и будут опрашиваться на каждом цикле.
Автор, добавьте к блоку RTC вход ENable.
 
Garrison Дата: Вторник, 11.10.2016, 14:32 | Сообщение # 7
Рядовой
Группа: Проверенные
Сообщений: 14
Награды: 1
Репутация: 0
Статус: Offline
Цитата Слимпер ()
Экран у вас как подключен напрямую или через I2C?
Цитата holodaleksey ()
1. попробуйте подключить через I2C.
Экран подключен через  I2C, на нем так же висят часы и барометр.
Цитата Boroda ()
А вот с блоком часов ничего уже не сделать, так и будут опрашиваться на каждом цикле.
А часы вообще по умолчанию раз в секунду опрашиваться должны бы, а не каждый цикл, чему там чаще изменятся то?
Цитата Boroda ()
Повесьте на вход EN дисплея генератор 500/500мс и RTrig
Ну да можно попробовать. Но не поможет сто процентов потому что даже если на все входа EN  блоков дисплея установить значение false ну что бы экран вообще ничего не показывал, проект как тормозил так и продолжает тормозить, помогает только полное удаление блоков из проекта. Походу они даже при false состоянии как работали так и работают.
Цитата holodaleksey ()
и ссылки перезалейте - не работают, и весь проект в исходнике выложите.
Работают, весь проект вечером выложу нет проблем.

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


Сообщение отредактировал Garrison - Вторник, 11.10.2016, 14:42
 
Boroda Дата: Вторник, 11.10.2016, 14:43 | Сообщение # 8
Майор
Группа: Проверенные
Сообщений: 150
Награды: 8
Репутация: 8
Статус: Offline
Ну так в нормальном коде делается один "блок" вывода на индикатор и один массив переменных для вывода. В любом месте программы массив обновляется и ставится флаг "вывод на индикатор" и в следующем цикле программа выводит на индикатор или в прерывании, если используется LED-индикатор. Ну а это ФБД... И оно работает так, как работает... Что-то критичное ко времени не сделаешь. Только блоки на СИ с прерываниями.
 
Garrison Дата: Вторник, 11.10.2016, 14:52 | Сообщение # 9
Рядовой
Группа: Проверенные
Сообщений: 14
Награды: 1
Репутация: 0
Статус: Offline
Цитата Boroda ()
Что-то критичное ко времени не сделаешь. Только блоки на СИ с прерываниями.
Да, я уже прихожу к мысли что в таком виде в котором есть сейчас FLprog он годится только на "светодиодом поморгать" Чуть больше 3-4 блоков в проекте и все, неадекватное поведение и тормоза.


Сообщение отредактировал Garrison - Вторник, 11.10.2016, 14:53
 
Boroda Дата: Вторник, 11.10.2016, 15:06 | Сообщение # 10
Майор
Группа: Проверенные
Сообщений: 150
Награды: 8
Репутация: 8
Статус: Offline
Сам программирую 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:29 | Сообщение # 11
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 31
Репутация: 23
Статус: Offline
Цитата Garrison ()
Методом дальнейших экспериментов выяснено что чем больше в проекте добавляется блоков вывода на экран тем сильнее замедляется проект.
Я обычно использую по одному блоку вывода на экран на каждую строку экрана.
А в  остальных местах использую строковую переменную 

А вообще если позволяют входы лучше использовать прямое подключение.
Я еще пробовал подключать эти экранчики через шину SPI, через микросхему 74HC595.  и то быстрее работает.
Прикрепления: 0819449.png(4Kb)
 
Boroda Дата: Вторник, 11.10.2016, 15:34 | Сообщение # 12
Майор
Группа: Проверенные
Сообщений: 150
Награды: 8
Репутация: 8
Статус: Offline
Возьмите любой PLC или Умное реле - если и есть индикатор, то только на внутреннем интерфейсе. Если есть быстрые ноги, то максимальная скорость переключения 20мкс без всякого ШИМа, при разрядности 256 шагов период ШИМа будет 5 мс. Но Вы не сможете сделать такой быстрый ШИМ, т.к. минимальный период цикла контроллера 1мс. Это учитывая тактовую частоту контроллера 200..400 МГц, а у ардуинки 16МГц. То, что сделал Автор FLprog - это большое благо и огромная работа, сильно упрощающая нашу жизнь!

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


Сообщение отредактировал Boroda - Вторник, 11.10.2016, 15:35
 
Слимпер Дата: Вторник, 11.10.2016, 15:44 | Сообщение # 13
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 31
Репутация: 23
Статус: Offline
Garrison, Вообще есть довольно простой варинат для вашей задачи, разделить задачи на между двумя платами, одна для быстрых задач, а другая датчики и экран.

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


Сообщение отредактировал Слимпер - Вторник, 11.10.2016, 15:45
 
Boroda Дата: Вторник, 11.10.2016, 15:48 | Сообщение # 14
Майор
Группа: Проверенные
Сообщений: 150
Награды: 8
Репутация: 8
Статус: Offline
Цитата Слимпер ()
разделить задачи на между двумя платами

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

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


Сообщение отредактировал Boroda - Вторник, 11.10.2016, 15:49
 
Слимпер Дата: Вторник, 11.10.2016, 15:51 | Сообщение # 15
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 31
Репутация: 23
Статус: Offline
Цитата Boroda ()
так вот если бы FLprog умела запускать платы по событиям
Как вариант для можно делать пользовательские блоки с входом EN и так частично реализовать такой принцип, сам часто так делаю.
Я пробовал писать блоки работающие с прерываниями, можно, но есть проблемы.
А датчики я вообще стараюсь опршивать только по очереди, за цикл не больше одного датчика.


Сообщение отредактировал Слимпер - Вторник, 11.10.2016, 15:52
 
Форум » Основной » Спросить у знатоков » Нужна помощь, ардуина уна тормозит
Страница 1 из 3123»
Поиск:

FLProg © 2016
Яндекс.Метрика