Make_Pic 0 28 июля, 2018 Опубликовано 28 июля, 2018 · Жалоба Процессор MSP430F2274 тактируется от DCO 1МГц/4 = 250кГц, но частота RC генратора - DCO нестабильна от температуры и напряжения. Использование калибровки резисторов с последующей записью в калибровочную область памяти не подходит из за длительности процедуры и записи во флеш периодической. Выбран вариант поправочного коэффициента- делителя, который измеряется подсчетом импульсов частоты MCLK DCO 250кГц таймером TIMER B. Временной интервал подсчета формирует TIMER A от 8МГц кварца. Не могу сделать совместный запуск таймеров TIMER A и TIMER B - Подскажите пожалуйста как это лучше сделать? Заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 29 июля, 2018 Опубликовано 29 июля, 2018 · Жалоба Для этого процессора сделать стабильной (малозависимой от температуры и напряжения) частоту DCO не получится. IMHO. По причине отсутствия в тактовой системе процессора узла FLL, который присутствует в F5xxx, может и в F4xxx появился. При наличии FLL используется кварц 32 кГц, работающий постоянно, и от него стабилизируется высокочастотный (или не высокочастотный) DCO, который может работать постоянно или запускаться при выходе из LPM. --- Непонятно, что подразумевается под "совместный". Если нужна абсолютная синхронность работы таймеров - я использовал бы внешнее аппаратное управление или тактирование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Make_Pic 0 29 июля, 2018 Опубликовано 29 июля, 2018 · Жалоба Для этого процессора сделать стабильной (малозависимой от температуры и напряжения) частоту DCO не получится. IMHO. По причине отсутствия в тактовой системе процессора узла FLL, который присутствует в F5xxx, может и в F4xxx появился. При наличии FLL используется кварц 32 кГц, работающий постоянно, и от него стабилизируется высокочастотный (или не высокочастотный) DCO, который может работать постоянно или запускаться при выходе из LPM. --- Непонятно, что подразумевается под "совместный". Если нужна абсолютная синхронность работы таймеров - я использовал бы внешнее аппаратное управление или тактирование. FLL нет и не будет -помечтать... Совместная - это когда работает один таймер от кварца, а другой от DCO. Подчеркиваю - работают, а не один работает, а другой по какой то неясной причине не запускается. Про стабильность - мне достаточно периодически (перед запуском подпрограммы, которая формирует время, частоту - требуется и точность +/- 0.5%) замерить стабилизированным кварцем таймером частоту DCO (TIMERA время 10мс от кварца, TIMERB тактируется от DCO 250кГц) количество импульсов - это будет поправочный коэффициент на определенный промежуток времени до следующего замера. Повторяюсь уже - опять непонятно? P.S. Не в тему - где сейчас Rezident? - Реально дельные советы по MSP430 здесь давал. :( Вымерли Гуру по MSP430 :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
controller_m30 1 29 июля, 2018 Опубликовано 29 июля, 2018 · Жалоба Покажите хотя бы ту часть кода, где инициализируются: кварц, DCO, таймеры, MCLK. Как определили, что один из таймеров не работает? Есть ли внутрисхемный отладчик, или только программатор? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 30 июля, 2018 Опубликовано 30 июля, 2018 · Жалоба Вымерли Гуру по MSP430 :( Не вымерли, пошли дальше. Я делал так (емнип) ACLK от часового кварца, на него сажаем таймер А. Таймер В - от DCO, а на вход капчи подаем выход CCR таймера А. Тогда в ССR таймера В зафиксируется количество тактов DCO, соответствующее интервалу таймера А. У TI немного другой подход - они подгоняют коэффициенты DCO под нужную частоту Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Make_Pic 0 30 июля, 2018 Опубликовано 30 июля, 2018 · Жалоба Не вымерли, пошли дальше. Я делал так (емнип) ACLK от часового кварца, на него сажаем таймер А. Таймер В - от DCO, а на вход капчи подаем выход CCR таймера А. Тогда в ССR таймера В зафиксируется количество тактов DCO, соответствующее интервалу таймера А. У TI немного другой подход - они подгоняют коэффициенты DCO под нужную частоту Спасибо, я так примерно и делаю, но не работает - вы можете привести здесь кусок своего кода? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 30 июля, 2018 Опубликовано 30 июля, 2018 · Жалоба /** \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, если что Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Make_Pic 0 9 августа, 2018 Опубликовано 9 августа, 2018 · Жалоба /** \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) - где стабильный кварцеванный источник? Как вы калибруете тактовый сигнал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться