Перейти к содержанию
    

совместный запуск таймеров TIMER A и TIMER B

Процессор MSP430F2274 тактируется от DCO 1МГц/4 = 250кГц, но частота RC генратора - DCO нестабильна от температуры и напряжения. Использование калибровки резисторов с последующей записью в калибровочную область памяти не подходит из за длительности процедуры и записи во флеш периодической. Выбран вариант поправочного коэффициента- делителя, который измеряется подсчетом импульсов частоты MCLK DCO 250кГц таймером TIMER B. Временной интервал подсчета формирует TIMER A от 8МГц кварца.

 

Не могу сделать совместный запуск таймеров TIMER A и TIMER B - Подскажите пожалуйста как это лучше сделать?

 

Заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этого процессора сделать стабильной (малозависимой от температуры и напряжения) частоту DCO не получится. IMHO. По причине отсутствия

в тактовой системе процессора узла FLL, который присутствует в F5xxx, может и в F4xxx появился. При наличии FLL используется кварц 32 кГц, работающий

постоянно, и от него стабилизируется высокочастотный (или не высокочастотный) DCO, который может работать постоянно или запускаться при выходе из LPM.

---

Непонятно, что подразумевается под "совместный". Если нужна абсолютная синхронность работы таймеров - я использовал бы внешнее аппаратное управление или тактирование.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этого процессора сделать стабильной (малозависимой от температуры и напряжения) частоту DCO не получится. IMHO. По причине отсутствия

в тактовой системе процессора узла FLL, который присутствует в F5xxx, может и в F4xxx появился. При наличии FLL используется кварц 32 кГц, работающий

постоянно, и от него стабилизируется высокочастотный (или не высокочастотный) DCO, который может работать постоянно или запускаться при выходе из LPM.

---

Непонятно, что подразумевается под "совместный". Если нужна абсолютная синхронность работы таймеров - я использовал бы внешнее аппаратное управление или тактирование.

FLL нет и не будет -помечтать...

Совместная - это когда работает один таймер от кварца, а другой от DCO. Подчеркиваю - работают, а не один работает, а другой по какой то неясной причине не запускается.

Про стабильность - мне достаточно периодически (перед запуском подпрограммы, которая формирует время, частоту - требуется и точность +/- 0.5%) замерить стабилизированным кварцем таймером частоту DCO (TIMERA время 10мс от кварца, TIMERB тактируется от DCO 250кГц) количество импульсов - это будет поправочный коэффициент на определенный промежуток времени до следующего замера.

Повторяюсь уже - опять непонятно?

 

P.S. Не в тему - где сейчас Rezident? - Реально дельные советы по MSP430 здесь давал. :(

Вымерли Гуру по MSP430 :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покажите хотя бы ту часть кода, где инициализируются: кварц, DCO, таймеры, MCLK.

Как определили, что один из таймеров не работает?

Есть ли внутрисхемный отладчик, или только программатор?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вымерли Гуру по MSP430 :(

Не вымерли, пошли дальше.

Я делал так (емнип)

ACLK от часового кварца, на него сажаем таймер А.

Таймер В - от DCO, а на вход капчи подаем выход CCR таймера А.

Тогда в ССR таймера В зафиксируется количество тактов DCO, соответствующее интервалу таймера А.

 

У TI немного другой подход - они подгоняют коэффициенты DCO под нужную частоту

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не вымерли, пошли дальше.

Я делал так (емнип)

ACLK от часового кварца, на него сажаем таймер А.

Таймер В - от DCO, а на вход капчи подаем выход CCR таймера А.

Тогда в ССR таймера В зафиксируется количество тактов DCO, соответствующее интервалу таймера А.

 

У TI немного другой подход - они подгоняют коэффициенты DCO под нужную частоту

Спасибо, я так примерно и делаю, но не работает - вы можете привести здесь кусок своего кода?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/**
    \brief Калибровочная переменная
    Хранит количество тиков ТВ в периоде ACLK
*/
unsigned int TB_Tkts_In_ms = 4800;

static unsigned int Last_TB_Tkts = 4800;
static unsigned int LastTBR = 0;
static unsigned int DeltaTBR = 1100;

/**
*    \brief Флаг запуска калибровки DCO
*/
char NeedToCalibrateDCO = 1;


void SetDCO()
{
    BCSCTL1 = DIVA_3            // ACLK=LF XTAL, DIVA=8, RSEL=7
            | 0x07;                // max DCO freq

    BCSCTL2 = (DIVS_0)          // SMCLK=DCOCLK, DIVS=1,
            |(SELM_0)|(DIVM_0);    // DIVM=1, MCLK=DCOCLC

    DCOCTL = DCO0 | DCO1 | DCO2;                //DCO около 5МГц
    FCTL2 = FWKEY | FSSEL_1 | FN3 | FN2 | FN1;  // MCLK/14 for Flash Timing Generator

    TACTL = TASSEL1 | TACLR;
    TBCTL = TBSSEL1 | TBCLR | MC_2;     // Непрерывный режим, SMCLK

    TBCCTL6 = CCIS_1            // Вход захвата - CCIxA - ACLK
            | CM_1              // Захват по переднему фронту
            | CAP               // Режим захвата
            | CCIE;             // Прерывание разрешено

    //----------- Инициализация переменных ----------------------------
    TB_Tkts_In_ms = 4800;
    Last_TB_Tkts = 4800;
    LastTBR = 0;
    DeltaTBR = 1100;
    NeedToCalibrateDCO = 0;
    //-----------------------------------------------------------------
}

/**
*   Прерывание по захвату ACLK
*   \brief Определяет период ACLK в тактах ТВ
*/
static interrupt (TIMERB1_VECTOR) Timerb_ccr1(void) __attribute__ ((used));
interrupt (TIMERB1_VECTOR) Timerb_ccr1(void)
{
    switch(TBIV)
    {
        case 12: // прерывание по захвату ACLK, калибровка DCO

            DeltaTBR = TBCCR6 - LastTBR;
            LastTBR = TBCCR6;

            break;
    }
}

 

Ровно 10 лет прошло )

 

Это для F149, если что

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/**
    \brief Калибровочная переменная
    Хранит количество тиков ТВ в периоде ACLK
*/
...
/**
*   Прерывание по захвату ACLK
*   \brief Определяет период ACLK в тактах ТВ
*/
static interrupt (TIMERB1_VECTOR) Timerb_ccr1(void) __attribute__ ((used));
interrupt (TIMERB1_VECTOR) Timerb_ccr1(void)
{
    switch(TBIV)
    {
        case 12: // прерывание по захвату ACLK, калибровка DCO

            DeltaTBR = TBCCR6 - LastTBR;
            LastTBR = TBCCR6;

            break;
    }
}

 

Ровно 10 лет прошло )

 

Это для F149, если что

Не совсем понял, что вы делаете с полученной дельтой в прерывании. И если я правильно понял, таймер считает на переполнение от ACLK DCO - RC генератора, А таймер И отчего запущен - у вас оба таймера тактируются от ACLK (TACTL = TASSEL1, TBCTL = TBSSEL1) - где стабильный кварцеванный источник? Как вы калибруете тактовый сигнал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...