Использование счетчика реального времени (RTC) в XMega

    В данной статье речь пойдет об особенностях использования счетчика реального времени (RTC) в микропроцессорах XMega А.
    RTC обычно применяют для слежения за временем. Это могут быть прикладные функции, например, циклы стирки стиральной машины, или использоваться для пробуждения микропроцессора из спящих режимов с низким энергопотреблением через определенные интервалы времени. Использование продолжительных периодов сна позволяет значительно уменьшает потребление энергии.
    Счетчик реального времени в XMega А является 16-битным счетчиком с одним каналом сравнения, ведущим счет циклов опорного таймера и формирующего событие и(или) прерывание при достижение заданного или максимально значения. В качестве опорного таймера обычно используют высокоточный кварцевый генератор на 32.768 кГц, который также имеет низкое энергопотребление.
    Регистры
    Значения счетчика, периода и сравнения RTC являются 16-битынми. Так как шина данных 8-битная, используются 2 регистра для организации 16-битных значений. Большинство C-компиляторов обращаются к 16-битным значениям автоматически при использовании символьных имен. Также есть возможность доступа к старшему или младшему слову значения индивидуально. 16-битные регистры для RTC - CNT [H:L], PER [H:L], и COMP [H:L], где H – старший байт, а L – младший байт.
    Прерывания
    RTC может генерировать два прерывания: по переполнению и по сравнению. Прерывание по переполнению имеют постоянную частоту при постоянном значении периода (PER). Регистр сравнения (COMP) позволяет изменять частоту прерываний без изменения периода или перезапуска регистра счетчика (CNT).
    Источники тактирования
    В качестве опорного источника тактирования RTC может быть выбран:
1) Внутренний RC-генератор ультранизкой мощности на 32 кГц
2) Внутренний подстраиваемый RC-генератор на 32 кГц (более точный чем RC-генератор ультранизкой мощности, но с большим потреблением).
3) Внешний кварцевый генератор на 32.768 кГц (очень точный).
    Для сокращения потребления энергии, делителем системы часов можно уменьшить частоту источника тактирования RTC с 32кГц до 1кГц до подключения к модулю RTC. Необходимо разрешить использование RTC в системе часов до непосредственного использования RTC.
