реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> XMEGA32D4 и изменение периода таймера на лету, Как правильно?
Мария Е
сообщение Jun 5 2013, 12:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424



Здравствуйте!
Есть задача обновлять период таймера во время работы. Например, после десяти тактов с периодом 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 почитала и форумы разные...

Сообщение отредактировал Мария Е - Jun 5 2013, 13:15
Go to the top of the page
 
+Quote Post
bob1
сообщение Jun 7 2013, 15:16
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 17-09-06
Пользователь №: 20 471



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

Go to the top of the page
 
+Quote Post
Мария Е
сообщение Jun 13 2013, 06:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 18-11-07
Из: Москва
Пользователь №: 32 424



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


Спасибо за ответ. В связи с большой загрузкой по другому проекту и тем, что уведомления об ответах мне почему-то не приходят на почту, увидела его только сегодня.
Наверное, это замечательная идея, но в рассматриваемом МК XMEGA32D4 нет DMA.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th July 2025 - 17:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01339 секунд с 7
ELECTRONIX ©2004-2016