• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Синхронизация часов.

pvvx

Активный участник сообщества
Какие библиотеки должны быт включены(#include...) в начале скетча?

--
Arduino 1.6.8 , Из Аrduino.cc
ESP8266 из Github http://arduino.esp8266.com/stable/package_esp8266com_index.json, скопирована в Arduino/ hardware,
сейчас добавлен SDK 1.5.4 в ESP8266com/ES{8266/tools/SDK
всё вроде работает ну только не то что из libnet80211.a, хотя я из неё ничего больше кроме get_tsf_station() не пробовал.
Т.е. у вас одновременно две версии Arduino под ESP8266? Одна в Arduino/hardware, вторая в C:\Users\_Имя_пользователя_\AppData\Local\Arduino15\packages?
И какая из них работает в реале вы не знаете?
Это "ничего" - у многих стоит 3 варианта (третий в C:\Users\_Имя_пользователя_\AppData\Roaming) и они тоже не знают что и как :)
Сча попробую что-нибудь пропатчить и испытать на варианте из GitHub - esp8266/Arduino: ESP8266 core for Arduino ...
 
Последнее редактирование:

sasasa

Member
Нет, Я думаю что однав.
Arduino15/packages/ESP8266/hardware, я оставил только 2.3.0
В AppData/Roaming из Ардуина ничего нет.
 

pvvx

Активный участник сообщества
Взял пример WiFiСlient. Вставил в начало:
Код:
extern "C" uint64_t get_mac_time(void); // step 1 us
#define get_tsf_ap() get_mac_time()
extern "C" uint64_t get_tsf_station(void); // step 1 us
В последнюю строчку в void loop():
Код:
uint64_t tsf = get_tsf_station();
  Serial.print((uint32_t)tsf,DEC);  Serial.print("+"); Serial.println((uint32_t)(tsf>>32),DEC);
Сменил либу C:\Users\_Имя_\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\tools\sdk\lib\libnet80211.a
Сменил имя и пароль WiFi.
Странслировал:
Код:
Connecting to **********
...
WiFi connected
IP address:
192.168.1.225
connecting to data.sparkfun.com
Requesting URL: /input/....................?private_key=....................&value=1
HTTP/1.1 400 Bad Request
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,DELETE
Access-Control-Allow-Headers: X-Requested-With, Phant-Private-Key
Content-Type: text/plain
Date: Fri, 30 Dec 2016 22:57:43 GMT
Connection: close
Transfer-Encoding: chunked
Set-Cookie: SERVERID=; Expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/

13
0 stream not found

0


closing connection
1569688828+67 <---- работает
connecting to data.sparkfun.com
Requesting URL: /input/....................?private_key=....................&value=2
HTTP/1.1 400 Bad Request
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,DELETE
Access-Control-Allow-Headers: X-Requested-With, Phant-Private-Key
Content-Type: text/plain
Date: Fri, 30 Dec 2016 22:57:49 GMT
Connection: close
Transfer-Encoding: chunked
Set-Cookie: SERVERID=; Expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/

13
0 stream not found

0


closing connection
1575986785+67 <---- работает
Пропатченная либа для текущей версии на GitHub - esp8266/Arduino: ESP8266 core for Arduino
 

Вложения

sasasa

Member
Работает! Ради интереса переслал UDP пакетики - посмотреть сколько времени они в пути. Получился интересный результат, который элементарно откорректировать - время прихода пакета (get_mac_time()) раньше чем время послания (get_tsf_station()) почти на 11000мкс -это несмотря на то что пересылка пакета ~3500мкс. Т.е по неизвестной причине часики STA спешат на почти 15000мкс. Синхронность пока не проверял - это на завтра.
Но там, я думаю, всё будет в порядки. Интересно сколько Ардуин внесёт свои поправки?
Потом буду учится "Си", чтобы написать в нормальном виде :)


UDP-TxRx.JPG
 

pvvx

