Программный Reset в определенное время
- Войдите на сайт для отправки комментариев
Ср, 04/09/2019 - 09:44
Здравствуйте.
Подскажите как можно реализовать программный сброс в определенное время, не имея на борту точного времени в виде батарейки с кварцем.
К примеру, мне необходимо раз в сутки перезагрузить ардуинку в 00:00:00 часов. Но не через какое-то время после включения.
Здравствуйте.
Подскажите как можно реализовать программный сброс в определенное время, не имея на борту точного времени в виде батарейки с кварцем.
К примеру, мне необходимо раз в сутки перезагрузить ардуинку в 00:00:00 часов. Но не через какое-то время после включения.
Тогда надо нанять толкового маёра, обязательно с часами, чтоб он приходил в 00:00:00, смотрел, всё ли в порядке, ну и заадно, нажимал бы на большую красную кнопку "СБРОС"
Без источника точного времени определить что настало 00:00:00 невозможно. Кроме часов с батарейкой есть варианты: GSM, GPS, Internet и т.д.
Без источника точного времени определить что настало 00:00:00 невозможно. Кроме часов с батарейкой есть варианты: GSM, GPS, Internet и т.д.
Интнрнет есть и при включении получаем отметку времен. по принципу UNIX. Извините забыл это добавить.
Таймштамп получил, таймер завёл на тик раз в секунду и добавляй к таймштампу единицу да проверяй на 00:00:00. Совпало - ребуть.
Можно вот это поизучать заодно: http://arduino.ru/forum/programmirovanie/nedokumentirovannaya-i-nestandartnaya-sluzhba-vremeni-avr-libc
Darkherald - лучше расскажите, зачем это нужно. А то может задачу можно решить совсем по другому
Darkherald - лучше расскажите, зачем это нужно. А то может задачу можно решить совсем по другому
Есть задача, при которой необходимо каждую минуту собирать данные и записывать их в память.
При старте отталкиваемся от Millis и каждые 60000 секунд собираем данные. Но как оказалось Millis неточно считает время, а точнее из-за миллисекунд идет смещение. Через 5 минут время уже смещается на секунду и так далее. Millis срабатывает как надо каждые 60000 секунд, а на самом деле отстает от реального времени. Через сутки порядка 10 минут.
Поскольку нет внешнего кварца мы не можем решить сдвиг Millis относительно реального времени. Появилось решение сделать перезагрузку ардуины.
Какие то фальшивые миллис попались. 10 минут в сутки... Может поправка, вместо 60000- 59999 или 60001 поможет.
Поскольку нет внешнего кварца мы не можем решить сдвиг Millis относительно реального времени. Появилось решение сделать перезагрузку ардуины.
Допустим, у вас действительно миллис убегает на 10 минут в сутки (хотя это очень много и похоже на косяк в коде). Но главное - я что-то не пойму, чем тут поможет перезагрузка? Вам нужно корректировать время в ардуине - либо по внешним часам, либо по данным из инета - ну так корректируйте, перегружать-то зачем?
Я правильно понимаю, что через сутки после включения ардуино у Вас где-то в памяти имеются не ожидаемые 1440 измерений, а типа 1430? Если Вы их точно где-то по коду не теряете, то согласен с leks, подобрать правильный интервал - это всё, что Вам нужно.
Допустим, у вас действительно миллис убегает на 10 минут в сутки (хотя это очень много и похоже на косяк в коде).
Не, реально убегает. Мошт, конечно не на 10 минут в сутки, но убегает. Я, когда SoftClock себе делал, думал точности миллиса будет хватать, ан нет, в полночь всё-равно приходилось синхронизироваться. Это всё из-за прерываний и их запретов.
Какие то фальшивые миллис попались. 10 минут в сутки... Может поправка, вместо 60000- 59999 или 60001 поможет.
Смещение не поможет. Время нарастает
Какие то фальшивые миллис попались. 10 минут в сутки... Может поправка, вместо 60000- 59999 или 60001 поможет.
Смещение не поможет. Время нарастает
Растёт размер погрешности со временем? Поправка тоже может меняться с ним:)
Ну наверное рациональней модуль опрашивать на поправку реже чем каждую минуту, раз искать огрехи в программе или убирать прерывания не можется.
У меня часы с батарейкой за год больше чем на минуту ушли - видать батарейка бракованная:)
У меня часы с батарейкой за год больше чем на минуту ушли - видать батарейка бракованная:)
а часы какие? у мня DS3231 китайский за 1.5 года ни на минуту не ушли, время как в смартфоне, стоИт, как Х у пионэра. Причем, зимой на даче валялись, а там ночью до -52 было.
Да, такие же. Счас попробую ради интереса вновь глянуть, месяца полтора назад смотрел.
Смещение не поможет. Время нарастает
ну ведь бред же написан. неужели самому не очевидно??? :) какая разница - нарастает или отстает - поправка может быть как положительной, так и отрицательной.
Ну и главное вы так и не сказали - перезагрузка зачем?
Да, не зря я спросил :) типичная новичковая ситуация - сначала изобрести квадратные колеса. а потом спрашивать у форума, как на них ездить :)
Глянул, манипулятор-часы нарисовал время с разницей на компе в 1, потом 2 минуты:) (секунды не рисует). Может ещё момент загрузки пускового времени сыграл роль (на секунды тогда я тоже не смотрел, а было ли отставание уже тогда - не обратил внимания, редактировал скетч усердно).
В общем буду ждать пока батарейка кончится или 2-3 минуты в отставании появятся:)
Смещение не поможет. Время нарастает
ну ведь бред же написан. неужели самому не очевидно??? :) какая разница - нарастает или отстает - поправка может быть как положительной, так и отрицательной.
Ну и главное вы так и не сказали - перезагрузка зачем?
Да, не зря я спросил :) типичная новичковая ситуация - сначала изобрести квадратные колеса. а потом спрашивать у форума, как на них ездить :)
Если точно, то относительно реального времени скачет, а потом отстает.
Перезагрузка сбрасывает Millis.
15:05:57.853 -> 1566302754 (15:05:54)
15:05:59.792 -> Последняя операция в минуте
15:06:57.620 -> 1566302814 (15:06:54)
15:06:59.560 ->Последняя операция в минуте
15:07:57.369 -> 1566302874 (15:07:54)
15:07:59.307 -> Последняя операция в минуте
15:08:57.093 -> 1566302934 (15:08:54)
15:09:58.765 -> Последняя операция в минуте
С лева время порта с права время полученное каждую минуту. Обратите внимания на миллисекунды, 15:05:57.853 последующая должна быть 15:06:57. 620, а должна быть 853, далее 15:07:57.369, а должна быть 853.
Это невозможно поправить смещение запроса, потому как смещение всегда разное, а в итоге отстаёт от реального времени.
Это невозможно поправить смещение запроса, потому как смещение всегда разное, а в итоге отстаёт от реального времени.
похоже на неправильную работу с прерываниями или с миллис. Может выложите полный код?
Ну и ещ ераз - перезагрузка вам не нужна, поймите это. Вам в любом случае понадобится источник точного времени - либо RTC, либо запрос из инета - и по сигналу этого источника вы просто подводите свой программный счетчик. ничего не перегружая. Если что непонятно - спрашивайте.
Это невозможно поправить смещение запроса, потому как смещение всегда разное, а в итоге отстаёт от реального времени.
похоже на неправильную работу с прерываниями или с миллис. Может выложите полный код?
Ну и ещ ераз - перезагрузка вам не нужна, поймите это. Вам в любом случае понадобится источник точного времени - либо RTC, либо запрос из инета - и по сигналу этого источника вы просто подводите свой программный счетчик. ничего не перегружая. Если что непонятно - спрашивайте.
Согласен, перезагрузка не нужна, нужна синхронизация времени перед записью данных.
Если синхронизировать не с чем то ставьте часы, цена вопроса 100-150р DS3231SN с батарейкой
Но не берите DS3231M (MZ) они не совсем стабильно идут, убегают/отстают сильно.
перезагрузка даже вредна, бог весть за скока бутлодер разкумарится.
похоже на неправильную работу с прерываниями или с миллис. Может выложите полный код?
Вот пример кода
Если а вас есть интернет, то просто корректируйте внутреннее текущее время периодически. Скажем раз в пару часов.
Попробуйте так:
Вот как раз так и будет ошибка накапливаться, нужно вот так
Вы сейчас соревнуетесь в способе обмана зрения - чтобы в Serial Monitor красивые цифири лезли. Но при сравнении с внешним контрольным измерителем хода времени - миллис всё равно продолжит отставать ))
Вот как раз так и будет ошибка накапливаться, нужно вот так
Ругается на timing+ = 60000;
Вот пример кода
я просил выложить ПОЛНЫЙ КОД, чтобы посмотреть, не влияет ли что-нибудь на счетчик в других кусках программы. А этот обрывок мне ни к чему.
Вот как раз так и будет ошибка накапливаться, нужно вот так
Брукля. ты что советуешь-то? переполнение миллис? :))
Да тут и хрустального шара не надо, чтобы указать на причину. Цикл ЛУП исполняется неравномерно - иногда 1мс, иногда все 30. То есть программа криво написана.
А чтобы понять где именно она тормозит и как исправить - я и просил полный код.
А у нас что, операционная система реального времени какая-то используется, чтобы в мониторе порта время события идеально точно отображалось?
Какое переполнение ? О чем это ? :)
ТС по моему варианту делай. Только размерность переменной правильно определи.
чуть поправленный вариант Брукли
чуть поправленный вариант Брукли
Зачем это ? Чем плохо то что показал я. В твоём примере будет копиться ошибка.
да. точно, не будет переполнения. Timing всегда меньше миллис
не будет тут копится никакой ошибки - мой пример просто неверный :)
А насчет переполнения я притормозил. да. извиняюсь
Короче, вконец замордовали ТС :)
Darkherald - делайте по варианту Брукли из #25
Специально поправил для ТС, раз уж он с пробелом справиться не может...
Да и, ТС, подумайте, что будет, если вместо 6000 вписать например 5900, или 6100 ;)
Спасибо что поправили.
А насчет переполнения я притормозил. да. извиняюсь
Было бы из-за чего... Отпуск раcслабляет :)
Спасибо что поправили.
Обратите внимание, я заменил if на while, правда мне сильно не понятно как основной цикл может длиться больше минуты, но хуже этот while точно не сделает.
brokly верно в #25 написал.
Но беда у Darkherald в 6мсек за минуту. А это больше чем из за счет такой ошибки. Такая ошибка даст в минуту погрешность порядка времени прокрутки loop-а. А пустой крутится намного быстрей. Очевидно неточность кварца, точней его подобия от китайцев. Это не отменяет, разумеется #25.
Пробуйте timing += 60000-6;
Для часовых интервалов аналогично поправочку. Так можно вогнать в точность, но термостабильность не гарантируется.
Такая ошибка даст в минуту погрешность порядка времени прокрутки loop-а. А пустой крутится намного быстрей. Очевидно неточность кварца,
Посмотрите на тайминги - их "мотает" то в плюс то в минус на 30 мс в минуту. Совершенно очевидно, что это не "неточность кварца".
С чего вы взяли, что у ТС пустой Луп? Я вот абсолютно уверен, что это тайминги на рабочем скетче, из которого ТС показывает только этот кусок. Я ему предлагал запостить сюда весь код, чтобы можно было посмотреть, что именно у него тормозит - но код, как всегда у новичков - "секретный"
//С чего вы взяли, что у ТС пустой Луп?
в #22 код и его вывод. Несколько неожидано было бы если бы вывод не от того кода.
"мотает" - это особенность ОС, дискретность таймингов процессов в ОС, особенности работы ПО на ПК - пока драйвер выпихнет в буфер, пока ИДЕ получит сообщения. Важна систематическая составляющая.
Тут еще вопрос в пригодности часов ПК как эталона.