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 件のコメント:
コメントを投稿