Разработки ecoins
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Секрета нет 39(десятичная система)=27(шестнадцатеричная система).
На вход подается адрес Lcd в десятичной системе.
Имеет смысл разбивать и тридцать герконов - проект будет более читаемый, на каждой плате можно оставить свои текстовые комментарии.
Да и 30 герконов обрабатываются не мгновенно - функция digitalRead() занимается процессорное время, и прочее в Вашем проекте.
Разбивать на задачи и распределять их вызовы во времени и последовательности - это часть культуры проектирования систем автоматизации.
На вход подается адрес Lcd в десятичной системе.
Имеет смысл разбивать и тридцать герконов - проект будет более читаемый, на каждой плате можно оставить свои текстовые комментарии.
Да и 30 герконов обрабатываются не мгновенно - функция digitalRead() занимается процессорное время, и прочее в Вашем проекте.
Разбивать на задачи и распределять их вызовы во времени и последовательности - это часть культуры проектирования систем автоматизации.
Последний раз редактировалось ecoins 19 апр 2020, 13:10, всего редактировалось 1 раз.
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Добавил к микро-тесту lcd сканирование шины i2c c выводом на консоль десятичных и шестнадцатеричных адресов.
Для работы теста потребуются библиотеки RT_HW_BOARDS.h, RT_HW_CONSOLE.h, RT_HW_LCD44780.h.У вас нет необходимых прав для просмотра вложений в этом сообщении.
Разработки ecoins
Доброго времени суток!!
Создал новый пользовательский блок для измерения напряжение на АЦП. Работает по UART нормально, а вот по Modbus почему то нет линка, от мастера запросы приходят, а ардуино ответы не отправляет. Если убираю этот блок, то линк появляется. Код написал ниже. Помогите плиз, а то уже не знаю что делать
!
float result;
int readValue;
int maxValue = 0;
uint32_t start_time = millis();
while ((millis() - start_time) < 1000)
{
readValue = analogRead(A0);
if (readValue > maxValue) {
maxValue = readValue;
}
}
result = (maxValue * 5.0) / 1024.0;
return result;
Создал новый пользовательский блок для измерения напряжение на АЦП. Работает по UART нормально, а вот по Modbus почему то нет линка, от мастера запросы приходят, а ардуино ответы не отправляет. Если убираю этот блок, то линк появляется. Код написал ниже. Помогите плиз, а то уже не знаю что делать

float result;
int readValue;
int maxValue = 0;
uint32_t start_time = millis();
while ((millis() - start_time) < 1000)
{
readValue = analogRead(A0);
if (readValue > maxValue) {
maxValue = readValue;
}
}
result = (maxValue * 5.0) / 1024.0;
return result;
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
У вас задержка 1 сек - процессор в это время стоит.3BEPb писал(а): 19 апр 2020, 14:16 uint32_t start_time = millis();
while ((millis() - start_time) < 1000)
Можно использовать наши блоки для решения проблемы, чуть позже выложу.
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Тест АЦП 1
Тест АЦП 1 раз в сек. Дополнительные библиотеки не требуются. [spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Разработки ecoins
Большое спасибо! Очень помогли 
Отправлено спустя 1 минуту 13 секунд:
А еще вопрос, эти блоки, те что на плате 1, они не базовые? Вы сами их создали?

Отправлено спустя 1 минуту 13 секунд:
А еще вопрос, эти блоки, те что на плате 1, они не базовые? Вы сами их создали?
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Это наши блоки. Таких автономных блоков не мало, все они есть в выложенных библиотеках.3BEPb писал(а): 19 апр 2020, 17:52 А еще вопрос, эти блоки, те что на плате 1, они не базовые? Вы сами их создали?
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Кастомный - это собственный символ для Lcd?
Эту функцию не вставляли в библиотеку. А это действительно полезно и нужно?
Разработки ecoins
Даже я, который знает Си только со словарём, вижу, что это абсолютно два разных скетча получаются. В приведённом выше примере микроконтроллер не стоит, а в течении 1 сек непрерывно считывает значение с аналогового входа. И находит максимальное значение. Не знаю, на сколько это правильно реализовано. Тут будет зависит от того, какое напряжение измеряется.
В предложенном же вами решении всего лишь раз в секунду считывается значение, без всяких максимумов.
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Полный вариант с поиском максимального значения за 1 сек + вывод на консоль (требуется библиотека RT_HW_CONSOLE.h)
Для этого и рекомендуется операции с АЦП (и float) выносить в отдельные задачи.
-----
Код ПБ selectMax:
switch(dir){default:
case 0: timeStart=millis()+period; dir++;
case 1: up=0; sMax=0; dir++;
case 2: if(val>sMax) sMax=val;
if(millis()>=timeStart) {res=(float)sMax*5.0/1023; timeStart=timeStart+period; up=1; dir=1;} break;
}
[spoiler] [/spoiler]
Видно, что опрос АЦП увеличивает время на цикла с 7мкс до 125мкс.Для этого и рекомендуется операции с АЦП (и float) выносить в отдельные задачи.
-----
Код ПБ selectMax:
switch(dir){default:
case 0: timeStart=millis()+period; dir++;
case 1: up=0; sMax=0; dir++;
case 2: if(val>sMax) sMax=val;
if(millis()>=timeStart) {res=(float)sMax*5.0/1023; timeStart=timeStart+period; up=1; dir=1;} break;
}
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Минимальный вариант без выделения отдельной задачи:
Общий период =120 мкс (вместо 7 мкс). Первый вариант более предпочтительный.У вас нет необходимых прав для просмотра вложений в этом сообщении.
Разработки ecoins
Опять добрый вечер
Не нашел блока String для дисплея хотя в pdf файле картинка есть
Есть только перебор нескольких текстовых строк
Не нашел блока String для дисплея хотя в pdf файле картинка есть
Есть только перебор нескольких текстовых строк
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 152 раза
Разработки ecoins
Он называется lcd.str - под номером 6. Прикрепил на всякий случай.tolochko писал(а): 19 апр 2020, 22:24 Не нашел блока String для дисплея хотя в pdf файле картинка есть
Есть только перебор нескольких текстовых строк
-------------------
Надо представлять, что любое появление строковой переменной на плате, это "тормоза" и не рациональное использование ОЗУ , поскольку при каждом вхождении в плату происходит обновление этой переменной.
Несколько улучшает ситуацию следующий метод:
1. Формируется переменная на другой плате, которая вызывается редко - например по диспетчеру как медленная задача. Обычно это 1 сек, но можно и реже.
2. На этой плате формируется нужная строковая переменная, с которой связывается КОНТАКТ FLProg.
3. На вход блока подается не сама переменная, а КОНТАКТ.
-----------------------
Во многих случаях удается избегать использование этого блока, так блоки вывода int и float позволяют добавлять префиксы (заголовки) и суффиксы к выводимой переменной.
При этом сами тексты хранятся во flash-памяти.
Для контроллеров типа Nano,UNO,Mega актуально - в них и ОЗУ мало, и они не самые быстрые (как ни странно Mega немного медленнее Nano - измерения на имеющихся образцах так показали).
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя