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

Views: 482


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 1879 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 драйвер – UC1601sLCD драйвер – UC1601s
    Views: 1599 http://svetomuzyka.narod.ru/project/UC1601s.html Читайте обновление на http://catcatcat.d-lan.dp.ua/?page_id=178 В данный момент можно приобрести в ООО “Гамма” несколько типов индикаторов на драйвере UC1601s. RDX0048-GC, RDX0077-GS, RDX0154-GC и RDX0120-GC выполнены по технологии COG.
  • Проект с использованием MCC часть 14Проект с использованием MCC часть 14
    Views: 834 С выводом данных на дисплей мы справились (но могу сразу сказать библиотеку графики к этой статьи пришлось доработать, поэтому в этом проекте она обновлена). У нас на текущем …
  • Униполярный шаговый двигательУниполярный шаговый двигатель
    Views: 2219     В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
  • TDA7294 part 1TDA7294 part 1
    Views: 271 TDA7294 має унікальні дані для створення підсилювачів звукової частоти HI-FI класу. Варіант застосування є конфігурація BRIDGE (мостова схема включення), де використовуються два TDA7294, як показано на схематичній діаграмі …
  • TDA7294 part 2TDA7294 part 2
    Views: 541 Це друга частина проекту TDA7294, початок дивись тут. Тут ви знайдете повністю проект високоякісного підсилювача на TDA7294, схема, 3D моделі, гербер файли для виготовлення друкованої плати. І звичайно …
  • Мультимедийная сеть – AVC-LAN TOYOTAМультимедийная сеть – AVC-LAN TOYOTA
    Views: 5747 AVC LAN – протокол обмена данными мультимедийных систем автомобиля. Кодирование данных. При кодировании различаться три типа данных : преамбула – её назначение, это сообщение устройствам на шине, что начинается передача данных. …
  • Проект с использованием MCC часть 15Проект с использованием MCC часть 15
    Views: 1545 EUSART – Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. … читать на вики. Внесем изменения в нашу схему, …
  • Цифровой спидометр для автомобиляЦифровой спидометр для автомобиля
    Views: 10161  Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например,  для …
  • JDY-62A Audio bluetooth moduleJDY-62A Audio bluetooth module
    Views: 1698 Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима …
  • Интерактивные LedИнтерактивные Led
    Views: 464 Тема проекта   продолжение следует…. Это может быть интересно



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

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

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