Активный участник сообщества
Ради интереса переслал UDP пакетики - посмотреть сколько времени они в пути. Получился интересный результат, который элементарно откорректировать - время прихода пакета (get_mac_time()) раньше чем время послания (get_tsf_station()) почти на 11000мкс -это несмотря на то что пересылка пакета ~3500мкс. Т.е по неизвестной причине часики STA спешат на почти 15000мкс.
Я AP на ESP не проверял - к ней мало доверия. Неизвестно как, когда и какое значение считанное со своего аппаратного счетчика она отправляет. Надо ковырять. Если совсем криво будет - запатчим :)
Синхронность пока не проверял - это на завтра.
На Arduino не стал бы рассчитывать... По тому и просил - пробуйте, если что, то тоже запатчим :)
 

pvvx

Активный участник сообщества
В Arduino ESP, в режиме station, значение принятого счетчика TSF скачет (более 200 us) при входе в WiFi-sleep: Modem. Этот режим там стоит по умолчанию. Первые секунды, до включения перехода station в WiFi-sleep, вроде всё нормально – расхождения несколько us. Отключайте WiFi-sleep в None.
 

sasasa

Member
C Новым Годом!
У меня такая картинка. В среднем сдвиг по времени 1320мкс, который скачет в пределах 45мкс.
Измерялся нажимая кнопку, которая соединена с gpio2, дальше прерывание.

Код:
void GetTime(){ //for STA
  sta_tsf_time = get_tsf_station();
}

void GetMacTime() {// for AP
  ap_mac_time = get_mac_time();
}

wifi_set_sleep_type(NONE_SLEEP_T);
attachInterrupt(inPin, GetTime, FALLING);
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
У меня такая картинка. В среднем сдвиг по времени 1320мкс, который скачет в пределах 45мкс.
Сдвиг с чем? mac_time - это просто счетчик с момента старта (инициализации WiFi) модуля. А tsf_station - это счетчик принятый с внешней AP. Они всегда разные...
Попробуйте ещё включить 160 MHz и выключить вывод log - system_set_os_print(0).
Должны быть меньше расхождения, т.е. биения
Исходник get_tsf_station() для понимания процесса.
 
Последнее редактирование:

pvvx

Активный участник сообщества
MAC_AP - TSF_STA = 1230 +-50
Это текущее значение TSF на AP и принятое от модуля в режиме station?
Т.е. это время передачи пакета + джиттер обоих модулей с прерываниями по I/O?
Джиттер прерываний по I/O менее 100+ us на ESP не будет. ПО wifi постоянно отрабатывая делает запреты прерываний на 100+ us.
Это испытание уже произведено тут: Синхронизация часов.
Как итог выходит, что get_tsf_station() дает значение точнее, чем может получить модуль по внешнему проводу.
 
Последнее редактирование:

sasasa

Member
Это текущее значение TSF на AP и принятое от модуля в режиме station?
Т.е. это время передачи пакета + джиттер обоих модулей с прерываниями по I/O?
Да.
AP на 160Мгц, STA на 80 (на 160 зависала), system_set_os_print(0).
Такой же результат.
Сейчас не понимаю - Ардуино ИДЕ всё портит или сама ЕСПка
ap-sta.JPG
 

sasasa

Member
И тут картинка рутер+2sta. 2 модуля с идентичным кодом. Как видно, то один из них постоянно тормозит по сравнению с другим.
Разброс около 100мкс, как и ожидал.. Сейчас получается так, что если я синхронизирую между собой сенсор_AP+сенсор _STA, то получаю на половину меньше ошибку, чем в варианте с база_AP + 2 сенсора_STA.
Есть какие то реальные пути уменьшения времени срабатывания прерывания по входу GPIO? Ставить рядом Ардуинку на прерывания?
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
И тут картинка рутер+2sta. 2 модуля с идентичным кодом. Как видно, то один из них постоянно тормозит по сравнению с другим.
Может на это влияет очередность передачи данных по WiFi.
Программы и как что происходит нет и судить не о чем.
 

sasasa

Member
Тут поменял местами модули - тот который быт AP (тормоз) наSTA, и STA на АP.
в графике разница времени MAC_AP и TSF_STA. По любому время на АP на спешит столько же как и было раньше. По любому время на АП на спешит столько же как и было раньше. Но скачки стали больше. Странно, что первые 2 замера на много меньше чем остальные.
 

