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

    

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация