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

 
 
 
Reply to this topicStart new topic
Ivaxa
сообщение Sep 19 2007, 09:58
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 10-04-07
Пользователь №: 26 914



Настройка таймера:
Код
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 Гц.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 19 2007, 10:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Уточните величины тактовых частот 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;
Go to the top of the page
 
+Quote Post
Ivaxa
сообщение Sep 19 2007, 13:19
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 10-04-07
Пользователь №: 26 914



Спасибо за совет! a14.gif Сделал, так как вы написали - помогло.
Действительно, частота MCLK=3.6864 МГц и поэтому не было синхронизации.
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 19 2007, 15:03
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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нс.
Go to the top of the page
 
+Quote Post

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

 


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


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