Arduino + DS 3231

Сильно убегает время

На этом форуме Вы можете задать вопросы знатокам программы и автору.
KostiK2009IT
Рядовой
Сообщения: 24
Зарегистрирован: 22.09.2015{, 17:36}
Репутация: 1
Откуда: Рязань

Arduino + DS 3231

#1

Сообщение KostiK2009IT » 14.03.2020{, 11:33}

Доброго дня!
Имею Arduino Mega 2560, часы реального времени ds3231, дисплей на чипе HD44780.
Собираю это все в тестовый стенд - распиновку можно посмотреть в программе, прикрепил. Питание от USB
Провожу синхронизацию часов с компом.
Заливаю тестовую прогу - вывод на дисплей даты и времени с секундами (прикрепленная прога).
Через сутки имею рассинхрон по времени в несколько минут.
Подскажите куда копать, чтобы исправить? Может уже кто сталкивался.

PS с другими часами - ds1307 - такая же история была, поэтому взял ds3231 из другого проекта, в котором они точно работали нормально - время не убегало.

Заранее благодарен.
Вложения
тест часов.flp
(40.27 КБ) 78 скачиваний

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Arduino + DS 3231

#2

Сообщение edyapd » 14.03.2020{, 13:14}

В другом проекте питание тоже от USB?

KostiK2009IT
Рядовой
Сообщения: 24
Зарегистрирован: 22.09.2015{, 17:36}
Репутация: 1
Откуда: Рязань

Arduino + DS 3231

#3

Сообщение KostiK2009IT » 14.03.2020{, 13:20}

проблема наблюдается и при любом питании

Аватара пользователя
nikmotorin60
Рядовой
Сообщения: 35
Зарегистрирован: 29.04.2016{, 09:54}
Репутация: 2

Arduino + DS 3231

#4

Сообщение nikmotorin60 » 14.03.2020{, 15:08}

Купил десяток модулей на ds3231, 2 штуки сразу на 25 сек в сутки спешили. Купил еще микросхемы ds3231 десяток, так 3 штуки забраковал.
Из всех купленных 3 штуки сдохли недолго поработав.
Такая вот статистика...

KostiK2009IT
Рядовой
Сообщения: 24
Зарегистрирован: 22.09.2015{, 17:36}
Репутация: 1
Откуда: Рязань

Arduino + DS 3231

#5

Сообщение KostiK2009IT » 17.03.2020{, 17:01}

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

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Arduino + DS 3231

#6

Сообщение rw6cm » 17.03.2020{, 19:29}

KostiK2009IT писал(а):
17.03.2020{, 17:01}
сказали, что убегание времени может случаться из-за частого опроса часов
Если дисплей убрать, оставить мегу и часы, и через сутки глянуть по UART на время
Win10-64, FLProg (portable)

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

Arduino + DS 3231

#7

Сообщение Labu559 » 18.03.2020{, 00:40}

KostiK2009IT писал(а):
17.03.2020{, 17:01}
Поспрашивал на работе у схемотехников, сказали, что убегание времени может случаться из-за частого опроса часов, зависит от сборки модуля.
Очень похоже, что Ваши схемотехники говорят правду. У меня тоже с некоторых пор появились проблемы с модулем RTC DS1307. Решил заглянуть в код. Увидел, что больше не используется библиотека iarduino_RTC.h. Обратил внимание, что по задумке автора (по коду),

Код: Выделить всё

