Оптимизация создаваемой программы, использование блоков

Уменьшаем вес, время цикла, тормоза.

Различные вопросы по программе не входящие в другие рубрики
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#21

Сообщение Sancho » 26.01.2018{, 20:41}

Nikan писал(а):
26.01.2018{, 19:17}
значит даташит производителя врет?
Нет, не врёт. Страхуются, гарантированно при разных техусловиях 100.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#22

Сообщение Sancho » 27.01.2018{, 09:42}

Пролечена библиотека LiquidCrystal_I2C.h для работы на 400.
Теперь получил:
10 символов - 6,1мс,
20 символов - 12мс.

Отправлено спустя 1 час 39 минут 54 секунды:
Какие выводы из "дисплейной истории" уже можно сделать?
    • Дисплей использовать в не самых быстрых проектах.
    • Если проект устраивает - оставить как есть.
    • Делать свой блок для дисплея с необходимым функционалом. Т.е. слова типа "Температура", "Влажность" и иже выводить единоразово и не затирать, а переменные слать по мере необходимости в нужные знакоместа.
    • При наличии свободных пинов и желания - исключить I2C.
  • Купить вместо PCF8574 Про Мини, управление и индикацию в неё, попробовать найти или переделать библиотеку для записи байта целиком.
Что скажет народ по данному поводу?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

WZV
Сержант
Сообщения: 216
Зарегистрирован: 06.09.2015{, 14:31}
Репутация: 24

Оптимизация создаваемой программы, использование блоков

#23

Сообщение WZV » 27.01.2018{, 12:12}

Sancho писал(а):
27.01.2018{, 11:22}
Дисплей использовать в не самых быстрых проектах.
Делать свой блок для дисплея с необходимым функционалом. Т.е. слова типа "Температура", "Влажность" и иже выводить единоразово и не затирать, а переменные слать по мере необходимости в нужные знакоместа.
При наличии свободных пинов и желания - исключить I2C.
Купить вместо PCF8574 Про Мини, управление и индикацию в неё, попробовать найти или переделать библиотеку для записи байта целиком.
Хорошее решение. Я всегда стараюсь подключать дисплей к отдельному контроллеру(мини,нано, уно). Связываюсь с контроллером по ТСP/IP (Модбас или MQTT). Стараюсь I2C не использовать.

Отправлено спустя 2 минуты 53 секунды:
WZV писал(а):
27.01.2018{, 12:12}
Стараюсь I2C не использовать.
Не только при подключении дисплея, а вообще.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#24

Сообщение Sancho » 27.01.2018{, 12:41}

Почему писал о своём блоке при необходимости "Всё в одном" корпусе?
Вот код, который 17 символов выводит один раз за 899 циклов, при счётчике =100.
Переменная для счёта и индикации увеличивается в каждом цикле на 1, при > 999 сбрасывается в 100.
Сам счётчик пишет в знакоместа с 17.
Время выполнения для D12 от 1 до 0 2,33мс.
Попробуйте убрать условие для первых 17-ти - опять 12мс.
Тесты на 400кГц.
код внутриПоказать

Код: Выделить всё

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "CyberLib.h"
LiquidCrystal_I2C _lcd1(0x3F, 20, 4);
String _gtv2 = "Temperature-test-"; //Переменная стринг 17 символов
int _gtv1 = 100; //Счётная переменная, 100-999, 3 символа
void setup()
{
Wire.begin();
delay(10);
_lcd1.init();
_lcd1.backlight();
D12_Out; 
D12_Low;
_lcd1.clear();
}
void loop()
{
delay(1);
D12_High;
if ((_gtv1) == 100)
{
_lcd1.setCursor(0, 0);
_lcd1.print((_gtv2));
}

_lcd1.setCursor(17, 0);
_lcd1.print(((String(_gtv1, DEC))));

_gtv1 = _gtv1+1;
if ((_gtv1) > (999)) {_gtv1 = 100;}
D12_Low;
}
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

KulibinOrsk
Лейтенант
Сообщения: 515
Зарегистрирован: 25.02.2018{, 08:48}
Репутация: 21
Откуда: Оренбург
Имя: Александр

Входной сдвиговый регистр 74HC165

#25

Сообщение KulibinOrsk » 21.03.2018{, 10:27}

Sancho, спасибо за рекомендацию, но было бы совсем хорошо если бы:
1. Или дали ссылку на: как разогнать (не вижу этого в настройках), аналоговые быстрые так же не вижу как сделать. Насчет оптимизации вывода инфы примерно догадываюсь что это лучше делать в одной плате (или не в том направлении мыслю? )
2. Или напишите как реализовать пункты

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Оптимизация создаваемой программы, использование блоков

#26

Сообщение pan » 21.03.2018{, 10:53}

надо какой нибудь костыль придумать к штатному блоку дисплея, чтобы выводилась инфа по мере необходимости. а то либо постоянно, либо при снятии EN стирается.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#27

Сообщение Sancho » 21.03.2018{, 10:59}

1. Разгон библиотеки для дисплея по I2C - в папке по адресу C:\Users\ВАШ ПОЛЬЗОВАТЕЛЬ\Documents\Arduino\libraries\LiquidCrystal_I2C в файле LiquidCrystal_I2C.cpp в строке Wire.setClock(100000L); 1 заменяется 4, (Если нет такой строки - скопируйте и вставьте) итого:
СпойлерПоказать

Код: Выделить всё

void LiquidCrystal_I2C::begin() {
	Wire.begin();
	Wire.setClock(400000L); // 
	
2. Как писали не раз, сделать свой блок для дисплея, надоело каждый раз править код руками. Но у каждого своя задача, и мои могут совсем им не отвечать...
Комментировать для приемлемой работы входа EN нужно это, пример и оригинал:
СпойлерПоказать

Код: Выделить всё

if (_changeNumber1_Out) {
_dispTempLength1 = (((String(_gtv2, DEC)))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(1, 0);
_lcd1.print(((String(_gtv2, DEC))));
}
      //else {if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;}} Закоментированно, в оригинале три строки!!! Внимательно!!!
      
   Оригинал:
   
      if (_changeNumber1_Out) {
_dispTempLength1 = (((String(_gtv2, DEC)))).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(1, 0);
_lcd1.print(((String(_gtv2, DEC))));
} else {  // Здесь ВНИМАТЕЛЬНО!!!! ПЕРВАЯ СКОБКА, }, перед else, ДОЛЖНА ОСТАТЬСЯ!!!
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} 
}
      
3. Адрес быстрых входов - в шапке темы.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

KulibinOrsk
Лейтенант
Сообщения: 515
Зарегистрирован: 25.02.2018{, 08:48}
Репутация: 21
Откуда: Оренбург
Имя: Александр

Оптимизация создаваемой программы, использование блоков

#28

Сообщение KulibinOrsk » 21.03.2018{, 11:25}

Проверяю работу в железе ардуины нано (328) и все возможные датчики и модули подключаю и смотрю работу.
В дальнейшем соответственно с планами использовать FLPprog в работе и хозяйстве.
На данном этапе подключено: нано + LCD(i2c) + серва + энкодер +2 аналоговых (задатчик угла сервы) + температурный DS18B20 + часы DS1307 + аналоговый с трансформатора тока + кнопка с инкрементом (плюсует значение минут по которому срабатывает будильник).
......... На днях придут еще несколько датчиков (тока, дальномер лазерный + УЗ, 7-ми сегментный индикатор) + шаговые модули + ЦАП + расширители входа-выхода + mp3 плейер + ... вроде все ))) для начала ......
Нужно понять как оптимально составлять программу чтобы она работала без тормозов.

