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シリーズの水晶発振器では内部キャパシタを使用するよりも、外部キャパシタを使用した方が良いとの情報を頂いているので、基板のセッティングを変えてテストしてみたい所ではある。