void get3231Date(int addres, struct _I2CRealRimeClockTime *timeStruct)
{
  if (!(_isTimer ((timeStruct ->startTime), 250))) {
    return;
  }
опрос модуля должен был бы происходить каждые 250 мсек, т.е. 4 раза/сек- и это первая непонятка.
Но, по факту, если я правильно сложил в непрограммистских извилинах содержимого черепной коробки, функция

Код: Выделить всё

bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
или точнее первая часть условия (currentTime>=(startTime + period)) возвратит false всегда (почти, кроме 1 раза в 50 дней) а следующая (см.выше 1-й код) функция void get3231Date(int addres, struct _I2CRealRimeClockTime *timeStruct) из-за строчки if (!(_isTimer ((timeStruct ->startTime), 250))) и предыдущего возврата false перезапишет переменную структуры timeStruct ->startTime = millis(). Короче говоря, если я правильно понял, в каждом цикле ф-и Loop() опрашивается модуль и перезапысывается startTime, пока не переполнится ф-я millis(), ну и дальше то-же по-новой. А вот строка в setup()- _RTC1.startTime = millis() - 1000; мне вынесла последние остатки мозга.
В обозначенной выше библиотеке (и во многих других) модуль RTC (шина I2C) опрашивается раз в минуту, а секунды инкрементируются ардуинкой самостоятельно и синхронизуются после опроса.
У меня замечены проблемы с модулем DS1307, которые проявляются периодическим сбросом(обнулением) всех регистров модуля при одновременной работе с хардовой шиной SPI (дисплей MAX7219)
P.S Прошу Cи- говорящих/пишущих форумчан проверить эту информацию и извинить/поправить/растрелять меня, если я ошибаюсь. :smile37:
Вложения
RTC_test.flp
(30.59 КБ) 59 скачиваний

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

Arduino + DS 3231

#8

Сообщение Labu559 » 19.03.2020{, 14:33}

Labu559 писал(а):
18.03.2020{, 00:40}
P.S Прошу Cи- говорящих/пишущих форумчан проверить эту информацию
Так как из более 100 прочтений данной темы от последнего сообщения не "нашлось" ни одного "Си-говорящего/пишущего" посетителя или этот этот вопрос не интересует гуру, подключил на линию осциллограф, что конечно следовало сделать сразу. Опрос модуля действительно происходит с паузами в 250 мс, т.е. 4 раза в секунду, сесиями 1мс (10 байт + биты подтверждения). Пока не нашёл по документации рекоммендации производителя по частоте опроса, "копаю" дальше причины сбоев.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Arduino + DS 3231

#9

Сообщение rw6cm » 21.03.2020{, 06:55}

Labu559 писал(а):
19.03.2020{, 17:01}
Так как из более 100 прочтений данной темы от последнего сообщения не "нашлось" ни одного "Си-говорящего "копаю" дальше причины сбоев.
Эта цифра ровным счетом не о чем не говорит.
Может 100 чел посмотрело, может один сто раз зашел, может сто ботов по ссылке прошлись )))
Что касаемо по теме, то по ds3231 часам проблем с не точностью не было. Буквально по осени собирал 10 таймеров на панелях, для соревнований, где рассенхрон в сек. был уже критичен. Так вот за сутки даже на секунду между собой не разошлись. Грешным делом подумал что Автор в новой версии что то изменил, собрал на макетке проект ТС (2560+3231+2004), сутки работали по I2C, потом для чистоты эксперимента, подключил как у ТС в первом посту. В общем четвертые сутки - секунда в секунду. Для себя не вижу смысла рыться в коде и искать то, чего нет.
Win10-64, FLProg (portable)

KostiK2009IT
Рядовой
Сообщения: 24
Зарегистрирован: 22.09.2015{, 17:36}
Репутация: 1
Откуда: Рязань

Arduino + DS 3231

#10

Сообщение KostiK2009IT » 21.03.2020{, 13:49}

Может быть дело в самой Ардуино? Несколько часов пробовал подключать, проект один и тот же залит, все равно время убегает.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Arduino + DS 3231

#11

Сообщение rw6cm » 21.03.2020{, 18:46}

KostiK2009IT писал(а):
21.03.2020{, 13:49}
Может быть дело в самой Ардуино?
Из первого сообщения понятно что не часы...
KostiK2009IT писал(а):
14.03.2020{, 11:33}
взял ds3231 из другого проекта, в котором они точно работали нормально - время не убегало.
Не знаю что Вы на них зациклились Здесь 2560 поменять, и без дисплея проверить.
Ну и посмотреть может где то библиотеки подменялись. я проверял в флп 6.3.1 с евошными либами.
СпойлерПоказать
2020_03_21_18_56_18_pr1_Arduino_1.8.11.png
Win10-64, FLProg (portable)

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

Arduino + DS 3231

#12

Сообщение Labu559 » 22.03.2020{, 03:28}

