softdev:msp430:lcd1
MSP430でLCD駆動
おいおい、またLCDか?、、て言わないで。LCDが一番わかりやすい、動作が目に見えるし。。。
今回使ったのは、有る所から入手した4bit転送のLCDでした。初期化とか説明書通り。
気をつける必要があるのは、「MSP430の電源は上限3.3V(公称)」と言う事。PICの様に5Vでも3Vでもというわけには行かず、LCDを5V品にすると、LDOなんぞが必要になる。
- 回路図は作らずに、適当に配線。ポート足りるので外部品もRESET端子のPU抵抗だけ。
- MSP430の低消費電力を体験したかったので、Sleep制御して、タイマー割り込みを使って起きるようにした。
- LaunchPadには32.768KHzの水晶が1個付いてくるので、外部発振を使って時計を作ってみた。
- 外部SWでLCDコントラストを変えるようにする。(外部割り込み使う)
初期化部
コアクロックはデフォルトの内部クロック、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 ポート処理を入れる。 }
softdev/msp430/lcd1.txt · 最終更新: 2013/07/15 20:25 by 127.0.0.1