реклама на сайте
подробности

 
 
> Помогите вернуть калибровки частоты F2013
Алексей Савченко
сообщение Sep 3 2008, 15:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704



Сбились калибровки во FLASH-INFO, работал на 8МГц, а сча надо бы на 1МГц. Кто работает с MSP430F2013 посмотрите, плиз, эту калибровку. Они там мало отличаются МК от МК, поэтому подобрать будет достаточно просто.(Делал это на 8МГц).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Sep 3 2008, 16:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Попробуйте вот эту функцию. Когда-то писал ее для подстройки DCO по часовому кварцу для совместимых по пинам кристаллов в TQFP-64. Используется встроенная возможность TimerA использовать ACLK как входной сигнал в режиме захвата.
Требуемая частота DCO задается макросом FREQMCLK. FREQACLK частота цасового кварца 32768Гц. Тип/серия кристалла (MSP430x1xx или MSP430x2xx) задается макросом MSP430F2XX_SERIES. Для MSP430x1xx подразумевается наличие внешнего резистора ROSC. Сохранение/восстановление режимов работы таймера А можете выкинуть. Точно также как и сохранение/восстановление битов регистра SR.
Обратите внимание, что для малоногих кристаллов как у вас (MSP430F2013) источник ACLK подключается к CCI регистра TA1, а не TA2, как в моей функции.
Код
#define RATIO_DCO_ACLK  (FREQMCLK/FREQACLK)       //отношение частот DCO и ACLK
#define DEVIATION_DCO   1                         //допустимая абсолютная погрешность DCO
#ifndef MSP430F2XX_SERIES
  #define RSEL_MASK 0x07
  #define RSEL_MAXVAL  7
#else
  #define RSEL_MASK 0x0F
  #define RSEL_MAXVAL  15
