Перейти к содержанию
    

ESP32 + FREERTOS + TCA9548A + LIS2MDDL

2 hours ago, xvr said:

А как вы Arduino с FreeRTOS скрещивали? Родная FreeRTOS не понимает ни start() ни loop() функций.

 

В Инете попадался отдельный проект Дуни с FreeRTOS. Не вникал глубоко, подробностей не скажу, но задачи та штука крутить могла. А в чём сложность? Дуня, как мне показалось, почти С++, а там задачи крутятся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 не понятно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, xvr said:

Как у вас скрещивали Arduino и FreeRTOS не понятно.

У меня- никак. Говорю же, попадался на глаза такой проект. Интересно- поищите. Мне он нафиг не нужен, ибо у меня используется С++.

P. S. До чего народ стал ленивым, что даже вбить arduino+freertos им впадлу.

 

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, tonyk_av said:

У меня- никак.

Пардон, это вопрос не вам а ТС.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 - там все ясно и понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 minutes ago, AlanSbor said:

посмотрите пример Freertos в самой Arduino IDE - там все ясно и понятно.

Посмотрел, должно работать. А вот к коммутации датчиков есть вопросы - у вас 1 инстанс для опроса датчика, и 20 штук разных датчиков. Могут не сочетаться 😞

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 часа назад, xvr сказал:

Посмотрел, должно работать. А вот к коммутации датчиков есть вопросы - у вас 1 инстанс для опроса датчика, и 20 штук разных датчиков. Могут не сочетаться 😞

 

1 task - одна задача, опрашивает 8 датчиков lis2mdl через TCA9548, должно работать по I2C. Не хотелось бы делать 20 tasks на каждый датчик - передерутся за шину при такой скорости. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, AlanSbor said:

Не хотелось бы делать 20 tasks на каждый датчик - передерутся за шину при такой скорости.

Создаются объекты "Запрос", "Пул запросов" и "Поллер". Для опроса каждого датчика создаётся последовательность запросов. Поллер, опрашивающий датчики, делается как конечный автомат, который извлекает из пула запрос и выполняет его. У меня по такой схеме работают I2C и Модбас.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, AlanSbor said:

1 task - одна задача, опрашивает 8 датчиков lis2mdl через TCA9548, должно работать по I2C.

Вопрос не в колическтвае тасков, а в сочетании ОДНОГО инстанса класса Adafruit_LIS2MDL, который у вас обслуживает НЕСКОЛЬКО физических датчиков. Вы уверены, что он на это расчитан?

И со стороны аппаратуры - в шилде LIS2MDL (или у каждой микросхемы, если они у вас в виде микросхем) есть своя поддяжка I2C? Так как при переключении каналов TCA9548 у вас только один канал будет подключён с I2C шине (с её поддяжкой), а остальные останутся без подтяжек на их конце I2C вообще - неизвестно как они на это отреагируют.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 04.06.2023 в 22:25, xvr сказал:

Вопрос не в колическтвае тасков, а в сочетании ОДНОГО инстанса класса Adafruit_LIS2MDL, который у вас обслуживает НЕСКОЛЬКО физических датчиков. Вы уверены, что он на это расчитан?

И со стороны аппаратуры - в шилде LIS2MDL (или у каждой микросхемы, если они у вас в виде микросхем) есть своя поддяжка I2C? Так как при переключении каналов TCA9548 у вас только один канал будет подключён с I2C шине (с её поддяжкой), а остальные останутся без подтяжек на их конце I2C вообще - неизвестно как они на это отреагируют.

 

Если я правильно помню инстанс - указатель на выделенная память. Соответственно при вызове events память очищается и туда записываются новые данные. Поправьте пожалуйста меня если я ошибаюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 

Куда копать дальше ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас сейчас одна TCA9548A  установленна, или все 3? Не могут они подраться -у каждой свои коммутируемые каналы, но между собой они не переключаются. Кстати у вас в коде нет отключения каналов TCA9548A  при переключении на следующий коммутатор.

PS. Можете попробовать (для отделения мух от котлет) запустить вашу таску без FreeRTOS - временно уберите отуда операции с семаформаи и замените xTaskDelay на Arduino delay. И позовите её прямо из start(). Если заработает, то нужно искать в FreeRTOS примитивах (что маловероятно). Если нет - то разбираться с I2C коммутаторами и пр.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, xvr сказал:

У вас сейчас одна TCA9548A  установленна, или все 3? Не могут они подраться -у каждой свои коммутируемые каналы, но между собой они не переключаются. Кстати у вас в коде нет отключения каналов TCA9548A  при переключении на следующий коммутатор.

PS. Можете попробовать (для отделения мух от котлет) запустить вашу таску без FreeRTOS - временно уберите отуда операции с семаформаи и замените xTaskDelay на Arduino delay. И позовите её прямо из start(). Если заработает, то нужно искать в FreeRTOS примитивах (что маловероятно). Если нет - то разбираться с I2C коммутаторами и пр.

 

Запаяны все три, у них разные адреса и поэтому подраться не могут. 

Про отключение я понял, но т.к. работает только один, пока не требуется.

Вчера ночью пробовал и в freertos без всего - работает только нулевой канал и в одиночной программе дописал пару сенсоров - тоже работает только нулевой канал.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все-таки очень бы хотелось посмотреть логическим анализатором что творится на ножках I2C непосредственно ESP32. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, AlanSbor said:

Запаяны все три, у них разные адреса и поэтому подраться не могут. 

 

Не они сами, а то, что за ними включено - ваши LIS2MDL. Ведь TCA9548A  это не мосты I2C, а просто ключи. Все каналы, что были включены, напрямую подключаются к I2C мастера, а не обрабатываются самой TCA9548A, т.е. если вы в дальнейшем не образаетесь к TCA9548A её каналы всё равно остаются подключёнными к I2C.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...