Вложения

pvvx

Активный участник сообщества
Тут поменял местами модули - тот который быт AP (тормоз) наSTA, и STA на АP.
в графике разница времени MAC_AP и TSF_STA. По любому время на АP на спешит столько же как и было раньше. По любому время на АП на спешит столько же как и было раньше. Но скачки стали больше. Странно, что первые 2 замера на много меньше чем остальные.
У меня от ASUS RT-N56U два модуля ESP показали одинаковые результаты, хотя модули разные: DevKit с ESP-12 и модуль ESP-01.
Счетчик может расходиться если кривые кварцы или в esp_init_data_default.bin указаны автоподстройки (байт 112 не равен нулю и т.д):
Снимок1113.gif
Вообще, если 112 не равен нулю, то у satation ESP сносит мозги до перезагрузок по protected или отваливания на веки от AP до перезагрузки со всеми версиями SDK.
Для полной победы надо переписать всю SDK - выкинуть все вставки Espressif из тянутого ими кода из открытых источников... Их программеры загубили более менее чип, а счас губят ESP-32S :)
 
Последнее редактирование:

nikolz

Well-known member
Добрый день и с Новым Годом!!
--------------------------------------
Хочу рассказать, выражаясь образно,
как смотреть гланды можно гораздо проще,
если не решать эту задачу через зад.
---------------------------
немного теории.
----------------------------
Синхронизация часов двух ESP сводится к привязке их счетчиков времени к некоторой общей базе.
Проще говоря, надо, чтобы показания счетчиков были скорректированы на некоторую константу так, чтобы их значения были одинаковые в момент коррекции.
Участник данной темы pvvx предложил для этой цели использовать значение TSF, которое существует в глубине недокументированного кода оборудования WIFI. (Назовем это - Вариант 1)
------
В результате , занявшись своим любимым делом -взломом чужого софта и патчем SDK недокументированными заплатками,
он породил некоторую временную поделку,
которая не будет работать на новых SDK.
---------------------------------
Но самое удивительное,
что синхронизацию часов с тем же результатом можно сделать в рамках документированных функций SDK,
ничего не взламывая.
--------------------------
Что бы понять как это делать,
давайте сначала разберем в чем суть TSF и с чем его едят.
--------------------------------
Объясняю без несущественных деталей.
-----------------------
В беспроводных сетях есть необходимость синхронизировать работу сети для решения проблем коллизий.
Это делается с помощью рассылаемых AP периодически всем с интервалом 100 мс специального пакета,
в котором AP передает значение своего счетчика времени. это значение и есть TSF.
--------------------
Все станции принимают эти пакеты и сохраняют у себя значение TSF,
чтобы относительно него отсчитывать единое время в сети,
корректируя начальное значение своего счетчика времени.
--------------------------------
Но в задаче данного топика необходимо синхронизировать две ESP.
Поэтому мы может сделать совершенно тоже самое, если с некоторым интервалом будет посылать с одной ESP на другую показание счетчика системного времени этой ESP.
Принимающая eSP запоминает это значение как базу. (Назовем это Вариант 2)
-----------------------------------
Давайте сравним Вариант 1 и 2.
------------------------------
1) существенная разница в том,
что во втором варианте не надо ничего взламывать и патчить,
все можно делать в рамках существующей документации и SDK.
---------------------
2) Во втором варианте мы может использовать любой протокол в том числе и ESP-now и любое железо, например NRF.
------------------
3) Во-втором варианте мы может использовать обе ESP в режимах станций.
---------------------------
4) Счетчик TSF имеет разрядность 64 бита, а системное время , получаемое документированной функцией system_get_time() 32 бита.
Но 32 бита достаточно для интервала 1 час, что вполне достаточно.
--------------------------------------
Таким образом, оба варианта идентичны для синхронизации часов ESP.
Причем второй вариант применим для любого SDK, любого протокола и любых аппаратных средств без взлома чужого софта.
-----------------------
Ошибка синхронизации, вызванная случайными помехами не устраняется этими методами.
--------------------
Для этого надо использовать алгоритмические методы синхронизации. Но взламывать SDK для этого не надо.
Но это уже другая тема.
 

