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

Views: 461


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 1863 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. Трудно чёто добавить когда выпал с темы, задавайте вопросы, что знаю расскажу. У меня использование библиотеки от МСС не вызвало проблем, настройку точности хода не использовал, т.к. применяю в основном сейчас синхронизацию времени от серверов точного времени через инет.

 

 

 


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


  • LED драйвер TM1639LED драйвер TM1639
    Views: 2177 TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером …
  • Одноканальный емкостной сенсор – AT42QT1012Одноканальный емкостной сенсор – AT42QT1012
    Views: 2326 Описание сенсора [wpdm_file id=242] Незаконченный проект, так-как сенсор не оправдал своего назначения, не рекомендую, просто выброшенные деньги. Особенности. • Количество сенсоров – один, режим переключения ( touch-on/touch-off ), а также программируемая …
  • Проект с использованием MCC часть 12-1Проект с использованием MCC часть 12-1
    Views: 928 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …
  • CCP модуль для декодирования ИК-кодов пультов ДУCCP модуль для декодирования ИК-кодов пультов ДУ
    Views: 1043 Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности. …
  • Development board based on MCU PIC18F47Q84Development board based on MCU PIC18F47Q84
    Views: 858 PIC18F47Q84 Microcontroller Family with CAN Flexible Data Status: In Production.
  • MPLAB® Harmony – или как это просто! Часть 2.MPLAB® Harmony – или как это просто! Часть 2.
    Views: 2672 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …
  • HVLD модуль на примере PIC24FJ128GA204HVLD модуль на примере PIC24FJ128GA204
    Views: 627 HVLD модуль представляет собой простое устройство, для контроля напряжения питания микроконтроллера или внешнего напряжения (через делитель). Его задача при “выходе” напряжения за заданные пределы сформировать сообщение микроконтроллеру, что …
  • Проект с использованием MCC часть 05Проект с использованием MCC часть 05
    Views: 1893 Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое …
  • MCC – K42 – настройка модуля DMAMCC – K42 – настройка модуля DMA
    Views: 747 MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если …
  • Audio-bluetooth modules BK8000L (noname)Audio-bluetooth modules BK8000L (noname)
    Views: 654 Еще один вариант, так сказать недоразумения Audio-bluetooth modules BK8000L (noname). Его отличительной маркировкой служат два отверстия в плате и надпись R2. Отличают его от модулей на чипе BK8000L, …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

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

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