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

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 (&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 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 часть 11Проект с использованием MCC часть 11
    Views: 1008 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
  • I2C MODULE – PIC18F25K42 Device ID Revision = A001I2C MODULE – PIC18F25K42 Device ID Revision = A001
    Views: 1205 I2C MODULE Обход ошибок в версии I2C MODULE – PIC18F25K42 Device ID Revision = A001 В Серии K42 применен совершенно новый модуль шины I2C, который позволяет поддерживать все …
  • MPLAB® Harmony – или как это просто! Часть 4.MPLAB® Harmony – или как это просто! Часть 4.
    Views: 2392 Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от …
  • Инфракрасный датчик движения, PIR-sensorИнфракрасный датчик движения, PIR-sensor
    Views: 3311 Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все …
  • MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)
    Views: 1409 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на  Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.
  • Arduino LCD + STONE STVI056WT-01 + Strain gaugeArduino LCD + STONE STVI056WT-01 + Strain gauge
    Views: 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.Temperature measurement with NTC thermistor.
    Views: 675 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …
  • Регулятор влажностиРегулятор влажности
    Views: 1366 Регулятор ILLISSI-CH-1000 предназначен для контроля и регулировки относительной влажности в диапазоне от 0 до 100%. Регулятор позволяет работать как в режиме осушения, так и увлажнения. Для измерения возможно …
  • Development Boards PIC18F47Q84Development Boards PIC18F47Q84
    Views: 8399 Microchip тішить новими мікроконтролерами. Особливістю цього MCU – це багата інтелектуальна периферія, що дозволяє вирішувати такі завдання на 8 бітних MCU, які неможливо реалізувати на деяких навіть 32 …
  • Самый простой диммер для светодиодного освещенияСамый простой диммер для светодиодного освещения
    Views: 3201 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

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

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