Я еще не использовал RTC, поэтому я не совсем уверен в «нормальном» способе чтения часов реального времени. Есть несколько разных подходов, о которых я думал, но надеялся на некоторые советы по этому поводу.
Вот способы, которыми я думал о чтении и использовании времени до сих пор:
- Получите дату и время при включении питания и сохраните его в ОЗУ, а затем с помощью прерывания по таймеру увеличивайте значения ОЗУ каждую секунду и т. Д. Код будет затем использовать значения в ОЗУ всякий раз, когда ему потребуется знать дату / время.
- Используя прерывание по таймеру, каждую секунду запрашивайте RTC и копируйте полученные дату и время в RAM. Опять же, код будет использовать значения в ОЗУ всякий раз, когда ему нужно знать дату / время.
- Каждый раз, когда мне нужно узнать время, запросить RTC и использовать его ответ напрямую.
Какой будет лучший подход?
microcontroller
rtc
user9993
источник
источник
Ответы:
Я бы использовал четвертый вариант.
У большинства микросхем RTC есть возможность вывести 1-секундный импульс. Вы должны подключить этот импульс к входу с поддержкой прерываний на MCU.
Эта схема дает вам точность второго RTC без лишних затрат на активное чтение RTC.
источник
3 и 2 более жизнеспособны.
Третий подход - это то, что я использую в большинстве случаев. Это преимущество в том, что мне не нужно беспокоиться о зеркалировании RTC в оперативной памяти. Потенциальным недостатком является то, что опрос RTC через последовательную шину вносит задержку. Если вы пишете данные раз в секунду, эта задержка, вероятно, не будет иметь значения.
Второй подход тоже хорошо. Обслуживание зеркальных часов может привести к ошибке хронометража, если устройство работает в течение длительного времени. Зеркальные часы могут отличаться от RTC. Если вы регулярно читаете RTC, то дрейф не будет накапливаться.
Однако я бы посоветовал не делать последовательную связь в самой программе обработки прерываний (ISR). Установите флаг в ISR и выполните последовательную связь в main ().
ps Во всех случаях я использовал DS1307.
источник
Некоторые RTC (например, MC68HC68T1 [который, по общему признанию, почти никто не должен больше использовать)) приостанавливают свой внутренний счет при чтении, чтобы дать последовательный ответ. Их следует читать как можно реже, чтобы минимизировать сбои. Прочитайте их один раз, а затем используйте прерывания таймера для обновления значения времени, хранящегося в ОЗУ MCU.
источник
Я предполагаю, что RTC - это либо отдельный чип с собственным кристаллом, либо модуль, интегрированный с вашим микроконтроллером, который снова имеет отдельный источник времени (например, кристалл 32 кГц), чем основные часы. И источник времени для RTC является более точным, чем источник для микроконтроллера.
Чтобы определить, как часто вам нужно читать RTC, вам нужно выяснить, какую максимальную ошибку могут иметь ваши основные часы. Например, если основной кристалл определен в концентрации 20 частей на миллион, это равно 0,002%. Таким образом, часы, основанные только на основном источнике часов, могут отклоняться от 0,00002 * 3600 * 24 = 1,728 секунды в день.
Таким образом, если вы читаете RTC только два раза в день, а между тем увеличиваете время раз в секунду, используя прерывание по таймеру, вы никогда не будете выключены более чем на секунду - никогда не будете выключены более чем на секунду по сравнению с RTC, которое есть.
Если, как я предполагал ранее, ваш RTC - это либо отдельный чип с собственным кристаллом, либо модуль, интегрированный с вашим микроконтроллером, это не значит, что он правильный. RTC тоже может иметь ошибку. Например, если он использует кристалл 32 кГц с допуском 5 промилле (который чуть дороже, чем 10 промилле), он может быть отключен на 0,43 секунды в день или 13 секунд в месяц.
Чтобы обойти это, вам нужно будет настроить RTC, где вы записываете поправочный коэффициент обратно в регистр. Это позволит вам свести ошибку практически к нулю. Но, конечно, вам понадобится третий внешний источник синхронизации, который будет использоваться в качестве эталона при настройке. Чрезвычайно точным эталоном в США является линия переменного тока с частотой 60 Гц, которая гарантированно будет составлять ровно 60 * 60 * 60 * 24 (5 184 000) циклов в течение 24 часов между последовательными ночами. Чтобы это было полезно, вы должны рассчитывать на все 24 часа, так как 60 Гц может дрейфовать между ночами.
Еще одна отличная временная привязка - использование GPS (с точностью до 10 нс), если в его проекте уже есть оборудование GPS.
Если вместо этого ваше время RTC поступает из внешнего источника, такого как время сотовой сети (вызов AT + CCLK?) Или сервер времени сети, использующий NTP, то вы можете использовать значение RTC как есть, поскольку «настраивать» будет нечего ,
источник