rw6cm писал(а):
21.03.2020{, 06:55}
Эта цифра ровным счетом не о чем не говорит
СпойлерПоказать
Ув. Владимир, цитируемая Вами вступительная часть моего сообщения не является вопросом, а констатацией факта. Конечно же эта цифра ни о чём не говорит, кроме как вскрывает качественную оценку нашего форума как технического, т.е. для целевой аудитории и Ваш ответ подтверждает это, как и то, что из 228 страниц списков зарегистрированных пользователей форума (11364 человек) только 1993 что-то, когда-то сообщили/спросили и то не факт что по-делу. Несомненную пользу "мёртвых душ" описал ещё Н.В.Гоголь, но я ведь и не спорю, правда? Да, я понимаю, что нехорошо, провокативно-манипулятивной частью своей фразы привлекать внимание к проблемам компетентных специалистов, рискуя при этом похоронить чужую тему высказываниями многосамоуважающих себя и себе подобных плюсователей-хотюнов - стратегов развития, гуманитариев занимающихся лингвистическими, этическими, межнациональными аспектами общения и прочих поучателей жизни не свойственные технарям. Но мне повезло и я общаюсь с Вами- технарём и по аналогии с нашим предыдущим общением, есть большая вероятность извлечь практическую пользу не только мне и пользователям, но и надеюсь Ув. автору, который анонсировал предстоящую редакцию функциональных блоков программы и надеюсь Вам лично. Нет, я не пытаюсь навязать свою точку зрения, не собираюсь спорить,- я хочу разобраться со свой проблемой, которой раньше не существовало и которая возможно имеет общее с проблемой ув. ТС.
Извините за длинное вступление, разрешите обосновать свою точку зрения по данной теме и внести конкретное предложение.
СпойлерПоказать
RTC_I2C_structure.png
Итак, что происходит если два параллельно протекающих независимых процесса пытаються получить одновременно доступ к определённым регистрам данных в однопоточной системе. Предполагаю, что процесс с меньшим приоритетом будет проигнорирован или, при наличии механизма, поставлен в очередь. А если в процессе находящемся в очереди произойдут события в этот момент (изменятся данные, поступит отличная от предыдущей команда и т.п.)? В обоих случаях, опять же при отсутствии определённого механизма обработки, произойдёт потеря данных,- т.е. ошибка, которая к тому-же будет накапливаться. Теперь предположение на логику. Какому процессу из двух взаимозависимых периодических будет присвоен более высокий приоритет. Очевидно тому, который должен происходить реже. Но вот ожидаемо более редкий процесс начинает чаще слать запросы, чем было предусмотрено внутренней структурой устройства и назначенными приоритетами. Потому я озадачился вопросом: зачем забирать данные с регистров RTC 4 раза, которые меняются 1 раз в секунду, увеличивая этим вероятность пропуска при одновременном обращении к памяти (RAM) процессов считывания и инкремента\записи текущего времени из\в регистры хранения? Мы хотим облегчить код\освободить ресурсы МК, которые во проштудированных мной библиотеках занимаются самостоятельным расчётом секунд и только раз в минуту синхронизуются с RTC? Но ведь тогда нагружается шина данных I2C и связанные с ней процессы, а также нагрузка на RAM микросхемы RTC. По сравнению с упомянутой мной библиотекой iarduino.h нагрузка на шину возросла в 240 раз или 4 раза в секунду напротив 1 раза в минуту, но при синхронизация с ПК при установке времени заметно возросла точность установки! В некоторых других биб-ках опрос делают 1 раз/сек.
Теперь предложение: вместо определения сумы стартового времени + периода в каждом цикле и сравнения с текущим значением ф-и millis(), единожды при выполнении условия определять эту суму и сравнивать в каждом цикле с готовым результатом в базовой ф-и для таймеров, генераторов, блоков RTC … bool _isTimer(unsigned long startTime, unsigned long period )
Т.Е. вместо строк:
if (currentTime>= startTime) {
return (currentTime>=(startTime + period));
startTime = millis();}
записать
if (millis()>=startTime) {
*startTime = millis()+period;
return true;
}else return false;
Другими словами сохранять вместо прошедшей точки отсчета и суммирования в каждом цикле с потерей результата, единожды определённое значение ожидаемого времени.
Что касается ув. TS, приняв во внимание:
KostiK2009IT писал(а):
14.03.2020{, 11:33}
взял ds3231 из другого проекта, в котором они точно работали
KostiK2009IT писал(а):
17.03.2020{, 17:01}
убегание времени может случаться из-за частого опроса часов
rw6cm писал(а):
21.03.2020{, 06:55}
подумал что Автор в новой версии что то изменил
Да изменил!
Потому можно для эксперимента
1. Синхронизовать RTC c ПК, дать модулю передышку на несколько дней без внешнего питания (только батарейное) без подключения к Ардуино и спустя проверить разницу с ПК. В принципе это же предлагает ув.Владимир.
2. Вручную изменить в скомпилированном проекте строку кода if (!(_isTimer ((timeStruct ->startTime), 250))) на if (!(_isTimer ((timeStruct ->startTime), 24000))) например и не обращая на уплывшие на дисплее секунды вывести данные в монитор порта и сравнивать их с ПК при обновлении данных.
3. -Удалил- фигня всё это.
У меня всё, свою проблему решу сам, в помощи не нуждаюсь! Указываю ИСТОЧНИК моих разбушевавшихся фантазий. :smile114:
Последний раз редактировалось Labu559 22.03.2020{, 12:06}, всего редактировалось 2 раза.

