獣医さんの電子工作とパソコン研究室
 
 40−2.H8/3664 LCDディスプレイの接続とタイマAによる簡単な割込みの実験
 

 

 ■ LCDディスプレイの接続

  やはり、最初はLEDチカチカの実験ですが、LCDディスプレイが動くといろいろプログラムを考えるのが楽しくなってきます。
 LCDディスプレイのルーチンンはR8C/Tinyのものをそのまま移植して使用しました。いくつか関数を追加しています。また、LCD関数をLCD.hとしてヘッダファイル化して、他のプログラムでも使うことにしました。 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ディスプレイへの数値の表示方法
数値をLCDに表示する場合、数値->数値を示す文字(ASCII)の変換が必要になります。
プログラム中 Itostring(int digit, unsigned long data, char *buffer) 関数は buffer ポインタで示す文字列中に 数値 data を digit で示す桁数の文字として置き換える関数です。
数桁の数値を一気に文字列に変換する関数で、これもトラ技 2005年2月号 R8C/Tinyマイコン入門 第4回のプログラムを参考にさせていただいています。
 

 ■ タイマ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
  
  プログラムの内容 test_For_Loop.c
 

■LCDディスプレイへの数値表示について その2
前の時計プログラムで使用した Ttostring 関数は数値表示の際、先頭部分のゼロを表示してしまいますので、見難くなります。 そこで、先頭部分のゼロを表示しなくなるような関数 Itostring_zs を作成していますので、プログラムをご参照ください。
 
■forループの速度
LCDへの結果表示は、1行目右端にタイマWカウント数、2行目左がforループ数、2行目右にかかった時間が表示され、そのタイミングの1000倍でLEDが点滅しています。
 
結果は forループ設定値
  2000 で 約 1ms
  1000 で 約 500ns
   500 で 約 250ns
   100 で 約 50ns
ということになりました。 この数値でLCDライブラリ中のソフトウェアウエイトルーチンを作っています。
 
  さいごに


 秋月のH8-3664Nフラットマイコンキットの基板のみ購入して、ブレッドボード上で実験ができました。
また、開発環境もRenesasが提供している統合開発環境HEWとフラッシュ書込みツールFDTの組み合わせで、簡単に開発が始められました。
ブレッドボード上で実験できると、電子ブロック的感覚で回路も変更できますので、マザーボードを作成するより楽ではないかと思います。
こちらにエクセルファイルですが、
 
 なかなか実験ばかりしていて実用品ができないのですが、いろいろいじっているうちにC言語の使い方にも慣れてきましたし、H8/3664の構造もなんとなく実体がわかってきました。
やはり、「習うより慣れろ」ということでしょうか。

 最後にHEWでのコンフィグレーション切替とセッション切替について、いまひとつコンフィグレーション切替についてが理解できません。わかりやすく説明してくださる方、お願いします。
 

 
Last up date 2007//28

 

This page count Total:31413 / Today:4 / Yesterday:0  

 本業のページ