Visits: 454
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 1862 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. Трудно чёто добавить когда выпал с темы, задавайте вопросы, что знаю расскажу. У меня использование библиотеки от МСС не вызвало проблем, настройку точности хода не использовал, т.к. применяю в основном сейчас синхронизацию времени от серверов точного времени через инет.
Это может быть интересно
- Датчик контроля протечки воды ch-c0020Visits: 1936 Как здорово летом под теплым дождем с тобою вдвоем оказаться. Как классно по лужам бежать босиком, с тобою играть и смеяться! Но совсем грустно оказаться под таким дождем, который течет с …
- Проект с использованием MCC часть 15Visits: 1490 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
- ESP32-первое знакомствоVisits: 6336 Музыкальная тема к статье, слушаем: Настало время познакомиться c ESP32 и для меня, для этого я приобрел в ГАММЕ отладочную плату с модулем ESP-WROOM-32 (ESP32-DevKitC). Первая задача, как …
- Простой сенсорный регулятор светаVisits: 2301 Простой сенсорный регулятор. Проект – 2007 года. Регулятор выполнена на микроконтроллере PIC12F683 и имеет минимальное количество элементов. Выполняет стандартные функции, включение выключение света, изменение яркости, запоминание последнего установленного уровня …
- MCC – K42 – настройка модуля DMAVisits: 738 MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если …
- NS108-5050-16bit от NewstarVisits: 579 Кто уже использует в своих проектах адресуемые светодиоды хорошо знакомы с такими как WS2812 и им подобные. Эти светодиоды для управления используют однопроводную шину. Из-за этого пропускная способность …
- Емкостной сенсорVisits: 2965 Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит …
- Гаджеты для домашней автоматики – Датчик приближенияVisits: 1941 Управление светодиодным освещением – Датчик приближения. Данный гаджет предназначен для управления внутренним освещением мебели. Датчик позволяет определить закрытие или открытие дверцы или ящика и при этом включать или …
- VU Meter Tower ART – part 2Visits: 961 Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, …
- Мультизоновый индикатор-терморегулятор ch-c3010Visits: 1154 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре, температуру на улице, а в погребе (или на балконе) …
Комментарии