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

 
 
> 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



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

 


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


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