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