MCC PIC24 – модуль REAL-TIME CLOCK AND CALENDAR (RTCC)

Visits: 440


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 (&currentTime)) // Чтение времени и даты
    {
        SummertimeS (&currentTime); // функции обработки летнего времни
        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 1857 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. Трудно чёто добавить когда выпал с темы, задавайте вопросы, что знаю расскажу. У меня использование библиотеки от МСС не вызвало проблем, настройку точности хода не использовал, т.к. применяю в основном сейчас синхронизацию времени от серверов точного времени через инет.

 

 

 


Это может быть интересно


  • LCD индикаторы на драйвере ML1001LCD индикаторы на драйвере ML1001
    Visits: 1839  ML1001 – статический LCD GOG (чип в стекле) драйвер для 40-сегментного LCD в позолоченном противоударном исполнении. На них можно каскадно строить цельные из 80 или 120 сегментов LCD индикаторы. …
  • УКВ – радиоприем, часть 2УКВ – радиоприем, часть 2
    Visits: 6170 Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального …
  • УКВ – радиоприем, часть 1УКВ – радиоприем, часть 1
    Visits: 9513 Музыкальная тема к статье, слушаем: Первый мой радиоприемник, выглядел так. Использовал исключительно в школе на уроках, держась за одно ухо и преданно смотря на училку и сладко улыбаясь. …
  • Ссылки на интересные источникиСсылки на интересные источники
    Visits: 806 Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe …
  • Проект с использованием MCC часть 03Проект с использованием MCC часть 03
    Visits: 1535 Первым делом перенастроим регистры конфигурации, следующим образом: Отключим выход генератора (CLKOUT function is disabled. I/O function on the CLKOUT pin) Включим сторожевой таймер (WDT enabled) После этой настройки …
  • Проект с использованием MCC часть 10Проект с использованием MCC часть 10
    Visits: 783 Алгоритм управления освещением от нажатия кнопки. Обработка удержания кнопки: Мы должны проверить кнопка в настоящий момент нажата и флаг удержания установлен, если да Проверить таймер удержания “отработал” – …
  • VU Meter Tower ART – part 2VU Meter Tower ART – part 2
    Visits: 948 Проект – VU Meter Tower ART получил продолжение в своем развитии. Теперь можно заказать набор деталей из акрила для самостоятельной сборки. В проект корпуса внесено целый ряд доработок, …
  • MPLAB® Code ConfiguratorMPLAB® Code Configurator
    Visits: 1768 MPLAB ® Code конфигуратор (MCC) является свободно распространяемым плагином, это графическая среда программирования, которая генерирует бесшовный, легкий для понимания кода на Cи, чтобы вставить его в свой проект. …
  • Дифференциальный терморегуляторДифференциальный терморегулятор
    Visits: 3970 Дифференциальный терморегулятор ch-3020 Назначение. Ch-c3020 представляет собой дифференциальный терморегулятор. Основное назначение солнечные системы горячего водоснабжения, а также вентиляционные системы управление притоком свежего воздуха. Контроллер позволяет работать пяти режимах. …
  • CLUBBEST-50-LightCLUBBEST-50-Light
    Visits: 217 CLUBBEST-50-LIGHT   Зміст Короткий опис проекту. 1 Опис схемотехніки візуалізатора музики. 2 Аудіо вхід. 3 MCU. 4 Цифровий вихід. 5 Схема живлення MCU. 6 Складання пристрою. 7 Список …



Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее

Комментарии

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.