2011年2月21日月曜日

LaunchPad付属X'talの使用

TIのMSP430のプラットフォームである、LaunchPadにオプションパーツとして付属している32.768kHzの水晶振動子を取り付け、内部キャパシタを12.5pFに設定して発振させ、タイマーのカウント値が16384(2Hz相当)の整数倍になる度にLEDをトグル点灯させているが、時々点滅動作が止まるように見える。

考えられる原因は以下の通り。

  • 実際に発振が不安定
  • 目視チェックなので錯覚
  • プログラムの問題
ちなみに、使っているプログラムは以下の通りである。
#include  <msp430g2231.h> 
void main (void)
{
  volatile unsigned int i;
  // Initial Settings
  WDTCTL = WDTPW + WDTHOLD;                        // Stop watchdog timer
  BCSCTL3 |= XCAP_3;                               // Set X_CAP 12.5pF
  TACTL = TASSEL_1 + MC_2 + TACLR;                 // ACLK, continuous mode, Timer CLR
  P1DIR |= 0x41;                                   // Set LED Port Output
  P1OUT &= 0xBE;                                   // LED OFF

  // When X'tal OSC is fault, Red LED Blink
  while ((BCSCTL3 & LFXT1OF)||(BCSCTL3 & XT2OF)) {
   P1OUT ^= 0x01;                                 // Blink Red LED
 for(i=5000;i>0;i--){;}                         // Set Blink Interval to Visible 
  }
  P1OUT &= 0xBE;                                   // LED OFF
  P1OUT |= 0x40;                                   // Green LED ON

  // Toggle Red LED and Green LED with 0.5 Seconds Interval
  while(1){
   if(((TAR & 0xFFFF)%0x4000)==0){
    P1OUT ^= 0x41;
   }
  }
}

オシロスコープや周波数カウンタを使用できる環境ではないので、上記のプログラムについて検討すると、問題点としてはタイマーの値(TAR)の剰余計算を行っている事により、LEDを点滅させる際の処理時間が長くなることが挙げられる。

そこで、プログラムを以下のように修正してテストしてみると、点滅する時間間隔が安定しているように見える。

#include  <msp430g2231.h>

void main (void)
{
  volatile unsigned int i;
  // Initial Settings
  WDTCTL = WDTPW + WDTHOLD;                        // Stop watchdog timer
  BCSCTL3 |= XCAP_3;                               // Set X_CAP 12.5pF
  TACTL = TASSEL_1 + MC_1 + TACLR;                 // ACLK, up mode, Timer CLR
  CCR0 = 0x3FFF;                                   // Set TACCR0 to 16383
  P1DIR |= 0x41;                                   // Set LED Port Output
  P1OUT &= 0xBE;                                   // LED OFF

  // When X'tal OSC is fault, Red LED Blink
  while ((BCSCTL3 & LFXT1OF)||(BCSCTL3 & XT2OF)) {
   P1OUT ^= 0x01;                                 // Blink Red LED
 for(i=5000;i>0;i--){;}                         // Set Blink Interval to Visible 
  }
  P1OUT &= 0xBE;                                   // LED OFF
  P1OUT |= 0x40;                                   // Green LED ON

  // Toggle Red LED and Green LED with 0.5 Seconds Interval
  while(1){
   if((TAR & 0xFFFF)==0){
    P1OUT ^= 0x41;
   }
  }
}

ちなみに、ツイッター上でMSP430シリーズの水晶発振器では内部キャパシタを使用するよりも、外部キャパシタを使用した方が良いとの情報を頂いているので、基板のセッティングを変えてテストしてみたい所ではある。

0 件のコメント:

コメントを投稿

フォロワー