Views: 653
RTCC предоставляет пользователю часы реального времени и функция календаря (RTCC), точность “хода” может быть откалибрована.
Основные особенности модуля RTCC:
• Работает в режиме глубокого сна.
• Возможность выбора источника синхронизации.
• Обеспечивает часы, минуты и секунды, используя 24-часовой формат.
• Видимость полусекундного периода.
• Предоставляет календарь – день недели, дату, месяц и год.
• Конфигурация сигнала тревоги на полсекунды, одна секунда, 10 секунд, одна минута, 10 минут, один час, один день, одна неделя, один месяц или один год.
• Повтор будильника с декрементным счетчиком.
• Тревога с бессрочным повторным звонком.
• Коррекция года с 2000 по 2099 год.
• Формат BCD для небольших программных накладных расходов.
• Оптимизирован для работы в течение длительного времени.
• Пользовательская калибровка тактового генератора 32,768 кГц/32K Частота INTRC с периодической автоматической настройкой.
• Оптимизирован для работы в течение длительного времени.
• Дробная вторая синхронизация.
• Калибровка с точностью ± 2,64 секунды за месяц.
• Калибрует до 260 ppm ошибки кристалла.
• Возможность периодически запускать внешние устройства без вмешательства ЦП (внешнее управление мощностью).
• Выход управления мощностью для управления внешней цепью.
• Калибровка вступает в силу каждые 15 секунд.
• Выполняется с любого из следующих действий:
– Внешний источник тактовой частоты (RTC) 32,768 кГц.
– Внутренний генератор LPRC 31,25 кГц.
– Внешний вход 50 Гц или 60 Гц.
Блок схема модуля часов реального времени:
С чего я начинаю проектировать часы если необходимо их реализовать в самом микроконтроллере? Первое это что будет служить тактовым генератором и не долго думаю выбираем встроенный вторичный генератор, он позволяет работать с низкочастотными резонаторами, в нашем варианте интересует резонатор на 32,768 Гц.
Второй этап, это резервное питание. Ряд микроконтроллеров типа PIC24FJ128GA204 FAMILY имеют специальный вывод VBAT.
Этот вывод предназначен для подключения к источнику резервного питания и позволяет питать генератор часов при отключении основного питания. Я предпочитаю, для резервного питания использовать ионисторы. Использования ионисторов позволят забыть о проблеме замены батарейки и сделать работу устройства практически вечной. Если вы используете 3,3 вольтовое питание, то для зарядки и ионистора рекомендую использовать следующую схему:
Ионисторы имеют стандартное напряжение 2,7 вольта (естественно есть варианты и на 3,0 и на 5,0 вольт, но 2,7 самое распространённое), для ограничения тока зарядки (ток через диоды учитываем), устанавливает резистор R15, для понижения напряжения до 2,7 вольта и как вентиль, использует диодную сборку.
Схему подключения резонатора к выводам думаю все разберутся (в этом МК используются выводы RA4 and RB4), обычно резонатор и два запускающих конденсатора.
Теперь сама конфигурация в MCC. “Просто добавьте воды” – добавьте модуль RTCC в ресурсы проекта:
Если вам нужны только данные времени и даты, то ничего настраивать не нужно, ну можете установить значение часов и календаря при инициализации модуля:
Кликаем на значок часов:
и настраиваем как ваше сердцу будет угодно, тут надо подразумевать, что это выполняется начальная инициализация модуля в проекте.
******************** тут был большой перерыв в написании и я, если честно, забыл чем хотел поделиться, по этому далее что помню по использованию этого модуля *******
MCC предоставляет для пользователя минимум функции, опишу только то как я использовал их в проектах. Добавлю свои три функции для автоматического перехода на летнее время, хотя считаю что это безобразие, с летним временем, надо отменять.
Вся информация в библиотеке МСС передаётся через структуру tm
struct tm
{ /* date and time components */
int tm_sec; // секунды
int tm_min; // минуты
int tm_hour; // час
int tm_mday; // день
int tm_mon; // месяц
int tm_year; // год
int tm_wday; // день недели
int tm_yday; // номер дня в году
int tm_isdst; // флаг летнего времени
};
Функция void RTCC_Initialize(void); предназначена для инициализации модуля реального времени и должна быть запущене один раз перед использованием других функций. Но тут можно не беспокоиться МСС за вас это выполнит при конфигурации системы. Убедиться можно, что это выполнено просмотрев файл system.c в папке MCC Generatef Files функция
void SYSTEM_Initialize(void)
{
PIN_MANAGER_Initialize();
// OSCILLATOR_Initialize();
CLOCK_Initialize();
INTERRUPT_Initialize();
HLVD_Initialize();
OC4_Initialize();
OC1_Initialize();
OC3_Initialize();
ADC1_Initialize();
OC2_Initialize();
RTCC_Initialize();
SPI1_Initialize();
UART1_Initialize();
TMR2_Initialize();
UART2_Initialize();
TMR3_Initialize();
TMR5_Initialize();
}
Следующая функция получить время bool RTCC_TimeGet(struct tm *currentTime);
как я её пользовался для создаю структуру в которой будет храниться параметры время которую я буду использовать, например, для индикации
struct tm currentTime; // структура времени для индикации
Делаю свою функцию чтения времени которую буду вызывать при необходимости
void readtime (void) // обновить дату-времени
{
if (RTCC_TimeGet (¤tTime)) // Чтение времени и даты
{
SummertimeS (¤tTime); // функции обработки летнего времни
Status.tm_sec = RAM.tm_sec = currentTime.tm_sec; // Секунды - [0,59]
Status.tm_min = RAM.tm_min = currentTime.tm_min; // Минуты - [0,59]
Status.tm_hour = RAM.tm_hour = currentTime.tm_hour; // Час - [0,23]
Status.tm_wday = RAM.tm_wday = currentTime.tm_wday; // День недели - [0,6]
Status.tm_mday = RAM.tm_mday = currentTime.tm_mday; // День месяца - [1,31]
Status.tm_mon = RAM.tm_mon = currentTime.tm_mon; // месяц - [1,12]
Status.tm_year = RAM.tm_year = currentTime.tm_year; // год - [00,99]
}
}
Для чего так заумно? Время, которое “идёт” в часах оно настраивается как текущее часовое время и может синхронизироваться автоматически через инет с часовыми серверами, а для индикации у нас возникает показывать или “нормальное время” или 2летнее”. В переменная currentTime – применятся для получение текущего времени часов, потом я его обрабатываю функцией SummertimeS которая в зависимости от даты корректирует часы. И только после это загружаю его в разные области памяти в зависимости потребностей (Status и RAM это разные мои переменные в проекте, но вы должны, если пойдёте по этому принципу самостоятельно для себя определить, где вы будете и как хранить извлечённое время из модуля часов реального времени (RTCC)).
Следующая функция void RTCC_TimeSet(struct tm *initialTime); предназначена для записи параметров времени в модуль RTCC. Считаю с нет не возникнет проблем, например, нам необходимо синхронизировать время, с сервера точного времени, со временем в нашем модуле RTCC, мы обновляем данные в структуре currentTime и вызываем функцию RTCC_TimeSet.
Пример, как я использовал для корекции времени
realTime.tm_sec = combu.tm_sec; // секунды
realTime.tm_min = combu.tm_min; // минуты
realTime.tm_hour = combu.tm_hour; // час
realTime.tm_wday = combu.tm_wday; // день недели
realTime.tm_mday = combu.tm_mday; // число
realTime.tm_mon = combu.tm_mon; // месяц
realTime.tm_year = combu.tm_year; // год
if (SunTimeS (&realTime))
{
if (--realTime.tm_hour < 0)realTime.tm_hour = 0; // Определение летнего времени)
}
RTCC_TimeSet (&realTime); // загрузить новые параметры времени
Есть еще две функции чтении и записи времени которые использую двоично десятичный формат преобразования времени, которые применяться в основном в микросхемах часах реального времени bool RTCC_BCDTimeGet(bcdTime_t *currentTime); и void RTCC_BCDTimeSet(bcdTime_t *initialTime). Я их не использовал, но считаю проблем их использовании при необходимости не возникнет.
По библиотеке определения летнего времени. Суть её определить в каком периоде находиться устройство и при необходимости реальное время корректировать на час вперед когда период летнего времени или не корректировать когда нормальное время. Задача библиотеки вычислить последнее число последнего воскресенья месяца.
В ней есть три функции
void SummertimeS ( struct tm *initialTime ); // функции обработки летнего времени
uint8_t DayOfWeekS (uint8_t day, uint8_t month, uint16_t year); // определение последнего числа последнего воскресенья месяца
bool SunTimeS ( struct tm * dt ); // Определение летнего времени
Эта библиотека из проекта, я её как универсальную не делал, для её использования вам понадобиться изменить имя EE.SAr (глобальная переменная) переменной которой задается флаг использовать переход на летнее время или не использовать.
MCC PIC24 - модуль REAL-TIME CLOCK AND CALENDAR (RTCC) библиотека перевода часов на летнее время 0.00 KB 1880 downloads
Библиотека перевода часов на летнее время ...Вот еще одну функцию хочу показать, как я проверяю работоспособность модуля, типа тикает он или не тикает:
/* неисправность внутрених часов реального времени*/
void errorRealTime (void) // проверка на исправность внутрених часов реального времени
{
static uint16_t min = 77, hor = 77; // прошлое значение времени
// сравнить новое значение времени с прошлым
if (min == RAM.tm_min && hor == RAM.tm_hour) RAM.ERR.erRealTime = 1; // нет хода времени
else RAM.ERR.erRealTime = 0; // часы исправны
// запомнить текущее значение
min = RAM.tm_min; //
hor = RAM.tm_hour; //
}//-----------------------------------------------------------------------------
P.S. Трудно чёто добавить когда выпал с темы, задавайте вопросы, что знаю расскажу. У меня использование библиотеки от МСС не вызвало проблем, настройку точности хода не использовал, т.к. применяю в основном сейчас синхронизацию времени от серверов точного времени через инет.
Это может быть интересно
Проект с использованием MCC часть 11Views: 1008 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
I2C MODULE – PIC18F25K42 Device ID Revision = A001Views: 1205 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
MPLAB® Harmony – или как это просто! Часть 4.Views: 2392 Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от …
Инфракрасный датчик движения, PIR-sensorViews: 3311 Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все …
MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)Views: 1409 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.
Arduino LCD + STONE STVI056WT-01 + Strain gaugeViews: 646 Author li grey email: greyli1987@outlook.com The strain assessment instrument is used to assess the degree of corresponding muscle strain by obtaining the muscle surface action potential through silver …
Temperature measurement with NTC thermistor.Views: 675 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …
Регулятор влажностиViews: 1366 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
Development Boards PIC18F47Q84Views: 8399 Microchip тішить новими мікроконтролерами. Особливістю цього MCU – це багата інтелектуальна периферія, що дозволяє вирішувати такі завдання на 8 бітних MCU, які неможливо реалізувати на деяких навіть 32 …
Самый простой диммер для светодиодного освещенияViews: 3201 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …






Комментарии