Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает синхронный захват TIMERB в MSP430FG4619
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Ivaxa
Настройка таймера:
Код
TBCTL |=(TBSSEL0      // Тактирование от ACLK          
       + MC1);        // Непрерывный режим счета
      
TBCCTL0 |=(CM0        // Захват по обоим фронтам (программный)
         + CM1
         + CCIS1  
         // + SCS      // Синхронный захват (если раскоментировать - не работатет)
         + CAP);      // Режим захвата


Обработчик прерывания (считаю период импульсов с помощью TIMERB):
Код
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_int(void)
{
unsigned int TBR_temp;

TBCCTL0 ^= CCIS0;   // Програмный захват (TBCCR0 = TBR)
TBCTL |= (TBCLR     // Очистка и перезапуск таймера
       +  MC1);
TBR_temp = TBCCR0;  
..................
}


Работает, пока не раскоментирую строку // + SCS.
В этом случае в TBCCR0 всегда или 0 или 1, когда в TBR - нормальные данные, при этом устанавливается почему-то флаг переполнения захвата COV, хотя TBR у меня никогда не переполняется

Но мне нужен именно синхронный захват. Что я делаю неправильно?

Частота входных импульсов примерно 2 Гц, ACLK=32768 Гц.
rezident
Уточните величины тактовых частот MCLK и ACLK. Установка бита SCS приводит к тому, что входной сигнал CCI стробируется тактовой частотой TBCLK=ACLK. Если ACLK значительно ниже MCLK, то скорее всего захват просто не происходит или происходит со значительной задержкой когда TAR уже сброшен. Причиной этому может быть факт, что период одного тактового сигнала ACLK (которым синхронизируется захват) больше, чем время выполнения команд
Код
TBCCTL0 ^= CCIS0;   // Програмный захват (TBCCR0 = TBR)
TBCTL |= (TBCLR     // Очистка и перезапуск таймера
       +  MC1);

См. времянку на рисунке Figure 16-10 в User's Guide
Для исключения этого нужно немного видоизменить процедуру считывания TBCCR0. Примерно так.
Код
TBCCTL0 ^= CCIS0;
while((TBCCTL0&CCIFG)==0); //ждем факта захвата
TBR_temp = TBCCR0;  
TBCTL |= TBCLR | MC1;
TBCCTL0&=~CCIFG;
Ivaxa
Спасибо за совет! a14.gif Сделал, так как вы написали - помогло.
Действительно, частота MCLK=3.6864 МГц и поэтому не было синхронизации.
rezident
Цитата(Ivaxa @ Sep 19 2007, 19:19) *
Спасибо за совет! a14.gif Сделал, так как вы написали - помогло.
Действительно, частота MCLK=3.6864 МГц и поэтому не было синхронизации.

Можно еще проще сделать, без принудительной перезагрузки таймера. Запустите таймер в режиме Continious (непрерывный счет от 0 до 65535) и пускай он работает с естественным переполнением через 0. Все остальное остается то же самое, за исключением того, что интервал будет не значением TBCCR0, а разницей между двумя соседними захватами. Для этого вам нужна еще одна переменная TBR_temp_old, в которой вы будете хранить значение предыдущей временнОй метки (захвата). Интервалом времени будет значение (TBR_temp-TBR_temp_old).
А если вы переменные TBR_temp и TBR_temp_old сделаете типом unsigned long и будете учитывать переполнения таймера (тем самым сделав софтовый эквивалент 32-разрядного таймера), то диапазон измерения периода частоты сможете значительно расширить. Или при том же диапазоне увеличить точность измерения, увеличив частоту тактирования таймера. Т.е. при тактировании таймера от 3.6864Мгц вы сможете измерять интервал времени 0xFFFFFFFF/3686400Гц=1165c (почти 20 минут) с временнЫм разрешением 1/3686400Гц=270нс.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.