Посмотр рубрик

Объединить несколько скетчей

"Запустить несколько скетчей" на одном процессоре нельзя, их нужно объединить в одну общую программу. Для начала нужно разобраться со всеми возможными конфликтами:

  • Проекты построены на одной и той же плате/платформе?
    • Да - отлично!
    • Нет - нужно убедиться, что "общая" плата сможет работать с железками, которые есть в объединяемых проектах, а также сама обладает нужной периферией
  • Есть ли в проектах железки, подключенные к интерфейсам связи?
    • Нет - отлично!
    • Да, I2C - все железки подключаются к общей шине I2C. Убедитесь, что адреса устройств не совпадают, либо настройте другой адрес или используйте мультиплексор
    • Да, SPI - линии данных и тактирования у устройств общие, а CS (Chip Select) обычно нужен отдельный для каждого устройства
    • Да, UART - один обычный UART канал обычно соединяет два устройства. Если у МК несколько аппаратных UART, можно задействовать их. На некоторых платах поможет программный UART, но он медленнее, сильнее грузит процессор и имеет ограничения
  • Есть ли пины, занятые в обоих проектах?
    • Нет - отлично!
    • Да - разобраться, какую функцию выполняет пин в каждом из проектов и подобрать замену, как в железе, так и в программе:
      • Если это обычный цифровой вход-выход, можно заменить на любой другой
      • Если это измерение аналогового сигнала - заменить на другой аналоговый пин
      • Если это генерация ШИМ, подключить соответственно на другой ШИМ пин и подкорректировать программу
      • Если это прерывание - быть внимательным
  • Используются ли одни и те же периферийные блоки микроконтроллера? Для этого нужно изучить железки и их библиотеки:
    • Нет - ОТЛИЧНО!
    • Да - ситуация требует хорошего опыта работы с Ардуино
    • На Arduino Uno/Nano с ATmega328P библиотека Servo обычно занимает Timer1 и отключает обычный ШИМ на пинах 9 и 10
    • На Arduino Uno/Nano с ATmega328P функция tone() использует Timer2 и во время генерации звука мешает ШИМ на пинах 3 и 11
    • Используются прерывания по таймеру и генерация ШИМ на соответствующем таймере - сложная ситуация

Можно внести все правки в схемы и программы объединяемых проектов, чтобы они не конфликтовали. Далее приступаем к сборке общей программы:

  • Подключаем все библиотеки. Некоторые библиотеки могут конфликтовать, например Servo и Timer1, как обсуждалось выше
  • Сравниваем имена глобальных переменных и дефайны в объединяемых программах: они не должны совпадать. Совпадающие меняем при помощи замены по коду (Правка/Найти) на другие. Далее вставляем все глобальные переменные и дефайны в общую программу
  • Объединяем содержимое блока setup()
  • Вставляем в общую программу все "пользовательские" функции
  • Остаётся loop() - это самая сложная задача

Раньше у нас было два (или больше) отдельно работающих проекта. Теперь наша задача как программиста - продумать и запрограммировать работу этих нескольких проектов в одном, и тут ситуаций уже бесконечное множество:

  • Основной код из разных проектов должен выполняться по очереди по таймеру
  • Набор действий из разных проектов должен переключаться кнопкой или ещё как-то
  • К одному проекту добавляется датчик из другого проекта - данные нужно обработать и запрограммировать их дальнейшее движение (вывод на дисплей, отправку и т.д.)
  • Все "проекты" должны работать одновременно на одном МК

В большинстве случаев нельзя просто так взять и объединить содержимое loop() из разных программ, я надеюсь, все это понимают. Даже мигалку и пищалку таким образом объединить не получится, если изначально код был написан с задержками или замкнутыми циклами. Предыдущие уроки из данного раздела должны с этим помочь.

Полезные страницы #


Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Прокрутить вверх