Отправлено спустя 4 минуты 14 секунд:
C:\Users\ВАШ ПОЛЬЗОВАТЕЛЬ\Documents\Arduino\libraries\LiquidCrystal_I2C в файле LiquidCrystal_I2C.cpp в строке Wire.setClock(100000L); 1 заменяется 4, - у меня там совсем нет никаких библиотек. Пустая папка внутри. Есть readme (по установке библиотек) И ссылка внутри. Но как то же работает дисплей по i2c
Вложения
Test_1.flp
(894.8 КБ) 74 скачивания

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#29

Сообщение Sancho » 21.03.2018{, 11:32}

KulibinOrsk, Какой IDE пользуетесь, своей или встроенной. Судя по всему - встроенной, тогда для х64:
C:\Program Files (x86)\FLProg\ideV2\libraries\...
Или попробуйте наверняка поиском :)
Сразу вопрос по делу, так как у меня нету 18В20 и ТТ, и остального идущего:
осцилограф есть?
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Оптимизация создаваемой программы, использование блоков

#30

Сообщение pan » 21.03.2018{, 11:36}

KulibinOrsk писал(а):
21.03.2018{, 11:29}
как оптимально составлять программу
самое основное определиться с приоритетами и временными интервалами.

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

KulibinOrsk
Лейтенант
Сообщения: 515
Зарегистрирован: 25.02.2018{, 08:48}
Репутация: 21
Откуда: Оренбург
Имя: Александр

Оптимизация создаваемой программы, использование блоков

#31

Сообщение KulibinOrsk » 21.03.2018{, 11:45}

Sancho, Осцилограф есть.
у меня по старинке х32 wXP
IDE загружал arduino-1.8.5-windows (наверное в ней все библиотеки)

Отправлено спустя 4 минуты 58 секунд:
У кого есть библиотека наполненная всем джентельменским набором - скиньте во благо ))

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#32

Сообщение Sancho » 21.03.2018{, 11:51}

KulibinOrsk, Запустите поиск по имени файла LiquidCrystal_I2C.cpp. Найдёте - откройте в Notepad++, отредактируйте, сохраните.
Если ещё нет Notepad++ - СРОЧНО установить!!!
В проекте у Вас есть блок получения данных с ТТ, Emon. Зачем в данном проекте отправка в сом порт? Отредактировать блок, убрать лишнее, сохранить.
Остальное по ходу, но Алексей всё выше написал - главное определиться с приоритетами задач.
Бибки LiquidCrystal_I2C уже пролечена
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

Оптимизация создаваемой программы, использование блоков

#33

Сообщение pan » 21.03.2018{, 11:55}

KulibinOrsk, в IDE которая в комплекте с флпрог есть эта библиотека. скопируйте куда надо если пользуетесь установленным IDE

KulibinOrsk
Лейтенант
Сообщения: 515
Зарегистрирован: 25.02.2018{, 08:48}
Репутация: 21
Откуда: Оренбург
Имя: Александр

Оптимизация создаваемой программы, использование блоков

#34

Сообщение KulibinOrsk » 21.03.2018{, 12:05}

Sancho, LiquidCrystal_I2C.cpp - нашел - есть в библиотеке которая была с FLProg
Вот с этим COM-портом и были непонятки. И в описании хотя бы автор указал что - пишите 0 если не нужно передавать. Кто ж знал что оно передает.
У меня запись строчек по разгону - по другому. Посмотрите плиз.
Вложения
LiquidCrystal_I2C.cpp
(6.9 КБ) 66 скачиваний

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#35

Сообщение Sancho » 21.03.2018{, 12:06}

Вставьте туда такую строку, как на примере.
Насчёт сом порта в emon - удалите всё к нему относящиеся и сохраните как новый блок, на всякий случай.
KulibinOrsk,
P.S. Вот так сделай:
Вложения
Emon_no_serial_(CODE).ubi
(60.64 КБ) 93 скачивания
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
belyx
Сержант
Сообщения: 247
Зарегистрирован: 24.07.2016{, 20:38}
Репутация: 20
Откуда: Витебск Беларусь

