Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: XMEGA32D4 и изменение периода таймера на лету
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Мария Е
Здравствуйте!
Есть задача обновлять период таймера во время работы. Например, после десяти тактов с периодом 100 мс запустить 10 тактов с периодом 10 мс, потом снова 10 тактов с периодом 100 мс и т.д.
Сначала я делала так:
CODE
if(timeout==10)
{
delay_ms(15);
TCC0.CTRLA=0;
TCC0.CNT=0;
TCC0.PER=290;
TCC0.CTRLA = 0x07; // 1024 div

}
if(timeout==20)
{
TCC0.CTRLA=0;
TCC0.CNT=0;
TCC0.PER=2900;
TCC0.CTRLA = 0x07; // 1024 div
timeout=0;
}


При этом TCC0 настроен для работы в нормальном режиме, тактирование с предделителем 1024, т.е. на 1 мс 29 тактов. Разрешено прерывание по переполнению, в прерывании обновляется переменная timeout
delay_ms() - это функция задержки на таймере TCC1. Ввела ее, чтобы проверить, что если таймер досчитал до большего числа, чем 10 мс, то он все равно сбросится в ноль, и только потом начнет считать заново с новым периодом.
Итоги:
в принципе работает, но один из тактов при периоде 10 мс длится 15 мс. Всегда третий. Если убрать delay_ms() (или поставить аргумент меньше или равный 10), то после 100 тактов с периодом 100 мс таймер больше не возобновляет работу.

Пыталась понять, почему так, не поняла.

В попробовала с использованием команды RESTART.
Тоже самое.

Что я делаю не так? Весь день сижу, не могу понять, и ds почитала и форумы разные...
bob1
Предлагаю переделать прогу.
1. К таймеру C0 (который обновляется) подключите счетчик C1 через канал событий. Срабатывание по переполнению С0.
2. канал DMA через канал событий подключите к С1.
3. С1 досчитал до 10 - DMA перегоняет новые значения в TCC0.PER.
p.s. все это работает в режиме idle.

Мария Е
Цитата(bob1 @ Jun 7 2013, 19:16) *
Предлагаю переделать прогу.
1. К таймеру C0 (который обновляется) подключите счетчик C1 через канал событий. Срабатывание по переполнению С0.
2. канал DMA через канал событий подключите к С1.
3. С1 досчитал до 10 - DMA перегоняет новые значения в TCC0.PER.
p.s. все это работает в режиме idle.


Спасибо за ответ. В связи с большой загрузкой по другому проекту и тем, что уведомления об ответах мне почему-то не приходят на почту, увидела его только сегодня.
Наверное, это замечательная идея, но в рассматриваемом МК XMEGA32D4 нет DMA.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.