tonyk_av 65 June 2, 2023 Posted June 2, 2023 · Report post 2 hours ago, xvr said: А как вы Arduino с FreeRTOS скрещивали? Родная FreeRTOS не понимает ни start() ни loop() функций. В Инете попадался отдельный проект Дуни с FreeRTOS. Не вникал глубоко, подробностей не скажу, но задачи та штука крутить могла. А в чём сложность? Дуня, как мне показалось, почти С++, а там задачи крутятся. Share this post Link to post Share on other sites More sharing options...
xvr 12 June 2, 2023 Posted June 2, 2023 · Report post 3 hours ago, tonyk_av said: А в чём сложность? Дуня, как мне показалось, почти С++, а там задачи крутятся. разные точки входа. У Arduino это setup() и loop(), у FreeRTOS это любая процедура, которая зовётся из стартапа и заканчивается vTaskStartScheduler() Например в isp-idf это библиотечные функции esp_startup_start_app и esp_startup_start_app_other_cores, а пользовательский main это app_main() Как у вас скрещивали Arduino и FreeRTOS не понятно. Share this post Link to post Share on other sites More sharing options...
tonyk_av 65 June 3, 2023 Posted June 3, 2023 (edited) · Report post 13 hours ago, xvr said: Как у вас скрещивали Arduino и FreeRTOS не понятно. У меня- никак. Говорю же, попадался на глаза такой проект. Интересно- поищите. Мне он нафиг не нужен, ибо у меня используется С++. P. S. До чего народ стал ленивым, что даже вбить arduino+freertos им впадлу. Edited June 3, 2023 by tonyk_av Share this post Link to post Share on other sites More sharing options...
xvr 12 June 3, 2023 Posted June 3, 2023 · Report post 2 hours ago, tonyk_av said: У меня- никак. Пардон, это вопрос не вам а ТС. Share this post Link to post Share on other sites More sharing options...
AlanSbor 0 June 3, 2023 Posted June 3, 2023 · Report post 23 часа назад, uriy сказал: Странный у вас подход. В первом посте написали что смотрели осцилом - сигнал отличный. Зачем тогда резисторы разные пробовать? У TCA9548A в даташите указана максимальная частот 400 кГц. У LIS2MDL да указано 3.4 МГц На подпаянных резисторах для частоты 1МГц резистор ставил 1,2к - сигнал практически идеальный. Но это не говорит о том что он в самой таске обработается. И да, частоту в 1 МГц ограничивает сам контроллер, то что TCA9548A пропускает такую частоту скорее фича чем баг. Но я учту это и скорее всего снижу частоту до 400 кГц, что бы не вылазить за рамки частотного ограничения по железу. для 400кГц резистор буду пробовать 3.3к и 4.7к, посмотрю на форму сигнала. 23 часа назад, xvr сказал: А как вы Arduino с FreeRTOS скрещивали? Родная FreeRTOS не понимает ни start() ни loop() функций. посмотрите пример Freertos в самой Arduino IDE - там все ясно и понятно. Share this post Link to post Share on other sites More sharing options...
xvr 12 June 3, 2023 Posted June 3, 2023 · Report post 42 minutes ago, AlanSbor said: посмотрите пример Freertos в самой Arduino IDE - там все ясно и понятно. Посмотрел, должно работать. А вот к коммутации датчиков есть вопросы - у вас 1 инстанс для опроса датчика, и 20 штук разных датчиков. Могут не сочетаться 😞 Share this post Link to post Share on other sites More sharing options...
AlanSbor 0 June 4, 2023 Posted June 4, 2023 · Report post 22 часа назад, xvr сказал: Посмотрел, должно работать. А вот к коммутации датчиков есть вопросы - у вас 1 инстанс для опроса датчика, и 20 штук разных датчиков. Могут не сочетаться 😞 1 task - одна задача, опрашивает 8 датчиков lis2mdl через TCA9548, должно работать по I2C. Не хотелось бы делать 20 tasks на каждый датчик - передерутся за шину при такой скорости. Share this post Link to post Share on other sites More sharing options...
tonyk_av 65 June 4, 2023 Posted June 4, 2023 · Report post 4 hours ago, AlanSbor said: Не хотелось бы делать 20 tasks на каждый датчик - передерутся за шину при такой скорости. Создаются объекты "Запрос", "Пул запросов" и "Поллер". Для опроса каждого датчика создаётся последовательность запросов. Поллер, опрашивающий датчики, делается как конечный автомат, который извлекает из пула запрос и выполняет его. У меня по такой схеме работают I2C и Модбас. Share this post Link to post Share on other sites More sharing options...
xvr 12 June 4, 2023 Posted June 4, 2023 · Report post 10 hours ago, AlanSbor said: 1 task - одна задача, опрашивает 8 датчиков lis2mdl через TCA9548, должно работать по I2C. Вопрос не в колическтвае тасков, а в сочетании ОДНОГО инстанса класса Adafruit_LIS2MDL, который у вас обслуживает НЕСКОЛЬКО физических датчиков. Вы уверены, что он на это расчитан? И со стороны аппаратуры - в шилде LIS2MDL (или у каждой микросхемы, если они у вас в виде микросхем) есть своя поддяжка I2C? Так как при переключении каналов TCA9548 у вас только один канал будет подключён с I2C шине (с её поддяжкой), а остальные останутся без подтяжек на их конце I2C вообще - неизвестно как они на это отреагируют. Share this post Link to post Share on other sites More sharing options...
AlanSbor 0 June 6, 2023 Posted June 6, 2023 · Report post В 04.06.2023 в 22:25, xvr сказал: Вопрос не в колическтвае тасков, а в сочетании ОДНОГО инстанса класса Adafruit_LIS2MDL, который у вас обслуживает НЕСКОЛЬКО физических датчиков. Вы уверены, что он на это расчитан? И со стороны аппаратуры - в шилде LIS2MDL (или у каждой микросхемы, если они у вас в виде микросхем) есть своя поддяжка I2C? Так как при переключении каналов TCA9548 у вас только один канал будет подключён с I2C шине (с её поддяжкой), а остальные останутся без подтяжек на их конце I2C вообще - неизвестно как они на это отреагируют. Если я правильно помню инстанс - указатель на выделенная память. Соответственно при вызове events память очищается и туда записываются новые данные. Поправьте пожалуйста меня если я ошибаюсь. Share this post Link to post Share on other sites More sharing options...
AlanSbor 0 June 6, 2023 Posted June 6, 2023 · Report post В 04.06.2023 в 22:25, xvr сказал: Вопрос не в колическтвае тасков, а в сочетании ОДНОГО инстанса класса Adafruit_LIS2MDL, который у вас обслуживает НЕСКОЛЬКО физических датчиков. Вы уверены, что он на это расчитан? И со стороны аппаратуры - в шилде LIS2MDL (или у каждой микросхемы, если они у вас в виде микросхем) есть своя поддяжка I2C? Так как при переключении каналов TCA9548 у вас только один канал будет подключён с I2C шине (с её поддяжкой), а остальные останутся без подтяжек на их конце I2C вообще - неизвестно как они на это отреагируют. Подтяжки сделал для всех каналов - 2.4к, сигналы по i2C - отличные. Попробовал добавить каждому датчику отдельный инстанс - не помогло. Пробовал задержку между опросами каждого датчика - не помогло. Про event посмотрел /**************************************************************************/ /*! @brief Gets the most recent sensor event @param event The `sensors_event_t` to fill with event data @returns true, always */ /**************************************************************************/ bool Adafruit_LIS2MDL::getEvent(sensors_event_t *event) { /* Clear the event */ memset(event, 0, sizeof(sensors_event_t)); /* Read new data */ read(); event->version = sizeof(sensors_event_t); event->sensor_id = _sensorID; event->type = SENSOR_TYPE_MAGNETIC_FIELD; event->timestamp = millis(); event->magnetic.x = (float)raw.x * LIS2MDL_MAG_LSB * LIS2MDL_MILLIGAUSS_TO_MICROTESLA; event->magnetic.y = (float)raw.y * LIS2MDL_MAG_LSB * LIS2MDL_MILLIGAUSS_TO_MICROTESLA; event->magnetic.z = (float)raw.z * LIS2MDL_MAG_LSB * LIS2MDL_MILLIGAUSS_TO_MICROTESLA; return true; } /**************************************************************************/ Очистка при каждом обращении к event Куда копать дальше ? Share this post Link to post Share on other sites More sharing options...
xvr 12 June 6, 2023 Posted June 6, 2023 · Report post У вас сейчас одна TCA9548A установленна, или все 3? Не могут они подраться -у каждой свои коммутируемые каналы, но между собой они не переключаются. Кстати у вас в коде нет отключения каналов TCA9548A при переключении на следующий коммутатор. PS. Можете попробовать (для отделения мух от котлет) запустить вашу таску без FreeRTOS - временно уберите отуда операции с семаформаи и замените xTaskDelay на Arduino delay. И позовите её прямо из start(). Если заработает, то нужно искать в FreeRTOS примитивах (что маловероятно). Если нет - то разбираться с I2C коммутаторами и пр. Share this post Link to post Share on other sites More sharing options...
AlanSbor 0 June 7, 2023 Posted June 7, 2023 · Report post 7 часов назад, xvr сказал: У вас сейчас одна TCA9548A установленна, или все 3? Не могут они подраться -у каждой свои коммутируемые каналы, но между собой они не переключаются. Кстати у вас в коде нет отключения каналов TCA9548A при переключении на следующий коммутатор. PS. Можете попробовать (для отделения мух от котлет) запустить вашу таску без FreeRTOS - временно уберите отуда операции с семаформаи и замените xTaskDelay на Arduino delay. И позовите её прямо из start(). Если заработает, то нужно искать в FreeRTOS примитивах (что маловероятно). Если нет - то разбираться с I2C коммутаторами и пр. Запаяны все три, у них разные адреса и поэтому подраться не могут. Про отключение я понял, но т.к. работает только один, пока не требуется. Вчера ночью пробовал и в freertos без всего - работает только нулевой канал и в одиночной программе дописал пару сенсоров - тоже работает только нулевой канал. Такое впечатление, что после подключения нулевого канала он больше не переключается, может его перед опросом следующего надо отключить и выбрать следующий, вечером попробую. Share this post Link to post Share on other sites More sharing options...
uriy 7 June 7, 2023 Posted June 7, 2023 · Report post Все-таки очень бы хотелось посмотреть логическим анализатором что творится на ножках I2C непосредственно ESP32. Share this post Link to post Share on other sites More sharing options...
xvr 12 June 7, 2023 Posted June 7, 2023 · Report post 4 hours ago, AlanSbor said: Запаяны все три, у них разные адреса и поэтому подраться не могут. Не они сами, а то, что за ними включено - ваши LIS2MDL. Ведь TCA9548A это не мосты I2C, а просто ключи. Все каналы, что были включены, напрямую подключаются к I2C мастера, а не обрабатываются самой TCA9548A, т.е. если вы в дальнейшем не образаетесь к TCA9548A её каналы всё равно остаются подключёнными к I2C. Share this post Link to post Share on other sites More sharing options...