PICマイコンを使って測定ツールを作ってみよう(2) ―― クロック周波数やモータの回転数を測れるカウンタを作る(後編)
tag: 組み込み 電子回路 ディジタル・デザイン
エレキ系DIY 2009年9月28日
●スイッチ読み出しと液晶パネル表示の処理を理解する
スイッチの読み出しでは,チャタリング防止回路などを通さずにそのまま読み取っています.前回の値を保持しており,現在読み取った値と違う場合,押したか離したかを判断します.メイン・ループの時間間隔がチャタリング除去には役立っています.
黄色のタクト・スイッチを押すと,メニュー表示が昇順で順番に出てきます.反対に緑色のタクト・スイッチを押すと,逆順でメニューが表示されます.実行したいメニューが上の列に表示されたとき,中央の青色のタクト・スイッチを押せば,そのメニューが選択されます.いまはまだカウンタ機能しかないので,カウンタがでてきたら選択します.次回はRS-485モニタが追加される予定です.そのときは2つ選択できるようにして,これら以外の機能が選択されたときは"N/A"が表示されるようになります.
液晶パネルの表示は,コマンドを使っての実行になります.コマンドを1回実行すると,短いものでも40μs待つ必要があり,けっこう無駄な待ち時間が生じます.液晶パネルの実行結果が読み出せるようにすれば,完了を待って割り込みを起こし,それまでの待ち時間をほかのタスクの実行に回せます.今回はそこまでやる必要がないので,ただ待つことにします.
液晶パネルとのインターフェースには4ビット仕様と8ビット仕様があります.できるだけピン数を少なくしておかないとほかの機能に使えないので,ここでは4ビット仕様でいきます.8ビットの文字コードを2回に分けて送るわけです.送る8ビットはコマンドの場合とデータの場合があります.コマンドの場合はRS信号(PB3)に'0'を書くことで,コマンドを送付できます.実際にはRB4~RB7の4ビットに,高位ニブル(4ビット),低位ニブル(4ビット)と2回に分けて送ります.
ここらへんの制御はLCDcontrol()関数を見ればよく分かります(リスト5).液晶コマンドには表1で示されたものがあります.もともとセイコーエプソンかどこかの文字表示液晶パネルをデッドコピーして作られたものが多く,コマンド定義はほとんど変わっていません.16文字2列液晶パネルでも,20文字4列大型液晶パネルでもコマンド体系は似ています.
void LCDcontrol(byte data) { byte db; PORTBbits.RB3 = 0; db = data&0xF0; PORTB = db; // set high niblle PORTBbits.RB2 = 1; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; PORTBbits.RB2 = 0; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; db = (data&0x0F)<<4; PORTB = db; // Set low nibble PORTBbits.RB2 = 1; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; PORTBbits.RB2 = 0; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; _asm NOP _endasm; } |