Переназначение аппартных функций на произвольные пины
-
-
13.07.2022 #76640
Николай
КлючникELEKTROS 13 июл 2022, 19:34Задача такая: устройство условно имеет 4 реле подключенные к ножкам микроконтроллера (5,7,20,33), имеет 4 потребителя которые подключаются к этим 4 реле произвольным образом. Настройками через какое то приложение мы выставляем соответствие действий подключенным нагрузкам. Как это огранизовать в коде? Задача наверняка тривиальная, но сформировать правильно запрос не могу чтобы найти похожее. Самое простое что придумал: есть массив на 4 элемента (это собственно настройка есть), каждому индексу массива соответствует действие, а элемент массива это номер ножки (реле) на которой это действие реализуется, но косяк в том что нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выход. Может есть наоборот как то метод не пин для действия выбирать, а действие для пина (в этом случае обработку непонятно как организовать)?NStorm 13 июл 2022, 21:57но косяк в том что нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выход.Кому следить? Разве не пользователь в программе должен задавать разные действия? Так может в софте, где Настройками через какое то приложение мы выставляем соответствие действий подключенным нагрузкам следить, чтобы мапилось правильно просто? А в прошике просто передавать номер пина/адрес порта и т.п. нужной функции и всё?
В общем не совсем понятно в чем проблема, уйма способов и подходов.NStorm 13 июл 2022, 22:00есть массив на 4 элемента (это собственно настройка есть), каждому индексу массива соответствует действие, а элемент массива это номер ножки (реле) на которой это действие реализуется, но косяк в том что нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выходНу элементарно при загрузке настроек или в клиентской части или в прошивке проверьте, чтобы все элементы массива были разные и соответствовали подходящим ножкам. Пройтись просто в цикле по массиву и всё.
aamonster 14 июл 2022, 03:27Фанаты комбинаторики могут, конечно, задать перестановку числом от 0 до 23 (24 перестановки: 4! = 1*2*3*4) и обрабатывать соответственно, но смысла в этом никакого, проверить конфиг на корректность проще и удобнееu37 14 июл 2022, 03:56есть массив на 4 элемента (это собственно настройка есть), каждому индексу массива соответствует действие, а элемент массива это номер ножки (реле) на которой это действие реализуется, но косяк в том что нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выходПеределайте на:
есть массив на 4 элемента (это собственно настройка есть), каждому индексу массива соответствует номер ножки (реле), а элемент массива это действие на этот индекс массиваNStorm 14 июл 2022, 12:09u37, смотря как у ТС обработка реализуется – параллельно ли все действия или какая-то очередность или приоритеты есть. В некоторых случаях в исходном варианте удобнее. Короче смотря от чего пляшет остальная логика работы.NStorm 14 июл 2022, 12:12Я бы просто в софте для настройки в UI сделал бы так, чтобы нельзя было назначить одно действие на несколько выходов. Как это обычно бывает в софте, да в том же кубе местами. Если назначенное действие назначили на другой выход, то с прошлого выхода оно автоматом слетает и всё.fr0ster 14 июл 2022, 15:11А если типа как в Кубе ножку поименовать, в сгенеренном коде появится вефайн на порт и пин и в коде использовать это макроопределение, если в настройках что то поменяешь, то в коде ничего менять не надо. Ну и дефайн сам как бы говорит о чем он, в отличие от индекса массиваELEKTROS 14 июл 2022, 15:34NStorm писал(а):Я бы просто в софте для настройки в UI сделал бы так, чтобы нельзя было назначить одно действие на несколько выходов. Как это обычно бывает в софте, да в том же кубе местами. Если назначенное действие назначили на другой выход, то с прошлого выхода оно автоматом слетает и всё.Ну собственно так и придумал самое первое что написал, но чё то не нравиться мне это, проверять, да в принципе время затраченое на пробег по циклу фигня.
Работа асинхронная всех процессов, там выше спрашивали.
Ладно если быстрого решения нет другого, видимо так и сделаю.NStorm 14 июл 2022, 15:40Это абсолютно нормальная практика. Тем более проверять цикл нужно только раз, при изменении настроек. Время на это, особенно для 4х вариантов всего, смехотворное, не стоит усложнять.x893 14 июл 2022, 16:07ELEKTROS писал(а):нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выход. Может есть наоборот как то метод не пин для действия выбирать, а действие для пина (в этом случае обработку непонятно как организовать)?Простейшая программа для проверки повторов в массиве из 4 (четырёх Карл !) элементов. 6 (шесть Карл !) проверок
fr0ster 14 июл 2022, 16:09x893 писал(а):ELEKTROS писал(а):нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выход. Может есть наоборот как то метод не пин для действия выбирать, а действие для пина (в этом случае обработку непонятно как организовать)?Простейшая программа для проверки повторов в массиве из 4 (четырёх Карл !) элементов.
Битовая маска чем плоха?
vt340 14 июл 2022, 16:26ELEKTROS писал(а):Настройками через какое то приложение мы выставляем соответствие действий подключенным нагрузкам. Как это огранизовать в коде?Пусть все соответствия будут уже выставлены в начальной конфигурации, а дальше не выставлять, а менять местами в выбранной паре
bodigard 15 июл 2022, 11:36зачем фигней страдаете …
1 – заводите глобальный массив uint8_t outStatus[4],
2 – в софте меняете его как нужно
3 – заводите новый поток
4 – в ф-ции потока просто проверяете состояние массива пишите что-то похожееКод:if(outStatus0) LL_GPIO_SetOutputPin(<,PIN 1 PORT>,, <,PIN 1>,),
else LL_GPIO_ResetOutputPin(<,PIN 1 PORT>,, <,PIN 1>,),
if(outStatus1) LL_GPIO_SetOutputPin(<,PIN 2 PORT>,, <,PIN 2>,),
else LL_GPIO_ResetOutputPin(<,PIN 2 PORT>,, <,PIN 2>,),
……
osDelay(50),или сделайте из массива маску и используйте LL_GPIO_WriteOutputPort тогда вообще 2 строки будет, если конечно пины на одном порту
ELEKTROS 19 июл 2022, 11:44bodigard писал(а):зачем фигней страдаете …
1 – заводите глобальный массив uint8_t outStatus[4],
2 – в софте меняете его как нужно
3 – заводите новый поток
4 – в ф-ции потока просто проверяете состояние массива пишите что-то похожееКод:if(outStatus0) LL_GPIO_SetOutputPin(<,PIN 1 PORT>,, <,PIN 1>,),
else LL_GPIO_ResetOutputPin(<,PIN 1 PORT>,, <,PIN 1>,),
if(outStatus1) LL_GPIO_SetOutputPin(<,PIN 2 PORT>,, <,PIN 2>,),
else LL_GPIO_ResetOutputPin(<,PIN 2 PORT>,, <,PIN 2>,),
……
osDelay(50),или сделайте из массива маску и используйте LL_GPIO_WriteOutputPort тогда вообще 2 строки будет, если конечно пины на одном порту
Спасибо за подсказку. Я уже не стал писать, мне такой вариант тоже в голову пришёл на выходных, отвлечься видимо надо было.
Хех, смотрю на дату, надо было до выходных заглянуть.
-
- Вы должны войти в систему, чтобы ответить в этой теме.