2016-03-31 1 views
0

Я работаю над MCU, и моя цель - реализовать время/дату на MCU.Реализация времени/даты на MCU

Я использую таймер, который тикает в секундах и сохраняет его на uint32_t count, который имеет достаточный размер для хранения 136 лет. Я хочу иметь 2000 в качестве эталона и не более должно быть 2099.

вот мои данные структура:

typedef struct 
{ 
uint8_t sec;  // Seconds. [0-60] (1 leap second) 
uint8_t min;  // Minutes. [0-59] 
uint8_t hour;  // Hours. [0-23] 
uint8_t day;  // Day.  [1-31] 
uint8_t month;  // Month. [0-11] 
uint8_t year;  // Year - from 2000. [00-99] 
} osal_time_t; 

Что такое лучший способ преобразовать секунды (uint32_t count) в мин/час/день/месяц/год правильно и используя самые низкие ресурсы?

Время, час и год кажутся простыми, но день становится сложным с 28-29-30-31 днями, а 29 лет каждые 4 года.

Я вижу реализацию исходного кода linux, но я думаю, что он разработан для ОС, а не из скромного MCU.

Может кто-нибудь намекнуть, какой алгоритм следует использовать в MCU, чтобы он требовал мин. Ресурсы?

В качестве примера, какой алгоритм используется для вычисления этого http://www.mathcats.com/explore/elapsedtime.html

Если у вас есть какие-либо фрагмент кода, я был бы признателен, если вы могли бы поделиться.

+2

Я хотел бы указать, что вы можете получать модули RTC (часы реального времени) за гроши на ebay, которые реализуют очень простые коммуникационные интерфейсы и обычно имеют слот для батареи, который будет держать их в течение многих лет, даже если MCU выключен. –

+0

Можете ли вы не просто использовать библиотеку времени C? http://www.tutorialspoint.com/c_standard_library/time_h.htm – DiBosco

+1

Пахнет проблемой X-Y. Зачем вам нужно конвертировать секунды во времени + дата + год и кому это нужно? – user3528438

ответ

1

Вы должны просто выполнить математику, нет другого пути. Вы переходите от основания 2 к основанию 10 (база 60 представлена ​​в базе 10).

Точно так же, как и в случае с месячными, вам нужно также продумать это с таблицей какого-то типа в течение нескольких дней в месяц и заниматься високосным годом.

Альтернатива выполнению математики меняется, как вы рассчитываете, используя больше памяти, но меньше вычислений. В основном подход BCD. Когда секундные секунды переместится с 9 на 10, увеличьте десятки секунд и установите секунды в 0. Повторите все до даты. Или встретите половину пути и секунды на 59 рулонах до нуля и увеличивайте минуты ... затем делайте базу 10, чтобы отделить десятки от секунд в секундах. вы можете использовать таблицу для этого, если у вас нет разрыва.

1

Это не проблема программирования, потому что вы не можете сделать это надежно только с помощью микроконтроллера. Внутренний RC-генератор будет слишком неточным, и даже если вы используете высокоточный внешний кварцевый генератор, он со временем будет дрейфовать и может меняться в зависимости от температуры.

Единственное правильное решение состоит в том, чтобы добавить схему часов реального времени к оборудованию, желательно вместе с резервной батареей. Связь с схемой часов реального времени зависит от оборудования.

Лучше задавать такие вопросы, которые находятся на границе с оборудованием на https://electronics.stackexchange.com/.

+0

Я согласен, что он будет дрейфовать с течением времени, поэтому я каждый раз обновляю его с пограничного маршрутизатора, но я написал в комментариях, что не знаю, t писать данные системы и предпочтения, потому что вопрос - это вопрос C, а не системный дизайн. У меня есть 24 МГц 10ppm кристалл, таймер OSAL используется во встроенных системах, таких как многие устройства ZigBee. Это не самое лучшее, но это все еще достаточно хорошо для моего приложения. Я счел его опубликовать на электронике.stackexchange, но это не вопрос дизайна электроники, я прошу наилучшего метода C для преобразования даты. Я думаю, что dwelch имеет самый точный ответ – sven

+1

просто коррекцию в ответе, что можно реализовать точный тактовый сигнал на MCU, используя кристалл с температурной компенсацией (со ссылкой на временный дрейф). – sven

+0

Я полностью согласен с этим, но RTC дрейфует, а не так много, но может и будет дрейфовать тоже. Все зависит от качества (чтение: расход) схемы синхронизации и того, как вы ее поддерживаете (мощность, температура и т. Д.). –