Переназначение аппартных функций на произвольные пины

    • #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:09
      u37, смотря как у ТС обработка реализуется – параллельно ли все действия или какая-то очередность или приоритеты есть. В некоторых случаях в исходном варианте удобнее. Короче смотря от чего пляшет остальная логика работы.

      NStorm

      14 июл 2022, 12:12
      Я бы просто в софте для настройки в UI сделал бы так, чтобы нельзя было назначить одно действие на несколько выходов. Как это обычно бывает в софте, да в том же кубе местами. Если назначенное действие назначили на другой выход, то с прошлого выхода оно автоматом слетает и всё.

      fr0ster

      14 июл 2022, 15:11
      А если типа как в Кубе ножку поименовать, в сгенеренном коде появится вефайн на порт и пин и в коде использовать это макроопределение, если в настройках что то поменяешь, то в коде ничего менять не надо. Ну и дефайн сам как бы говорит о чем он, в отличие от индекса массива

      ELEKTROS

      14 июл 2022, 15:34
      NStorm писал(а):
      Я бы просто в софте для настройки в UI сделал бы так, чтобы нельзя было назначить одно действие на несколько выходов. Как это обычно бывает в софте, да в том же кубе местами. Если назначенное действие назначили на другой выход, то с прошлого выхода оно автоматом слетает и всё.

      Ну собственно так и придумал самое первое что написал, но чё то не нравиться мне это, проверять, да в принципе время затраченое на пробег по циклу фигня.
      Работа асинхронная всех процессов, там выше спрашивали.
      Ладно если быстрого решения нет другого, видимо так и сделаю.

      NStorm

      14 июл 2022, 15:40
      Это абсолютно нормальная практика. Тем более проверять цикл нужно только раз, при изменении настроек. Время на это, особенно для 4х вариантов всего, смехотворное, не стоит усложнять.

      x893

      14 июл 2022, 16:07
      ELEKTROS писал(а):
      нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выход. Может есть наоборот как то метод не пин для действия выбирать, а действие для пина (в этом случае обработку непонятно как организовать)?

      Простейшая программа для проверки повторов в массиве из 4 (четырёх Карл !) элементов. 6 (шесть Карл !) проверок

      fr0ster

      14 июл 2022, 16:09
      x893 писал(а):
      ELEKTROS писал(а):
      нужно следить чтобы элементы массива были разные инача на разные действия будет один физический выход. Может есть наоборот как то метод не пин для действия выбирать, а действие для пина (в этом случае обработку непонятно как организовать)?

      Простейшая программа для проверки повторов в массиве из 4 (четырёх Карл !) элементов.

      Битовая маска чем плоха?

      vt340

      14 июл 2022, 16:26
      ELEKTROS писал(а):
      Настройками через какое то приложение мы выставляем соответствие действий подключенным нагрузкам. Как это огранизовать в коде?

      Пусть все соответствия будут уже выставлены в начальной конфигурации, а дальше не выставлять, а менять местами в выбранной паре

      bodigard

      15 июл 2022, 11:36
      зачем фигней страдаете …
      1 – заводите глобальный массив uint8_t outStatus[4],
      2 – в софте меняете его как нужно
      3 – заводите новый поток
      4 – в ф-ции потока просто проверяете состояние массива пишите что-то похожее

      Код:
      if(outStatus0) LL_GPIO_SetOutputPin(&lt,PIN 1 PORT&gt,, &lt,PIN 1&gt,),
      else LL_GPIO_ResetOutputPin(&lt,PIN 1 PORT&gt,, &lt,PIN 1&gt,),
      if(outStatus1) LL_GPIO_SetOutputPin(&lt,PIN 2 PORT&gt,, &lt,PIN 2&gt,),
      else LL_GPIO_ResetOutputPin(&lt,PIN 2 PORT&gt,, &lt,PIN 2&gt,),
      ……
      osDelay(50),

      или сделайте из массива маску и используйте LL_GPIO_WriteOutputPort тогда вообще 2 строки будет, если конечно пины на одном порту

      ELEKTROS

      19 июл 2022, 11:44
      bodigard писал(а):
      зачем фигней страдаете …
      1 – заводите глобальный массив uint8_t outStatus[4],
      2 – в софте меняете его как нужно
      3 – заводите новый поток
      4 – в ф-ции потока просто проверяете состояние массива пишите что-то похожее

      Код:
      if(outStatus0) LL_GPIO_SetOutputPin(&lt,PIN 1 PORT&gt,, &lt,PIN 1&gt,),
      else LL_GPIO_ResetOutputPin(&lt,PIN 1 PORT&gt,, &lt,PIN 1&gt,),
      if(outStatus1) LL_GPIO_SetOutputPin(&lt,PIN 2 PORT&gt,, &lt,PIN 2&gt,),
      else LL_GPIO_ResetOutputPin(&lt,PIN 2 PORT&gt,, &lt,PIN 2&gt,),
      ……
      osDelay(50),

      или сделайте из массива маску и используйте LL_GPIO_WriteOutputPort тогда вообще 2 строки будет, если конечно пины на одном порту

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

Viewing 0 reply threads
  • Вы должны войти в систему, чтобы ответить в этой теме.
Интepecнoe нa фopумe:
Авторизация
*
*
Регистрация
*
*
*
Генерация пароля
×