獣医さんの電子工作とパソコン研究室 |
40−2.H8/3664 LCDディスプレイの接続とタイマAによる簡単な割込みの実験
|
■ LCDディスプレイの接続 |
やはり、最初はLEDチカチカの実験ですが、LCDディスプレイが動くといろいろプログラムを考えるのが楽しくなってきます。 |
LCD表示関数 LCD.h トラ技 2005年2月号 R8C/Tinyマイコン入門 第4回 参考にしH8用に改良 LCDへのデータ転送は4ビット毎に2回。 最小限の接続で使用している。 |
|
表示に使用したポートは ●データ(Dn)・・・ポート5 P50,P51,P52,P53 の4ビット ●イネーブル信号(E)・・・ポート5 P55 ●レジスタ選択信号(RS)・・・ポート5 P54 |
|
LCD_init() LCD_data(char asci) LCD_cmd(char cmd) LCD_clear() LCD_print(char *str) LCD_locate(char x, char y) LCD_cursol(char c_mode) LCD_move_cursol_right() LCD_move_cursol_left() LCD_lineprint(char x, char y,char *str) Delay_ms(unsigned long msec) Delay_us(long usec) |
LCD初期化 1文字表示 LCD制御コマンド発行 LCDクリア 文字列表示 指定位置にカーソル移動(数字は1から) LCDカーソルモード指定 カーソルを右に一つ移動 カーソルを左に一つ移動 指定位置に文字列を表示 ディレイ関数 msec単位 ディレイ関数 1usec単位 |
LCD表示テストプログラム・プロジェクトファイル(LZH) ・・・LCD testと表示するだけですが、参考に。 シュミレーションデバッガでI/Oポートの状況も見られます。 LCD.h ヘッダファイル内容 |
|
AKI-3664N実験資料 (エクセルファイルをLZH圧縮) 1.裏側から見たピン配置 2.ピン対称一覧表 3.実験回路図 |
実験の回路図 |
■ タイマAを使った割り込みを利用して時計を製作しました。 |
タイマAは簡単に秒単位の割り込みを作ることができます。また、そのタイムペースとしてボード上OSC2の3.57MHzの水晶発振子を利用できるため、精度の高い割り込みを得ることができます。 |
タイマAの設定は簡単です。初期設定に、タイマモードレジスタA(TMA)を設定すればこと足りてしまいます。 タイマAの使い方は 始める電気回路−3664Fで始めるH8−タイマーで正確な時間稼ぎをする に上手に説明されていますので参考にしてください。 |
今回は TMA-bit7,6,5=0 ・・・ 端子からクロック出力はしない TMA-bit3=1 ・・・ 低速時計用クロック使用 TMA-bit2,1,0 ・・・ クロック速度 1s に設定しました。 タイマAが1秒ごとに割り込みを発生しますので、時間をカウントアップし表示するだけです。 割込みテストプログラム・プロジェクトファイル test_TimerA.lzh test_TimerA.c の内容 |
割り込みを使う時は、開発環境によってプログラムの書き方が若干異なるようです。HEWの場合は、.cに割込みルーチンがまとめてあり、intprg.cファイルの中の割込みベクタ番号の後に割込み後の作業を記述しておけば良いようになっています。(↓) |
TimerAの割込みベクタ番号は19です。intprg.cを見ればすぐに場所はわかります。 intprg.cに割込み後の作業を記述しても良いのですが、その場合は、作業内容によってヘッダファイルも追加しておかないと、コンパイルエラーになります。 今回は、割込み後の作業を直接intprg.cには書かず、サブルーチンとしてmain.cに作業内容を記述しておき、intprg.cからサブルーチンを呼び出す形にしました。 |
■プログラム中に2進数の表記をしたい。 C言語では標準で2進数定数の表記ができないみたいです。そこで、プリプロセッサ・マクロを用いて2進数を表現できるようにしました。 プログラム中の dec_to_bin.h というヘッダーファイルがその定義です。 bに続く8桁の数字で、例えばb00001001 と書けば、定数の9ということになります。 こちらのヘッダーファイルを利用すれば、2進->16進の変換をしなくて良いので、レジスタの値などを変更しながら試してみる時は、たいへん便利です。 dec_to_bin.h の内容 |
■スイッチ入力時のチャタリン対策について キー入力といえばチャタリング対策方法ですが、今回は特にチャタリング除去をしていません。 100ms間隔でキースキャンしているような感じです。 使ってみてもそれほど問題になるような動作はないので、こんな感じでもいいのかもしれません。 プログラムをご参照ください。 ■LCDディスプレイへの数値の表示方法 |
■ タイマWのカウントでForループの速度を測ってみた。 |
ソフトウェアのループで時間稼ぎをするルーチンがありますが、実際にどの程度の時間稼ぎができるのかをしりたくて、タイマWのカウントを利用して実測してみました。 本来は、アセンブルしたものから実行クロック数を算出すれば出るのでしょうが、今の私には実測のほうがすぐにできそうなので作ってみました。 実測は for ループによるウエイトルーチンを対象にしていますが、Whileループによるものでも書き換えれば計測可能です。 KEY1,2でループの回数を設定し、SW3を押すとその回数forループを実行して、その間にカウントされたタイマWのタイマカウンタ(TCNT)を読み出すというものです。 TCNTの1カウントはクロック1周期分の設定に指定していますので、62.5nSです。従って、forループ実行結果はTCNT値×62.5nSということになります。 |
タイマWにはPWM出力などに使用できるように、設定のレジスタが何本もあります。 今回のように単なるカウントに使う場合は、タイマコントロールレジスタ(TCRW)のクロックセレクトで内部クロックの分周比を設定するのみで、他は初期設定値0のままで使えます。 forループ計測プログラム プロジェクトファイル test_For_Loop.lzh |
■LCDディスプレイへの数値表示について その2 前の時計プログラムで使用した Ttostring 関数は数値表示の際、先頭部分のゼロを表示してしまいますので、見難くなります。 そこで、先頭部分のゼロを表示しなくなるような関数 Itostring_zs を作成していますので、プログラムをご参照ください。 |
■forループの速度 LCDへの結果表示は、1行目右端にタイマWカウント数、2行目左がforループ数、2行目右にかかった時間が表示され、そのタイミングの1000倍でLEDが点滅しています。 結果は forループ設定値 2000 で 約 1ms 1000 で 約 500ns 500 で 約 250ns 100 で 約 50ns ということになりました。 この数値でLCDライブラリ中のソフトウェアウエイトルーチンを作っています。 |
■ さいごに |
最後にHEWでのコンフィグレーション切替とセッション切替について、いまひとつコンフィグレーション切替についてが理解できません。わかりやすく説明してくださる方、お願いします。 |
Last up date 2007//28 | |