目次

MSP430でLCD駆動

おいおい、またLCDか?、、て言わないで。LCDが一番わかりやすい、動作が目に見えるし。。。

今回使ったのは、有る所から入手した4bit転送のLCDでした。初期化とか説明書通り。
気をつける必要があるのは、「MSP430の電源は上限3.3V(公称)」と言う事。PICの様に5Vでも3Vでもというわけには行かず、LCDを5V品にすると、LDOなんぞが必要になる。

初期化部

コアクロックはデフォルトの内部クロック、1MHz。

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer
  P1SEL = 0x00;
  P1SEL2= 0x00;
  P1DIR = 0x01;               // Set P1.0 to output direction
  P1OUT = 0x38;
  P1REN = 0x38;               // Set 出力HしてからRENをセットするとPullUpになる模様  
  P2DIR |= 0x3F;              // Set P2 Out
----
LCD初期化し表示(省略)
----
  lcd_puts("LCD Watch");

端子割り込み

SWを3つ、P1に割り振る。

//  Pi interrupt enable
  P1IE  = 0x38;
  P1IES = 0x38;		// P1.3-5 エッジ割り込みH->L
  P1IFG &=0x38;	// P1.3-5 割り込みフラグクリア

タイマ

タイマを外部の低周波数CLK、ACLKだったかな、にする。ここに、32768Hzの水晶振動子を付けて、15bitカウントしたら時計を1秒進ませる。

//	Timer A setting
  TACTL = TASSEL_1 + MC_1 ;// ACLK, up to ccr, interrupt
  TACCR0 = 32768;	   // キャプチャ コンペアの値
  TACCTL0 |= CCIE;         // enable interrupt

Sleepモード

ここまで書いたら、割り込み有効で、LPM3モード(ACLKのみ生きてて、MCLKもCPUもsleepしている)へ移行する。下記一文でその場で停止。後は割り込み処理で動作を継続する。

  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/interrupt

各モードの消費の比較

ちなみに、LPM4はACLKまですべてのCLKとCPUが停止するモードで、外部割り込みのみresumeできる。

割り込み部

//A0_VECTOR : Timer0_A CC0
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
	jikan += 1;	     // 1秒進める。jikanは秒数で、24時間を考慮してlongで定義
	if(jikan==86400)jikan=0;// 24:00:00 → 00:00:00
 
   ここに時計データの表示処理が入る。	
}
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  P1IFG &=0x38;       // P1.4 IFG cleared
 ポート処理を入れる。
}