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

Visits: 439


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

 

 

 


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


  • CLUBBEST-50-LightCLUBBEST-50-Light
    Visits: 217 CLUBBEST-50-LIGHT   Зміст Короткий опис проекту. 1 Опис схемотехніки візуалізатора музики. 2 Аудіо вхід. 3 MCU. 4 Цифровий вихід. 5 Схема живлення MCU. 6 Складання пристрою. 7 Список …
  • Проект с использованием MCC часть 09Проект с использованием MCC часть 09
    Visits: 859   Эта часть будет посвящена созданию практического проекта управления освещение. Тех задание: Два выхода управления ШИМ – светодиодным освещением. Две кнопки управления, каждая кнопка управляет, своим каналом, логика самая …
  • Ultrasonic Level Meters – ULM –53LUltrasonic Level Meters – ULM –53L
    Visits: 698 Измерение расстояния при помощи ультра звукового датчика ULM–53L–10. Диапазон измерения от 0,5 м до 10 м, полностью пластмассовый излучатель PVDF, механическое соединение фланцем из полиэтилена HDPE (исполнение “N”) Характеристики …
  • Контроллер управления светодиодным освещением с дистанционным управлениемКонтроллер управления светодиодным освещением с дистанционным управлением
    Visits: 1980 Все активнее светодиоды входят в нашу жизнь. Всё эффективнее становится светодиодное освещение. Всё ниже опускаются цены. Всё больше появляется возможностей получения сочных цветов, простоты в управлении. Всё чаще …
  • 12-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA20412-BIT A/D CONVERTER WITH THRESHOLD DETECT на примере PIC24FJ128GA204
    Visits: 795 Введение. 12-битный модуль A/D Converter является усовершенствованной версией 10-битного модуля, предлагаемого на некоторых устройствах PIC24. Оба модуля являются преобразователями, в своих ядрах, с последовательным приближением (SAR), в окружении …
  • Проект с использованием MCC часть 14Проект с использованием MCC часть 14
    Visits: 786 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
  • Moving average – скользящее среднееMoving average – скользящее среднее
    Visits: 2186 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
  • ESP8266  процедура получение данных даты и времени от серверов точного времени.ESP8266 процедура получение данных даты и времени от серверов точного времени.
    Visits: 5782 Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени,  если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. …
  • MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)
    Visits: 1140 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на  Cи для емкостной сенсорной кнопки, датчика приближения и слайдера. В …
  • Проект с использованием MCC часть 15Проект с использованием MCC часть 15
    Visits: 1477 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

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

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