#endif
//================================================//
// Инициализация источников тактирования          //
// MCLK, SMCLK, ACLK                              //
//------------------------------------------------//
//аргументы :нет                                  //
//возвращает:нет                                  //
//================================================//
void initOscSystem(void)
{ unsigned int SRstat;
  unsigned int uTmp, error, cntr, TACTLstat, TACCTLstat, TACCTL2stat;
  SRstat=__get_SR_register();                       //сохраним статусный регистр
  __bic_SR_register(__SR_OSC_OFF|__SR_SCG0|__SR_SCG1);
#ifdef MSP430F2XX_SERIES
  BCSCTL3=XT2S1|XCAP_3;                           //3MHZ<XT2<16MHZ, XCAP=12.5pF
#endif
  BCSCTL1=XT2OFF|DIVA_0|RSEL2|RSEL1|RSEL0;        //ACLK=LFXT
  BCSCTL2=SELM_0|DIVM_0|DIVS_0;                   //with ROSC SMCLK=DCO about 6.5МГц
#ifdef MSP430F2XX_SERIES
  while ((BCSCTL3&LFXT1OF)!=0);
  if (*((xByte *)TAG_DCO_30)==0x01)
  { DCOCTL=CALDCO_16MHZ;                          //DCO about 16МГц
    BCSCTL1=CALBC1_16MHZ;//&(~XT2OFF);               //ACLK=LFXT
  }
  else
  { DCOCTL=0x82;                                  //DCO about 16МГц
    BCSCTL1=0x8F;                                //ACLK=LFXT
  }
#else
  DCOCTL=0x80;                                  //DCO about 5МГц
  BCSCTL1=0x8F;                                 //ACLK=LFXT
  BCSCTL2|=DCOR;                                //включить внешний RSEL
#endif
  //сохранение регистров TimerA и инициализация его для подстройки DCO
  TACTLstat=TACTL;
  TACTL|=TACLR;
  TACCTLstat=0;
  if ((TACCTL0&CCIE)!=0)
    TACCTLstat|=(1<<0);
  if ((TACCTL1&CCIE)!=0)
    TACCTLstat|=(1<<1);
  TACCTL2stat=TACCTL2;
  TACCTL2=CM_2|CCIS_1|CAP;                        //CCInput2=ACLK
  TACTL=TASSEL_2|ID_0|MC_2;                       //TACLK=SMCLK
  //подстроим DCO по LFXT с помощью режима захвата TimerA
  error=0;
  do
  { TACCTL2&=~CCIFG;
    while((TACCTL2&CCIFG)==0);          //ловим первый фронт ACLK
    uTmp=TACCR2;
    TACCTL2&=~CCIFG;
    while((TACCTL2&CCIFG)==0);         //ловим второй форнт ACLK
    uTmp=TACCR2-uTmp;                 //получаем отношение частот SMCLK/(ACLK*2)
    if (uTmp!=RATIO_DCO_ACLK)
    {
      if ((uTmp>(RATIO_DCO_ACLK<<1))||//отношение частот выше заданного более чем в 2 раза?
          (DCOCTL==0x00)
         )
      { cntr=BCSCTL1&RSEL_MASK;
        if (cntr>0)
          cntr-=1;
        BCSCTL1=(BCSCTL1&(~(RSEL_MASK)))|cntr;
        DCOCTL=DCO2;
        error=1;
      }
      else
        if ((uTmp<(RATIO_DCO_ACLK>>1))||//отношение частот ниже заданного более чем в 2 раза?
            (DCOCTL>=0xE0)
           )
        { cntr=BCSCTL1&RSEL_MASK;
          if (cntr<RSEL_MAXVAL)
            cntr+=1;
          BCSCTL1=(BCSCTL1&(~(RSEL_MASK)))|cntr;
          DCOCTL=DCO2;
          error=1;
        }
        else
          if (uTmp>(RATIO_DCO_ACLK+DEVIATION_DCO))//отношение частот выше заданного?
          { if (DCOCTL>0)
              DCOCTL-=1;
            if (error<0xFFFF)
              error++;
          }
          else
            if (uTmp<(RATIO_DCO_ACLK-DEVIATION_DCO))//отношение частот ниже заданного?
            { if (DCOCTL<0xFF)
                DCOCTL+=1;
              if (error<0xFFFF)
                error++;
            }
            else
              error=0;                  //отношение частот попало в заданный диапазон
    }
    else
      error=0;
  } while(error!=0);       //цикл, пока отношение частот не будет в заданном диапазоне
  //восстановим регистры TimerA
  TACTL|=TACLR;
  TACCTL2=TACCTL2stat;
  if ((TACCTLstat&(1<<1))!=0)
    TACCTL1|=CCIE;
  else
    TACCTL1&=~CCIE;
  if ((TACCTLstat&(1<<0))!=0)
    TACCTL0|=CCIE;
  else
    TACCTL0&=~CCIE;
  TACTL=TACTLstat;
  //установим назначенные делители для MCLK и SMCLK
  BCSCTL2|=SELM_0|DIVM_0|DIVS_0|SELS;    //MCLK=DCO, SMCLK=XT2
  IE1|=OFIE;
  SRstat&=~(__SR_OSC_OFF|__SR_SCG0|__SR_SCG1);
  __bis_SR_register(SRstat);
}

Используя вместо макросов FREQMCLK и FREQACLK переменные, можно "прогнать" функцию несколько раз, получить значения регистров для всех требуемых частот и восстановить калибровочные параметры, записав их во Flash. Только не забудьте прописать еще и байт признака наличия этих констант TAG_DCO_30.
Если такой способ вам покажется слишком геморройным, то ждите пока кто-нибудь опубликует готовые значения. У меня нет ни eZ430, ни такого кристалла.
Go to the top of the page
 
+Quote Post
Алексей Савченко
сообщение Sep 3 2008, 18:49
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-08-08
Из: г.Чернигов, Украина
Пользователь №: 39 704



Вроде понял, только ни разу и не использовал в таких возможностях таймер. Поэтому возник один вопрос. Вы написали:
Цитата(rezident @ Sep 3 2008, 19:37) *
источник ACLK подключается к CCI регистра TA1, а не TA2, как в моей функции.


По коду видно, что CCI2B подключается к входу таймера при захвате. Это надо в даташите посмотреть куда заводиться внутренне ACLK? И что б подключить с портом ничего не надо мутить(все по умолчанию)?(CCIхB для нулевого таймера)
P.S. Я потенциально догадываюсь как следует, но из-за малого опыта боюсь ошибиться.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 09:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016