sasasa

Member
1)
второй вариант применим для любого SDK, любого протокола и любых аппаратных средств без взлома чужого софта.
Это конечно плюс.

2) Во втором варианте мы может использовать любой протокол в том числе и ESP-now
Про ESP-NOW незнаю, но по UDP задержка при пересылке пакета получилась с расхождением 1300-4200мкс.
--
nRF24 (808-828мкс) хороший вариант, но тогда и можно без ЕСПки обойтись. SI4432 дал ещё меньше расхождение по передаче пакета 1010-1013мкс, но эта уже другая тема.
 

pvvx

Активный участник сообщества
Добрый день и с Новым Годом!!
C Новым Годом!
Очнулись? :)
Уже соню раз сказано, что передача счетчика пользователем (упакованного в пакет) будет задержана на непроизвольное время в отсылающем контроллере - читайте стандарт WiFi!
Для совсем тупиков Nikolz ещё раз повторяю - WiFi не два провода между двумя устройствами, а на нем существует арбитраж. Иначе в сети будут сплошные коллизии. Это касается и ESP-Now :p На beacon это не распространяется, т.к. это и есть пакет распределения арбитража между устройствами и пропустивший его - теряет сеть. Передача NSF прописана в стандарте и работает на всех WiFi устройствах. :p Не получив его и его счетчик, модуль не знает когда ему выходить на передачу.
То, что вы писали в качестве теста на скорость передачи после старта модуля - есть обычная глушилка WiFi. Вам про это и тогда говорилось, но увы - читать вы не научились.
А так спасибо за ваше предложение получить синхронизацию с джиттером в 100 ms при следовании beacon-ов c установками по умолчанию :) Нас это не устраивает. У нас тут уже стадия уточнения к десятке us, учитывая кривое китай-ПО в ESP от Espressif. Мы пока пытаемся обойтись без математики с фильтрами и эмуляции ФАПЧ. Как было показано и измерено - джиттер у get_tsf_station() у нас +-1us, но из-за кривого-закрытого ПО от Espressif мы не можем использовать прерывания и опрос счетчика через уже реализованную функцию с точностью менее +-50us. Даже если соединить модули проводом - кривизна ПО Espressif не дает нам большей точности. :mad:
Так што Nikolz– вам остается открыть тему: “Методы Nikolz для синхронизации WiFi сети с предельной точностью до +-0.1 секунды” и распинаться там :) Возможно, такая тема кому-то будет интересна с точки зрения как забить прошивку лишним кодом и данными. Пока у нас всё укладывается в объемы до сотни байт кода вместе с данными. Надеюсь, что вы свой метод уложите в десять байт…
 
Последнее редактирование:

nikolz

Well-known member
Все, что Вы написали - это известно и бездоказательно, так как нет никаких числовых данных.
-------------------------------
Проблема не в том,
что вы используете TSF,
а в том, что Вы ковыряете чужой софт,
делаете кухонные поделки, а потом ругаете тех,
кто дал Вам возможность заняться этими поделками.
(Не плюй в корытце, пригодится воды напиться)
------------------------
Относительно задержки в канале передачи.
Проблема решается использова6нием дифференциальной схемы синхронизации.
Т е использование базового ESP совместно с двумя сенсорными.
в результате задержка в канале передачи не влияет на синхронизацию.
====================
Самое забавное, что Вы не знаете потенциальной точности реализуемой модели.
т е опять по старинке - "метод ползучего эмпиризма.
Хотя в стандарте указана потенциальная погрешность метода 25 мкс.
---------------------------
Относительно метода (Вашего и моего)
Это один и тот же метод.
Метод базовой станции.
У нас с Вами различные алгоритмы реализации этого метода.
Но Вы все равно не можете отличить метод от алгоритма. Бывает...
 
  • Like
Реакции: pvvx
Сверху Снизу