Модуль RTC имеет внутренние предмасштабирование, с максимальным коэффициентом 1024. Коэффициент предмасштабирования задается в регистре CTRL.
    Максимальный период ожидания (переполнение счетчика и начало нового цикла отсчета) и временное разрешение (частота счета) RTC определяется частотой часов RTC. Использование быстрых часов позволяет получить хорошее временное разрешение, но сокращает интервалы ожидания, в то время как использование медленных часов дает обратный эффект. Несколько примеров приведены в следующей таблице:

    Это означает, что возможно применение очень длинных периодов сна для устройств с крайне слабыми аккумуляторными батареями. Такие режимы работы позволяют уменьшить расход энергии, т.к. не требуется частые пробуждения для поддержании в устройстве реального времени. Микропроцессор просыпается лишь для осуществления требуемых устройству процессов.
    Область часов – синхронизированные и несинхронизированные регистры RTC
    Поскольку RTC и центральный процессор работают от разных часов, то можно сказать, что у RTC своя «область часов». При обмене информацией между RTC и центральным процессором требуется синхронизация между двумя областями часов. Синхронизация – аппаратное управление. При передаче данных из центрального процессора в RTC, синхронизация занимает 3 цикла области часов RTC. Заметим, что циклы в области часов RTC формируются из не масштабируемого опорного источника часов RTC. Это - или 32 кГц или 1 кГц.
    Синхронизация от RTC до области центрального процессора - 3 цикла центрального процессора. Так как часы центрального процессора быстрые, то продолжительность синхронизации в этом направлении незначительна.
    Синхронизация идет в четырех регистрах - CTRL, CNT, PER и COMP. Причем регистр PER не имеет отдельной синхронизации и вызывается синхронизацией регистров CNT, CTRL или COMP.
    Синхронизация из центрального процессора в область RTC вызывается при записи старшего байта в регистры CNT, CTRL или COMP. При записи новых значений и получении доступа к регистрам, корректным будет следующий алгоритм – сначала записывается младший байт, а затем старший. Если обновлен регистр PER, то один из других регистров должен быть также обновлен для вызова синхронизации в область RTC. Разработанный механизм позволяет гарантировать, что при запущенных часах RTC соответствующие значения PER и COMP будут загружены в том же цикле RTC.
    Для контроля об окончании синхронизации используется флаг SYNCBUSY в регистре STATUS, который может быть прочитан. Флаг установлен – пока идет синхронизация. Отметим, что как только один из четырех регистров вызвал синхронизацию, данный регистр не может быть перезаписан до окончания синхронизации. Запись в один из регистров не блокирует запись в другие регистры.
    Проблемы со спящими режимами
    Из-за синхронизации невозможно выходить из спящего режима по прерыванию RTC чаще, чем каждые 4 цикла часов RTC (часы без масштабирования). Например, если период сравнения будет установлен в 3 цикла часов RTC (и часы предварительно не масштабированы в модуле RTC), то каждое второе прерывание будет пропущено из-за синхронизации. Если бы при этом, прерывание использовалось для пробуждения из спящего режима, то наблюдалась бы пробуждение от сна лишь в половине требуемых случаев. Этого можно избежать выбором базовых медленных (использованием предмасштабирования) часов RTC.
    Соединение RTC и системы событий
    RTC может генерировать события по переполнению счетчика или по результатам сравнения. При комбинировании с таймером-счетчиком RTC можно использовать для формирования круглосуточного таймера с генерацией события каждые 60 секунд. Событие происходящие раз в минуту также может использоваться как источник счета таймер-счетчика, который генерирует событие переполнения раз в 60 минут. А событие происходящие раз в час может быть использовано в часах другого таймера-счетчика – отсчитывающего часы.
    Отметим, что система событий не работает в спящих режимах глубже нерабочего режима (Idle). Нерабочий режим может быть использован для уменьшения потребления, при отключенных периферийных устройствах.
    Работа RTC в режиме отладки
    Когда выполнение кода в режиме отладке остановлено - RTC блокируется. Это гарантирует, что прерывания по RTC не будут генерироваться каждый шаг в пошаговом режиме отладки. Однако, тактирование RTC будет изменено в пошаговом режиме отладки кода – источник часов RTC часы центрального процессора будут асинхронны.
   Рекомендации по применению
   Далее будет предложены рекомендуемые процедуры по инициализации и конфигурации RTC. Все процедуры ниже предполагают, что система часов настроена на работу модуля RTC.
    Инициализация (RTC, не запущен)
Запишите значение периода в регистр периода PER.
Запишите значения величины сравнения и счетчика в регистры COMP и CNT.
Установите уровень прерывания для прерываний по сравнению и переполнению RTC.
Установите выбранный коэффициент предмасштабирования в регистре CTRL.
    Переинициализация (RTC, запущен)
- Остановите часы RTC очищением предмасштабирования.
- Дождитесь очищения флага BSY.
- Запишите значение периода в регистр периода PER.
- Запишите значения величины сравнения и счетчика в регистры COMP и CNT.
- Установите уровень прерывания для прерываний по сравнению и переполнению RTC.
- Установите выбранный коэффициент предмасштабирования в регистре CTRL
    Изменение периода RTC
- Дождитесь очищения флага SYNCBUSY.
- Запишите значение периода в регистр периода PER.
- Запишите регистр COMP или CNT.
    Изменение величины сравнения или значения счетчика
- Дождитесь очищения флага SYNCBUSY.
- Запишите регистр COMP или CNT.
    Вход в спящий режим
- Дождитесь очищения флага SYNCBUSY.
- Войдите в спящий режим.
    Ну и напоследок, пример использования счетчика реального времени.
    Пример. Достаточно часто встречается применение микропроцессоров, когда большую часть времени устройство находится в ожидании и лишь через заданные промежутки времени выполняет какие то действия, зачастую небольшой длительности. В таких применениях для экономии энергии целесообразно переводить микропроцессор во время периода ожидания в спящий режим. А для пробуждения удобнее всего использовать счетчик реального времени (RTC).
    Задача: Написать программу выдачи раз в 2 секунды на ЦАП (ножка PB3) односторонней спадающей пилы от 0,5 В до 0 В малой длительности (не более 0,2 с) и переходом в спящий Экономный режим (Power-save) после окончания выдачи пилы. Пробуждение осуществляется по прерыванию счетчика реального времени.
