Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Что-то не так делаю с таймером
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
sterya
Пытаюсь вычислить частоту DCO с помощью таймера и часового кварца.
Делаю так:

Код
  TACCTL0 = OUTMOD_0;
  TACTL = TASSEL_2 + TACLR;          // SMCLK, cont-mode, clear
  TACCR0 = 0xFFFF;
  TACCR1 = 0xFFFF;
  TACCR2 = 0xFFFF;
  // Используем режим захвата (CAP)
  // Сигнал CCI2B - CCR2 == ACLK (для MSP430F1232)
  TACCTL2 = CM_1 + CCIS_1 + CAP;            // CAP, ACLK

  MCU_Freq = 0;
  TACTL |= MC_1; // Старт

  while (!(CCIFG & TACCTL2));             // Wait until capture occured
  TACCTL2 &= ~CCIFG;                       // Capture occured, clear flag
  MCU_Freq = TACCR2;
  
  while (!(CCIFG & TACCTL2));             // Wait until capture occured
  TACCTL2 &= ~CCIFG;                       // Capture occured, clear flag
  
  MCU_Freq = TACCR2-MCU_Freq;
  MCU_Freq *= 32768;


Т.е. тактирую таймер от DCO. Настраиваю режим захвата по ACLK, который работает от часового кварца.

Первый проход таймера считаю сбойным, т.к. могли начать где-нибудь в середине такта кварца, а второй считаю рабочим.

DCO реально работает на частоте порядка 5МГц. Т.е. за один такт часового кварца должно проходить примерно 150 тактов DCO.

Реально я вижу, что набегают сильно разные значения. Причем, все они больше чем надо: от 200 до 250.

Собственно, что я делаю не так? Каким образом набегают лишние такты?
rezident
Во-первых, следует использовать таймер в Continuous mode, а не в Up mode. Во-вторых, где у вас настройка источников тактирования и выбор коэффициентов деления SMCLK и ACLK? В-третьих, какую размерность у вас имеет переменная MCU_Freq? Она должна быть типа unsigned long. Именно беззнаковой и 32-х битной! Ну и не мешало бы при расчете ввести еще одну временную переменную, куда сохранять промежуточное значение TACCR2 перед вычислениями.
sterya
Цитата(rezident @ Jun 8 2010, 17:30) *
Во-первых, следует использовать таймер в Continuous mode, а не в Up mode. Во-вторых, где у вас настройка источников тактирования и выбор коэффициентов деления SMCLK и ACLK? В-третьих, какую размерность у вас имеет переменная MCU_Freq? Она должна быть типа unsigned long. Именно беззнаковой и 32-х битной! Ну и не мешало бы при расчете ввести еще одну временную переменную, куда сохранять промежуточное значение TACCR2 перед вычислениями.



Режим использую именно Continuous, просто вкралась ошибка именно в сообщение сюда на форум.
Далее, источники настраиваются так:
Код
// XT1 = 32.8 KHz
// XT2 = OFF
//
// DCO = 5000 KHz
// ACLK = XT1 = 32768 Hz
// MCLK = DCO = 5000 KHz
// SMCLK = DCO = 5000 KHz


Т.е. делители везде единички.
Переменная: unsigned long MCU_Freq;
Зачем вводить вторую переменную не понимаю. Компилятор прекрасно сам разберется с такой тривиальной конструкцией.

На самом деле, было бы интересно посмотреть как кто делает в своих проектах вычисление частоты DCO. Именно через таймер.
rezident
Уважаемый, sterya. Телепатия конечно же является обязательным свойством всех постоянных пользователей данного форума. Но вот беда, пользоваться этим свойством умеют немногие. laughing.gif Если вы хотите получить какой-то реальный результат от общения здесь, то не рассчитывайте сильно на эту телепатию.
Я лично частоту DCO не вычисляю. Калибровку.подстройку DCO по часовому кварцу - да, делал. Но принцип использовал тот же самый, который и вы реализуете. Он описан в slaa074. Все дело в мелочах этой реализации, до которых вы почему-то не опускаетесь. Приведите весь свой код, относящийся к вычислению частоты DCO, а не куски "ошибочного" кода и какие-то ненужные комментарии.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.