Я видел на рынке десятки различных чипов часов реального времени, а также несколько процессоров со встроенным модулем часов реального времени с отдельным питанием.
Почти все они не только хранят время как год-месяц-день-часы-минуты-секунды, но даже отдельные поля хранятся в BCD, а не в двоичном формате.
Есть ли какая-то основная причина для этого?
Существуют ли какие-либо микропроцессорные приложения, которые делают что-то более сложное, чем просто отображение часов, где формат BCD более полезен, чем двоичный, или где формат год-месяц-день-часы-минуты-секунды был бы более полезен, чем прямой 47-разрядный счет изменения состояния генератора?
Из того, что я могу сказать, кажется, что производители RTCC добавляют много дополнительных схем, чтобы сделать их чипы менее полезными; единственная причина, по которой я могу предположить, что модули RTCC в процессорах ведут себя таким образом, заключается в том, что поставщики процессоров используют некоторые уже существующие реализации BCD, а не производят свои собственные.
Ответы:
Все RTC используют кодировку BCD?
RTC от Philips / NXP (как автономные, так и встроенные в чипы ARM7 или Cortex-M3) не используют кодирование BCD.
Что не так с BCD RTC?
По сравнению с плоским счетчиком единственными операциями, которые являются более сложными с разделенными часами BCD, являются вычисления разницы во времени (добавление секунд или вычисление прошедшего времени). Сравнение времени, например: «текущее время больше, чем время, установленное пользователем», также просто.
Что хорошего в RTC BCD (и вообще с разделенным полем)?
Разделение полей действительно хорошо, когда вы заботитесь о календарной дате. У человеческих календарей есть забавные вещи, такие как месяцы различной продолжительности и сверх того високосного года. Попробуйте сделать это в одиночном счетчике (вы можете получить бонусное очко за использование практически без энергии). Ох, и попробуйте поддерживать дни недели (весьма полезные для всех видов устройств, предназначенных для людей: от будильников до контроллеров обогревателей) с этим.
Подход BCD имеет одну дополнительную особенность: вы получаете прерывания «каждую секунду» или «каждые десять секунд» бесплатно, без необходимости выполнять какие-либо вычисления по времени или датам.
Для рекордного високосного года вычисление немного меньше в RTC NXP, так как он заботится только о делимом на 4 правило и не проверяет деление на 100 и 400. Если бы он сохранял счетчик года в BCD, это было бы тривиально и, скорее всего, сделано правильно.
Резюме
Если вы хотите монотонные часы, используйте их. Вы можете купить PIC или AVR с «счетчиком RTC» (это просто асинхронный счетчик с автономным генератором 32 кГц). Просто помните, что просто отобразить дату будет сложно. :)
Когда вам нужно отобразить время и дату и установить будильник на основе введенного пользователем времени и даты, используйте RTC. И помните, что когда пользователь изменяет текущее время и дату, ваши прерывания на основе RTC могут быть неточными.
источник
Когда вы используете часы в конце, вам, скорее всего, будут интересны минуты и десятки секунд (для их отображения), а не просто общее количество секунд, минут и так далее. В случае, если вас не интересуют отдельные цифры, есть вероятность, что вам не нужны отдельные значения минут или секунд и что вы также можете использовать длинный двоичный счетчик, как вы предлагали.
Проще конвертировать из двоичного кода в двоичный в программном обеспечении, чем наоборот. А поскольку счетчики BCD не требуют так много дополнительного пространства по сравнению с двоичными счетчиками, имеет смысл выбрать BCD.
источник
Я подозреваю несколько причин:
Исторический - они делают это таким образом в течение некоторого времени. Если вы хотите, чтобы ваша новая деталь заменила какую-то другую, то она должна работать более или менее одинаково. Таким образом, вы держите с BCD.
Применение - если кто-то использует RTC от небольшого микро (что-то в 8-битном диапазоне, например, PIC низкого уровня), то работа с большим числом (например, с вашим 47-битным счетчиком) - большая боль в шее. Гораздо проще иметь дело с цифрами BCD, так как вам не нужно разбирать вещи.
Не так сложно - работать со счетчиками BCD не так сложно, и на самом деле я думаю, что это не намного больше, чем делать их двоичными.
Можно представить себе систему, в которой вы получаете отдельные счетчики часов, минут и т. Д. В двоичном формате вместо BCD (что позволяет избежать проблемы «разбивки 47-битного числа»), но это не намного проще, и вы собираетесь сделать некоторые конверсии при отображении вещи в любом случае.
источник
Я согласен с Майклом Коном, что есть много исторического импульса.
В ранних MCU также было гораздо меньше места для кода и данных (например, 128 байт оперативной памяти). Поскольку информация о времени часто используется в целях взаимодействия с человеком, имело больше смысла сохранять данные ближе к формату, используемому для отображения / ввода от людей.
Некоторые более новые микроконтроллеры с большим количеством кода и пространства данных иногда используют аппаратные счетчики реального времени - эти устройства часто сохраняют двоичные числа тиков 32 кГц.
источник
В случае, если кому-то интересно, я просто смотрю на серию ST 32F, и кажется, что, хотя новая серия 32L использует BCD RTC, 32F использует прямой 32-битный счетчик с настраиваемым прескалярным и предоставляет отдельный вход для батареи (ура! ). Я бы предпочел иметь более длинный прямой счетчик без настраиваемого предскалярного (так что я мог бы получить точность 1 / 256сек, но не тратить время на годы, не беспокоясь об обтекании), но если бы я установил прескейл на 1 / 64сек, таймер мог бы работать два года без переполнения. Не идеально, но не так уж плохо. Немного неэстетично, что если кто-то включит машину после того, как она слишком долго выключится (2,1 года), время / дата неоправданно уменьшатся на 2,1 года, но вряд ли это серьезная проблема (счетчик имеет флаг переполнения, но в во многих случаях это было бы ужасно полезно. Если машина была включена в течение двух лет до выключения и была включена три месяца спустя, ожидалось, что таймер переполнится; вопрос будет в том, переполнился ли он дважды, и я не знаю ни одного флага для этого.
источник
Максим, кажется, делает то, что вы хотите с DS1372U . Требуется менее 1 мкА, стоит 1,7 доллара США и доступно (!) На DigiKey и Mouser. Единственная проблема заключается в том, что он не предлагает сигналы тревоги с точностью более 1 секунды, а самая низкая тактовая частота на выходе составляет $ \ приблизительно $ 4 кГц.
источник