#define ENABLE_BIT_DEFINITIONS         // разрешение использования групповых битовых имен
#include <ioxm128a1.h> // Объявление используемых библиотек
#include <ina90.h> // Объявление используемых библиотек
int Data = 2047; // Объявление переменной для формирования пилы ЦАП
char Flag = 0; // Объявление переменной флага окончания выдачи пилы
void InitDAC(void)
{
DACB.CTRLB = 0x40; // двухканальная работа каналов 0 и 1
DACB.TIMCTRL = 0x50; // минимум 48 CLK между преобразованиями
DACB.CTRLA = 0x0D; // Разрешение работы DACB и каналов 0 и 1
DACB.CH0DATA = 2047; // Выдача на канал 0 в нулевое значение
}
void InitTimers(void)
{
/* Инициализации таймера С0 */
TCC0.CTRLA = 0x05; // N=64;
TCC0.PER = 50-1; // частота таймера 15кГц при системной частоте 48МГц
TCC0.INTCTRLA = 1; // уровень прерываний таймера low
/* Инициализации счетчика реального времени */
CLK.RTCCTRL = CLK_RTCEN_bm+CLK_RTCSRC_RCOSC_gc; // включение и настройка на частоту 1 кГц от внутреннего генератора 32кГц
RTC.PER = 2000; // частота счетчика 0.5 Гц при 1 кГц
RTC.CNT = 0; // обнуление счетчика
RTC.INTCTRL = 1; // уровень прерываний счетчика low
RTC.CTRL = 0x01; // включение счетчика с предмасштабированием 1
}
int main(void)
{
__disable_interrupt(); // Отключение прерываний
/* Установка тактирования от 3-х кранной частоты внешнего генератора 3*16=48 */
OSC.XOSCCTRL = 0xCB; // выбор внешнего генератора с временем запуска 16 тыс. CLK и частотой 12-16 МГц
OSC.CTRL = 0x08; // разрешение работы внешнего генератора
while((OSC.STATUS & 0x08) == 0 ) ; // ожидание появления в регистре статуса бита включения синхронизации от внешнего генератора
OSC.PLLCTRL = 0xC3; // настройка блока PLL на синхронизацию от внешнего источника и 3-х кратоное умножение
OSC.CTRL = OSC.CTRL | 0x10; // разрешение работы блока PLL
while((OSC.STATUS & 0x10) == 0 ) ; // ожидание появления в регистре статуса бита включения блока PLL
CCP = 0xD8; // включение защиты от изменения регистров ввода-вывода на время изменения синхронизации
CLK.CTRL = 0x04; // настройка системной синхронизации от блока PLL
OSC.CTRL = OSC.CTRL & 0xFE; // отключение системной синхронизации от внутреннего RC-генератора частотой 2 МГц
InitTimers(); // Запуск процедуры инициализации таймеров
PMIC.CTRL = 1; // приоритет прерываний уровня low
InitDAC(); // Запуск процедуры инициализации ЦАП
__enable_interrupt(); // Разрешение прерываний
while(1) // Основной бесконечный цикл
{
if (Flag) // Если действия ЦАП завершены
{
SLEEP.CTRL = SLEEP_SEN_bm + SLEEP_SMODE_PSAVE_gc; // установка Экономного режима в качестве спящего режима
__sleep(); // переход в спящий режим
SLEEP.CTRL = 0; // выход из спящего режима (по прерыванию счетчика реального времени)
Flag = 0; // обнуление флага окончания работы ЦАП
}
}
}
ISR(TCC0_OVF_vect) // обработка прерываний по переполнению таймера С0
{
if (Data) // Если выдача пилы не окончена
Data--; // то формируется следующая точка пилы
else // иначе
{
Data=2047; // сброс пилы в начальное состояние
Flag = 1; // установка флага завершения работы ЦАП
}
if (DACB.STATUS & 2) // проверка пустоты регистра канала 1
DACB.CH1DATA = Data; // если пуст - запись в ЦАП данных пилы
}
    Blogger Comment
    Facebook Comment

0 коммент.:

Отправить комментарий