Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Mishka
2020-10-19 15:41:25

Источником нарушения синхронизации могут выступать разные причины. Часы реального времени, скорее всего, имеют относительно высокую точность хода, поэтому смещение сигналов будет наблюдаться лишь по прошествии нескольких часов, а то и дней. Хотя если и кварцы, и сами часы на разных модулях разные, то это может стать заметным в несколько быстрее.

Скорее всего проблема в задержках обусловлена обработкой прерываний от радио части. Особенно это будет заметно, если код написан на основе delay() или usleep(). Радио протокол, будь то WiFi или BLE подразумевает достаточно жесткий тайминг: если в него не успевать вкладываться, то задержки будут приводить к сбоям в соединении. Поэтому эти прерывания имеют обычно самый высокий приоритет, и delay() будет вынужден ждать, пока не закончится обработка такого прерывания.

Чтобы решить эту задачу, включение светодиодов можно синхронизировать с одним из аппаратных таймеров (RTC вполне подходит). Если сигнал строго периодический, то достаточно выровнять фазу включения по некоторому опорному значению таймера. Например, если светодиод должен зажигаться каждую секунду, а значение таймера измеряется в миллисекундах, то достаточно выполнять проверку остатка от деления значения таймера на 1000. Однако при этом нужно учесть, что в момент, когда значение таймера станет кратным 1000, может выполняться обработка другого, более приоритетного прерывания. Поэтому, вероятно, имеет смысл предусмотреть эту возможную задержку и "догонять" реальное время, например, как-то так (извините, код не совместим с Ардуино):

#define TRIGGER_TIME 1000

void
on_rtc_evt()
{
    /* the trigger counter follows RTC, but incremented in steps of TRIGGER_TIME */
    static uint32_t trigger_counter = 0;

    /* how many triggers were overdued and needed to be consumed */
    static uint16_t trigger_overdue = 0;

    if (RTC->COUNTER - trigger_counter + trigger_bias >= TRIGGER_TIME) {
        trigger_overdue += (RTC->COUNTER - trigger_counter) / TRIGGER_TIME;
        trigger_counter = RTC->COUNTER - RTC->COUNTER % TRIGGER_TIME;
    };

    /* XXX the following code is usually better to keep out of an interrupt handler */
    while (trigger_overdue-- > 0) {
        ledctl(...);
    }
}

Здесь глобальная переменная trigger_bias задает смещение в диапазоне (0; TRIGGER_TIME-1) и устанавливается в соответствии с неким распределенным протоколом синхронизации времени между устройствами. Для этого проекта, как мне думается, протокол может быть достаточно простым, на манер RBS: время от времени высылается серия широковещательных пакетов, и часы всех распределенных устройств подстраиваются под эту рассылку. Можно сделать так, чтобы рассылку осуществлял любой узел сети, но он должен это делать строго в момент срабатывания триггера - необходимо иметь референтное время, чтобы все устройства, которые получили этот пакет, понимали, как их таймер смещен относительно часов передатчика.

Bogdan1999
2020-10-18 20:14:08
MikeM пише:

Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.

Написал вам на почту кинул контактные данные. Готов заплатить за решение этой проблемы

MikeM
2020-10-18 17:37:11

Контактная информация этого человека "странным образом" совпадает с моей.
А решил я эту проблему написанием кода, время выполнения которого не зависит от соотношения количеств передаваемых нулей и единиц.

Bogdan1999
2020-10-18 11:58:55
MikeM пише:

Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))

Можете мне дать Контакты этого человека? Или какими способом он это решил ?

Bogdan1999
2020-10-18 11:57:34
KAS пише:

То есть на всех одинаковый код и они получают только сигнал начала выполнения алгоритма и потом никак не связаны между собой?

Да правильно

MikeM
2020-10-17 18:35:54

Причина рассинхронизации может быть в способе реализации управления ws2812b. На них нужно передавать довольно много информации и если эта информация различается между костюмами, то я знаю одного человека, который эту проблему успешно решил )))

MikeM
2020-10-17 18:31:01

Разбить программу на фрагменты, в пределах которых рассинхронизация не проявляется и запускать каждый фрагмент отдельным внешним воздействием.
Я когда увидел такое в начале сезона "Танців з зірками", тоже загорелся подобной идеей, но не нашёл единомышленников среди служителей Терпсихоры и отложил идею до лучших времён

KAS
2020-10-17 18:04:15

То есть на всех одинаковый код и они получают только сигнал начала выполнения алгоритма и потом никак не связаны между собой?

Bogdan1999
2020-10-17 16:14:24

А это вообще можно сделать не прерывая код ?

Bogdan1999
2020-10-17 16:07:33

А через что это сделать лучше ? Через код ?

leons
2020-10-17 15:33:56

нужно обнулять данные перед приходом новых

Bogdan1999
2020-10-17 10:48:17

Обычная, ткань трикотаж на кофте, а штаны джинс. Но тут точно не в ткани дело. Пытались без подключения к костюму мигать отдельно диодом который на плате стоит. Все равно задержка

renoshnik
2020-10-17 10:13:30

Костюмы из какой ткани пошиты ?

Bogdan1999
2020-10-17 09:54:49

Надо именно, такая логика как описана. Что бы сбоев небыло при передаче. Может на stm32 переделать все ?
Кто то может сталкивался именно с таким порядком ?

vvr
2020-10-17 08:32:04

хотите полной синхронизации - головное даёт команды вкл-выкл, а костюмы выполняют.

Підвал форуму