Аватара пользователя
rw6cm
Полковник
Сообщения: 2284
Зарегистрирован: 06.09.2015{, 20:25}
Репутация: 335
Имя: Владимир

Arduino + DS 3231

#13

Сообщение rw6cm » 22.03.2020{, 10:40}

Labu559 писал(а):
22.03.2020{, 03:28}
Да изменил!
Потому можно для эксперимента
3. Установить FLProg версии 5.3 где присутствует предыдущая версия штатного блока RTC DS1302\1307\3231 c библиотекой iarduino.h
Возможно Вы и правы, но вникать в это сейчас нет времени.
Единственно сравнил скетчи 5.3 и 6.3.1 и разницы не увидел.
СпойлерПоказать
2020_03_22_09_27_42_FLProg_5.3.0.png
Возможно ошиблись с версией.
Win10-64, FLProg (portable)

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

Arduino + DS 3231

#14

Сообщение Labu559 » 22.03.2020{, 11:26}

rw6cm писал(а):
22.03.2020{, 10:40}
Возможно ошиблись с версией.
Спасибо Владимир, вероятно Ув.Автор
просто не убрал биб-ку из дистрибутива 5.3,Показать
RTC_I2C_Library.png
а я "купился", она также присутствует в версиях 6.3.1 и 4.2.4 хотя не декларируется в блоке и не упоминается в логах компиляции. Похоже я выбрал ложный путь. Для меня также полезна Ваша предыдущая информация
rw6cm писал(а):
21.03.2020{, 06:55}
... по осени собирал 10 таймеров ... за сутки даже на секунду между собой не разошлись
Я не исключаю ошибочности своей "теории всемирного заговора", просто нравиться копаться во внутренностях, узнавать как это работает, что действительно не всем нужно и отнимает много времени :) .
Информация для ув.ТС: Если Вам удастся вычислить погрешность Вашего RTC и она окажется стабильной и больше 2,5 сек/сутки (что противоречит Вашему сообщению о правильной работе DS3231 в другом проекте), я попробую написать Вам, скетч коррекции (периодической суточной поправки).

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Arduino + DS 3231

#15

Сообщение edyapd » 18.04.2020{, 17:40}

KostiK2009IT, маленько переделал ваш проект. Так как у меня Wemos то решил сразу в нём и сверяться.
Смысл такой: При запуске идёт синхронизация с NTP сервером. После этого через каждые десять минут делаем запрос на NTP сервер и сравниваем время с тем, что считываем с часов.
Тест_часов_1.flp
(947.33 КБ) 45 скачиваний
В первой строке выводится время с часов. Во второй время с NTP сервера. В третьей разница во времени. В четвёртой общее время работы.
На данный момент отработало 14 часов. Заметил, что буквально через час показало разницу в одну секунду. Через девять часов было две секунды. Через девять часов двадцать минут снова одна секунда. Через девять сорок - разница две секунды. Девять пятьдесят - одна секунда. Потом ещё сменило пару раз в течении двадцати минут. И после этого стабильно разница в одну секунду.
Так что думаю больше двух секунд разницу не покажет в течении суток.
А так же в момент запуска я синхронизировал время на моём компьютере. Проверял по ЭТОМУ сайту. На данный момент он мне показывает разницу в 1.5 секунды.
А отсюда вопрос. Вы когда через сутки проверяли рассинхронизацию ваших часов с компьютером, вы время на компьютере предварительно синхронизировали? А то может дело и не в часах вовсе было.

KostiK2009IT
Рядовой
Сообщения: 24
Зарегистрирован: 22.09.2015{, 17:36}
Репутация: 1
Откуда: Рязань

Arduino + DS 3231

#16

Сообщение KostiK2009IT » 19.04.2020{, 15:14}

