Jump to content
    

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

---

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

 

Share this post


Link to post
Share on other sites

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

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

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

---

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

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

/**
    \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, если что

Share this post


Link to post
Share on other sites

/**
    \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) - где стабильный кварцеванный источник? Как вы калибруете тактовый сигнал?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...