Оптимизация создаваемой программы, использование блоков

#36

Сообщение belyx » 04.07.2018{, 13:09}

Задача: измерить время цикла программы-с целью оптимизации созданной,бо тормозит.
Метод инверсии переменной с выводом меандра на пин и осциллографа понятен.
Вопрос: если я поставлю скоростной счётчик в таком виде
СпойлерПоказать
измерение цикла.jpg
-насколько неточными будут показания и правильно ли это будет?
Или вторую плату загрузить в другой контроллёр? и измерять им?
измерение цикла.flp
(98.22 КБ) 79 скачиваний
Отправлено спустя 4 минуты 9 секунд:
понятно что вычисления потом сам произведу

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#37

Сообщение Sancho » 04.07.2018{, 16:14}

belyx писал(а):
04.07.2018{, 13:13}
Задача: измерить время цикла программы-с целью оптимизации созданной,бо тормозит.
Я думаю, есть самый простой способ написать блок и слать данные в ком порт.
Несколько нюансов: измерять за несколько циклов и усреднять или измерять один но по команде.
Примерный код :

Код: Выделить всё

Serial.print("Time: "); Serial.println((millis()-Time),DEC); // micros(); если надо
Serial.println("Start "); Time=millis(); // micros() .........
Надеюсь, понимаете, почему строки как-бы наоборот....
Для периодической отправки поставить счётчик циклов, отправлять в каждом 1234....
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
belyx
Сержант
Сообщения: 247
Зарегистрирован: 24.07.2016{, 20:38}
Репутация: 20
Откуда: Витебск Беларусь

Оптимизация создаваемой программы, использование блоков

#38

Сообщение belyx » 04.07.2018{, 16:49}

Sancho писал(а):
04.07.2018{, 16:14}
есть самый простой способ написать блок
для меня не есть так!
я думаю надо как то без изысков-просто цифры достаточно-это же всё время

Отправлено спустя 4 минуты 9 секунд:
изучаю
Sancho писал(а):
04.07.2018{, 16:14}
millis
Отправлено спустя 8 минут 9 секунд:
из описания-"Возвращает количество миллисекунд, прошедших с момента старта программы Ардуино"
наверно не совсем подходит т.к. в зависимости от режимов(условий)эти циклы меняются и что получится,что-то усреднённое?

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Оптимизация создаваемой программы, использование блоков

#39

Сообщение Sancho » 04.07.2018{, 17:11}

belyx,
Посмотрите код - он выводит разность между текущим и записанным в предыдущем цикле!
Напишу/сделаю Вам блочок. Опишите периодичность вывода и куда.

Отправлено спустя 1 минуту 5 секунд:
belyx писал(а):
04.07.2018{, 17:01}
наверно не совсем подходит т.к. в зависимости от режимов(условий)эти циклы меняются и что получится,что-то усреднённое?
Можно сделать работу по EN - будете включать в нужные моменты.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
belyx
Сержант
Сообщения: 247
Зарегистрирован: 24.07.2016{, 20:38}
Репутация: 20
Откуда: Витебск Беларусь

Оптимизация создаваемой программы, использование блоков

#40

Сообщение belyx » 04.07.2018{, 17:26}

про разность-да уже прочитал-был неправ!
период-(100-500) миллисекунд(как удобно),в ком порт

Отправлено спустя 2 минуты 5 секунд:
Sancho писал(а):
04.07.2018{, 17:12}
Можно сделать работу по EN
-желательно

Отправлено спустя 1 час 8 минут 36 секунд:
Sancho писал(а):
04.07.2018{, 17:12}
Напишу/сделаю Вам блочок
буду Вам очень благодарен !!!

Ответить

Вернуться в «Прочие вопросы»