Labu559, сделал рекомендации из 12 сообщения:
1. Провел синхронизацию с компом, отключил внешнее питание, оставил на 2 недели. Результат - время не убежало ни на секунду.
2. Менял время опроса модуля - чем больше период опроса - тем медленнее начинается рассинхрон, но все-таки хотелось бы выводить секунды на дисплей. Сейчас опрос модуля стоит раз в секунду - за 5 дней убежало примерно на 3 минуты вперед. Сейчас поставлю 24000, посмотрю, что будет.
Дополнительно ставлю такой же эксперимент на UNO c DS1307.
Отпишусь через какое-то время.

Labu559
Лейтенант
Сообщения: 359
Зарегистрирован: 25.01.2018{, 22:23}
Репутация: 95
Откуда: Bukovyna
Имя: Василий

Arduino + DS 3231

#17

Сообщение Labu559 » 19.04.2020{, 17:45}

Ув.KostiK2009IT!
Для локализации повторил полностью Ваш проект с разницей, вместо Меги- Уно, DS1307 и HD44780-LCDKeypadShield, ну здесь кто во что горазд :smile171: . За время от моего крайнего сообщения в этой теме 22 марта (синхронизация) мои RTC DS1307 до 17 апреля опаздывают на 29 сек без подключения и внешнего питания. За двое суток прогона в Вашем проекте (не уследил за разрядом аккумулятора внешнего питания) отставания вообще 0 (при опросе 4раза/сек. ) если "это" вообще нельзя назвать статистикой :). Но Ваша главная проблема, как мне кажется, иного характера и связана с Вашим экземпляром чипа DS3231. Мне попадалась такая информация, что чип отлично работает на софтовом I2C и сбоит на хардовом. Потому я и приплёл в Вашу тему библиотеку от iarduino, которая позволяет работать как по харду, так и по софту и раньше использовалась в штатном блоке. Не могу найти полную информацию по данной проблеме в своих закладках, вот здесь в обсуждении кое-что, хотя не совсем то. В принципе могу накатать блок из iarduino_RTC.срр или другой биб-ки, у Гайвера вроде простенькая есть для 3231, можно снять дамп регистров с Вашей Меги, как там таймеры настроены, отвечающие за скорость I2Cbus, обычно настройки в биб-ках указывают, посмотрю в Ware.cpp, если пойму чего там намутили.
Хорошо экспериментируйте, а там определимся.

KostiK2009IT
Рядовой
Сообщения: 24
Зарегистрирован: 22.09.2015{, 17:36}
Репутация: 1
Откуда: Рязань

Arduino + DS 3231

#18

Сообщение KostiK2009IT » 21.04.2020{, 13:57}

В продолжении темы, результаты эксперимента из сообщения 16
Mega+ds3231+экран на HD44780, период опроса модуля времени 24000 - за двое суток время убежало на 2 минуты вперед
Uno+1307, период опроса модуля 250 - за двое суток время убежало на 50 секунд вперед

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

edyapd
Капитан
Сообщения: 768
Зарегистрирован: 20.09.2019{, 11:38}
Репутация: 65
Имя: Эдуард

Arduino + DS 3231

#19

Сообщение edyapd » 21.04.2020{, 14:12}

KostiK2009IT, не мучайтесь, не зависит убегание от частоты опроса. Я специально для вас провёл эксперимент. Описал в #15. Там часы опрашиваются в каждом цикле. И разница во времени, за сутки, с эталонным сервером была всего лишь 1 секунда.
Что можно попробовать сделать с вашими часами. Это прогреть их паяльным феном, возможно где-то плохой контакт. После этого промыть их в спирте. Если и это не поможет, то значит вам такие попались.

KostiK2009IT
Рядовой
Сообщения: 24
Зарегистрирован: 22.09.2015{, 17:36}
Репутация: 1
Откуда: Рязань

Arduino + DS 3231

#20

Сообщение KostiK2009IT » 21.04.2020{, 15:02}

сутки потерплю, проверю рассинхрон, а далее залью скеч из версии 2.5.2 - там еще другая библиотека используется <iarduino_RTC.h>, а не <Wire.h>, как в текущей версии, потом отпишусь

Отправлено спустя 14 минут 19 секунд:
edyapd, у меня на компе win10 постоянно с интернетом, синхронизируется по умолчанию, разница во времени на указанном сайте 0,165 сек, так что с этим проблем нет

Отправлено спустя 4 минуты 53 секунды:
edyapd,
доказано эксперементально
KostiK2009IT писал(а):
19.04.2020{, 15:14}
1. Провел синхронизацию с компом, отключил внешнее питание, оставил на 2 недели. Результат - время не убежало ни на секунду.

Ответить

Вернуться в «Спросить у знатоков»