3 実験方法

3.1 日程

この実験は,4回(150分×4)で行い,スケジュールは以下のとおりである.
1日目
2日目
3日目
4日目

3.2 準備

3.2.1 機材

ここでは,班でひとつの実験を行うのではなく,ひとりひとりが個別にH8の動作を調べる.表 1に,ひとり当たり必要な実験器材を示す. 表を見て分かるとおり,パソコン(PC)を使うため,電気棟3FのPCルームで実験を行う.

表 1: 実験器材
装置 メーカー 型番/仕様 数量
パソコン     1
H8マイコンボード 秋月電子通商 AKI-H8/3664N 1
ブレッドボード     1
直流電源    5V出力 1
    9V出力 1
赤色LED     6
トランジスター 東芝 2SC1815 2
抵抗   3.3 [k$ \Omega$] 8
セラミックコンデンサー   0.1 [$ \mu$F] 2
スピーカー     1
モーター     1
液晶表示モジュール     1
温度センサー     1
OPアンプ     1
タクトスイッチ     2
ジャンパーピン     2
D-SUBコネクター     1
ブレッドボード配線材      

3.2.2 注意

実験をはじめる前に以下の注意を読み,正しく機器を使うこと.

図 2: LED外観と記号
\includegraphics[keepaspectratio, scale=0.7]{figure/LED.eps}
図 3: ダイオードの外観と記号
\includegraphics[keepaspectratio, scale=0.7]{figure/diode.eps}

図 4: トランジスターの外観と記号
\includegraphics[keepaspectratio, scale=0.7]{figure/transistor.eps}
 
 
図 5: ブレッドボード上の配置
\includegraphics[keepaspectratio, scale=0.9]{figure/bread_bord_layout.eps}

3.2.3 ブレッドボードについて

ここでは,回路をブレッドボード(bread bord)2上に作成する (図5).通常,回路の作成にはハンダ付の作業が伴う. しかし,ブレッドボードを使うとその作業が不要となり,回路の変更が容易である.学生 実験や回路のテストを行う場合,とても都合が良い.

ブレッドボードを見て分かるように,たくさんの小さな穴が開いている.穴の間隔は1/10 インチとなっており,それはIC(Integrated Circuit)の足の間隔に等しい.この穴にICを 差し込んで,回路を作成する.ICに限らず,抵抗やスイッチ,トランジスター等の半導体 部品も差し込むことができる.差し込んだ部品は配線材により接続して,回路とする.

ブレッドボードを使うためには,内部の配線を理解しなくてはならない.ここで使うブレッ ドボードは,主に4つのブロックからできあがっている.そのひとつの内部配線を図 6 にしめす.数個の穴が内部で,電気的に接続されてい る.この接続を理解して,ブレッドボードを上手に使おう.

図 6: ブレッドボードの内部配線
\includegraphics[keepaspectratio, scale=1.0]{figure/bread_bord_block.eps}
[練習1]
テスターを使ってブレッドボード内部での配線を確認せよ.

3.2.4 ソフトウェアーについて

この実験のプログラムは,gccを使って開発する.gccは統合開発環境ではないため,プロ グラム開発は原始的な部分3から作成しなくてはならない.原始的な部分からプログラムを 開発すると大変ではあるが,コンピューターに関する多くの知識が得られる.この実験で は原始的な部分に触れないが,もしこれに興味があれば参考文献 []から読みはじめればよいだろう.また,私のWEBページ 「H8プログラム開発(Linux C言語 編)」でも記述している.

この実験で必要な原始的な部分のプログラムは全て,ダウンロードして使う.このプログ ラムの中身を全て理解できれば,一人前である.興味のある者はこれを理解するよう努力 せよ.コンピューターの仕組みがよくわかるようになる.

諸君がこの実験で記述するプグラムには原始的な部分はあまり見えないようにしているが, それでもビット操作等が必要になる.その時は,じっくり考えて動作の内容を理解しなく てはならない.

3.3 ポート出力実験

3.3.1 概要

3.3.1.1 ポートとレジスター

H8のI/Oポートの一つであるPort5を使って,LEDの点灯実験を行う.プログラムにより, Port5の電圧をH(5V)とL(0V)と変化させて,I/Oポートに接続したLEDの様子を調べる. Port5の電圧は,H8のレジスターPDR5で設定できる.レジスターPDR5とI/Oポー トのPort5の電圧の関係を図7にしめす.
図 7: PDR5とPort5の電圧の関係
\includegraphics[keepaspectratio, scale=1.0]{figure/port5.eps}

3.3.1.2 プログラム

7から,Port5はCN1の14-19番ピンに割り当てられていることが分 かる.ここにLEDを接続すると,それらを点灯/消灯することができる.このピンの出力電 圧はレジスターPDR5の下位6ビットにより決まる(図7).すなわ ち,8ビットのレジスターであるPDR5の第0ビットが1になると,14番ピンに5[ $ \mathrm{V}$]が出 力されLEDは点滅する.反対にビットが0になるとLEDは消灯する.プログラムにより,H8 マイコンのPDR5レジスターの設定すると,そこに接続されたLEDを点灯/消灯できる のである.ソフトウェアーでハードウェアーを制御している.

レジスターPDR5の値をC言語で設定するには,次のようにする.

	PDR5 = 0x01;

これで,PDR5の第0ビットを1にして,他の第1-7ビットを0に設定している.この方 法だとまずい場合がある.第6ビットと第7ビットは他の用途に使われており,それらのいっ しょに変更している.第6ビットと第7ビットを変更しないで,他のビットを変更するには, 次のようにする.
	PDR5 = (0x01 & 0x3f) | (PDR5 & 0xc0);

このようにすると,最初の0x01の部分を変えることで,第0--5ビットを任意に設定 できる.ここでは.右辺の0x01により,PDR5レジスターの第0ビットに1を設 定している.もし,ここを0xffとしても,第0--5ビットは1が設定されるが,第6と 7ビットは変化しない.このようなことができる理由を以下に示す.

3.3.1.3 練習問題

プログラムを理解したならば,次の練習問題を実施せよ.
[練習2]
式を使って,PDR5 = (0x01 & 0x3f) | (PDR5 & 0xc0)とする理 由を説明せよ.

3.3.2 1つのLED点灯実験

はじめに,ひとつのLEDの点灯と消灯の実験を行う.プログラムを変えることにより,LED の制御を行う.

3.3.2.1 プログラム

リスト1のプログラムの8行目で,レジスターPDR5の第0ビット を1に設定している.そのため,このプログラムを実行するとCN1の14番ピンから 5[ $ \mathrm{V}$]が出力される.すると,そこに接続されたLEDが点灯する.0x010x00にすると,接続したLEDは点灯しない.

3.3.2.2 実験順序

PDR5の第0ビットの値とCN1の14番ピンの出力の関係を以下の実験で調べる.
  1. 9のような回路をブレッドボード上に作成する.回路を作成 しているとき,その部品の破損を防ぐために電源を接続していはならない.意図 しない電流が素子に流れることがあるからである.図 5の配置に従い,H8マイコンやLED,スイッチ類 を配線すること.
    1. ブレッドボード上に電源ラインを作成する.ここでの実験使う機器は全て 5[ $ \mathrm{V}$]で動作する.
    2. ブレッドボード上にH8を取り付ける.ブレッドボードに取り付けた場合のH8の ピン番号は,図8のとおりである.
    3. 残りの配線を行 う.LEDには正負があるので間違えないこと.
  2. 配線に間違いの無いことをチェックする.
  3. プログラムに必要なファイルをダウンロードする.ファイル名や拡張子を変えて はならない.Makefileをダウンロードするときに余分な拡張子--.htmや.html-- が付くことがあるので,取り除くこと.
  4. リスト1のとおりH8マイコンのプログラムを作成する.
  5. コンパイルする.コマンドは,「make」である.
  6. makeの結果,できあがったプログラムをH8マイコンへ転送する.
    1. H8マイコン基板のJP2とJP3をジャンパーピンでショートする.
    2. 回路に5[ $ \mathrm{V}$]を供給する;電源のバナナジャックの正(赤)をブレッドボードに 接続する).
    3. コマンド「make write」をタイプし,プログラムを転送する.転送 がはじまると,「H8/3664F is ready! 2001/2/1 Yukio Mituiwa.」と 表示される.もし失敗したならば,[Ctrl][c]を押して,プ ログラムを止める.
    4. 転送には,20秒くらい必要である.「EEPROM Writing is successed.」と表示されるまで待つ.
  7. H8マイコンを実行させる.
    1. 5[ $ \mathrm{V}$]の電源をOFFにする;電源のバナナジャックの正(赤)をブレッドボー ドから引き抜く.
    2. H8マイコン基板のJP2とJP3のジャンパーピンを取り外し,オープンにする.
    3. ブレッドボードに,5[ $ \mathrm{V}$]を供給する
    4. プログラムが実行されて,LEDが点灯する.
    5. プログラムを最初から実行させたければ,RESスイッチを押す.このプロ グラムでは状態の変化は分からない.

   1 #include "3664.h"
   2 
   3 int main()
   4 {
   5 
   6   init_led();
   7 
   8   PDR5 = (0x01 & 0x3f) | (PDR5 & 0xc0);      /* PDR5は,port5のデータレジスタ */
   9   
  10   while(1){
  11     SLEEP();
  12   }
  13 }
  14 
図 8: ブレッドボード上でのH8のピン番号
\includegraphics[keepaspectratio, scale=0.78]{figure/H8_on_bread_bord.eps}
図 9: LED点灯実験回路
\includegraphics[keepaspectratio, scale=1.0]{figure/LED_1.eps}
[練習3]
テスターの電圧測定レンジを用いて,LEDに流れる電流を測定せよ. 電流や抵抗を測定するレンジを使ってはならない.
[練習4]
マイコンの出力端子にLEDを直に接続してはならない.その理由を説 明せよ.この実験の回路では,3.3[ $ \mathrm{K\Omega}$]の抵抗を直列に接 続している.
[練習5]
リスト1を書き換えて,LEDが消灯するプログラ ムを作成せよ.そして,実際に動作させてみよ.


3.3.3 複数のLED点灯実験

次に,複数のLEDの点灯と消灯の実験を行う.先の実験で使ったプログラムを改良して, 複数のLEDの制御を行う.

3.3.3.1 プログラム

リスト2のプログラムでは,レジスターPDR5の下位6ビットの値 は,0x2aから101010となる.このレジスターの値がCN1の14〜19番ピン-- P50-P55--の出力を決めている.したがって,この回路を動作させると,LED が交互に点灯する.レジスターPDR5とポートの出力の関係は図7 を見よ.

3.3.3.2 実験順序

先ほどの回路にLEDを5つ追加する.さらに,プログラムの一部を書き換えて,複数個の LEDの点灯/消灯の実験を行う.
  1. 10のような回路をブレッドボード上に 作成する.ただし,電源は,まだ接続しない.
  2. 配線に間違いの無いことをチェックする.
  3. 先のプログラムを書き直して,リスト2のとおりH8マイコン のプログラムを作成する.
  4. コンパイルする.コマンドは,「make」である.
  5. makeの結果,できあがったプログラムをH8マイコンへ転送する.
    1. H8マイコン基板のJP2とJP3をジャンパーピンでショートする.
    2. 回路に5[ $ \mathrm{V}$]を供給する.
    3. コマンド「make write」をタイプし,プログラムを転送する.転送 がはじまると,「H8/3664F is ready! 2001/2/1 Yukio Mituiwa.」と 表示される.もし失敗したならば,[Ctrl][c]を押して,プ ログラムを止める.
    4. 転送には,20秒くらい必要である.「EEPROM Writing is successed.」 と表示されるまで待つ.
  6. H8マイコンを実行させる.複数のLEDが転倒するはずである.
    1. ブレッドボードから,5[ $ \mathrm{V}$]の電源を取り外す.
    2. H8マイコン基板のJP2とJP3のジャンパーピンを取り外し,オープンにする.
    3. ブレッドボードに,5[ $ \mathrm{V}$]を供給する.
    4. プログラムが実行されて,LEDが交互に点灯する.
    5. プログラムを最初から実行させたければ,RESスイッチを押す.このプロ グラムでは状態の変化は分からない.

   1 #include "3664.h"
   2 
   3 int main()
   4 {
   5 
   6   init_led();
   7 
   8   PDR5 = (0x2a & 0x3f) | (PDR5 & 0xc0);      /* PDR5は,port5のデータレジスタ */
   9   
  10   while(1){
  11     SLEEP();
  12   }
  13 }
  14 
図 10: 複数LED点滅実験回路
\includegraphics[keepaspectratio, scale=1.0]{figure/LED_6.eps}
[練習6]
リスト2を書き換えて,LEDが ON-ON-ON-OFF-OFF-OFFとなるプログラムを作成せよ.そして,実際に 動作させてみよ.
[練習7]
さらに,リスト2を書き換えて,LEDが ON-ON-OFF-OFF-ON-OFFとなるプログラムを作成せよ.そして,実際に 動作させてみよ.

3.4 割り込み制御実験

外部の信号により動作中のプログラムを止めて,他のプログラムを実行させることを割り込み処理 という.この割り込み処理の実験を行う.

3.4.1 タイマー割り込み実験

3.4.1.1 実験内容

タイマー割り込みを使って,複数のLEDの制御を行う.ここでのプログラムでは0.5秒毎に 割り込みがかかり,LEDの状態が変化する.接続されている6つのLEDが2進数のビットパター ンを表しており,それがひとつずつ増加する.

3.4.1.2 プログラム

リスト3のプログラムでは,0.5秒毎に割り込みがかかり, int_timera()関数が実行される.するとPDR5の値がひとつずつ増加するので, LEDの点灯状況が変わる.0.5秒毎に2進数のを表すLEDのパターンがひとつずつ増える.も し,TMAレジスターを0x99から0x98にすると1秒毎になる.0x9aにす ると0.25秒毎,0x9bにすると0.03125秒毎になる.

3.4.1.3 実験順序

  1. 実験に使う回路は,先の「複数のLEDの点灯実験」と同一(図 10)なので,変更の必要はない.
  2. 先のプログラムを書き直して,H8マイコンのプログラムを作成する.
  3. コンパイルする.コマンドは,「make」である.
  4. makeの結果,できあがったプログラムをH8マイコンへ転送する.
    1. H8マイコン基板のJP2とJP3をジャンパーピンでショートする.
    2. 回路に5[ $ \mathrm{V}$]を供給する.
    3. コマンド「make write」をタイプし,プログラムを転送する.転送 がはじまると,「H8/3664F is ready! 2001/2/1 Yukio Mituiwa.」と 表示される.もし失敗したならば,[Ctrl][c]を押して,プ ログラムを止める.
    4. 転送には,20秒くらい必要である.「EEPROM Writing is successed.」 と表示されるまで待つ.
  5. H8マイコンを実行させる.

   1 #include "3664.h"
   2 
   3 #pragma interrupt
   4 void int_timera(void)
   5 {
   6   CLI();
   7   IRR1 &= 0xbf;
   8   PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0);		/* カウントアップ */
   9   STI();
  10 }
  11 
  12 int main()
  13 {
  14 
  15   init_led();                                /* port5を使うときの初期化 */
  16   init_timer();                              /* timer割り込みを使うときの初期化 */
  17 
  18   PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0);      /* PDR5は,port5のデータレジスタ */
  19 
  20   TMA = 0x99;
  21   
  22   while(1){
  23     SLEEP();
  24   }
  25 }
  26 

3.4.2 IRQ割り込み実験

3.4.2.1 実験内容

IRQ割り込み要求(Interrupt Request)を使って,複数のLEDの制御を行う.ここでは,回 路に接続したタクトスイッチを押すことにより,割り込み要求を発生させ,特定の関数を 実行させる.この関数の実行によりLEDの状態を変える.

3.4.2.2 プログラム

リスト4のプログラムでは,CN2の20番ピン(IRQ0)に接続したタクトスイッ チを押すごとに,int_irq0()関数が実行される.するとPDR5の値がひとつず つ増加するので,LEDの点灯状況が変わる.スイッチを押すごとに2進数のを表すLEDのパ ターンがひとつずつ増える.

3.4.2.3 実験順序

以下実験順序を示す.注意事項等については,p.[*]の「複数の LED点灯実験」と同じである.
  1. 11のような回路をブレッドボード上に 作成する.ただし,まだ電源は接続しない.
  2. 先のプログラム「experiment.c」を書き直して,IRQ割り込み実験プログラム「リ スト4」を作成する.
  3. コンパイルする.コマンドは,「make」である.
  4. makeの結果,できあがったプログラムをH8マイコンへ転送する.
  5. H8マイコンを実行させる.IRQ0に接続したスイッチを押すとLEDの状態が変化する.

   1 #include "3664.h"
   2 
   3 #pragma interrupt
   4 void int_irq0(void){
   5   CLI();
   6   IRR1 &= 0xfe;
   7   PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0);		/* カウントアップ */
   8   STI();
   9 }
  10 
  11 
  12 int main()
  13 {
  14 
  15   init_led();                                /* port5を使うときの初期化 */
  16   init_irq0();                               /* irq0割り込みを使うときの初期化 */
  17 
  18   PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0);      /* PDR5は,port5のデータレジスタ */
  19 
  20   while(1){
  21     SLEEP();
  22   }
  23 }
  24 
図 11: スイッチによる割り込み(IRQ0)実験回路
\includegraphics[keepaspectratio, scale=1.0]{figure/interrupt.eps}

3.5 PWM実験

パルスの繰り返しやデューティ比--図12のH(5V)の時間の割合--を変化 させることにより,機器を制御することができる.パルスを変化させて制御することを, PWM制御(Pulse Width Modulation)と言う.ここでは,H8マイコンのレジスターGRAGRDを変えることにより,PWM制御の実験を行う.

ここでの実験は,主に文献 [2]を参考にした.

図 12: PWMのパルス幅
\includegraphics[keepaspectratio, scale=1.0]{figure/PWM.eps}

3.5.1 トランジスター

ここの実験では,トランジスターをスイッチング素子として使う.実験に先立って,以下 の練習問題によりトランジスターの動作内容を理解せよ.
[練習8]
インターネットを使って,トランジスターの動作内容を理解せよ.
[練習9]
ダーリントン接続を説明せよ.

3.5.2 音を鳴らす

PWMの波形を使って,音を鳴らす.リスト5のプログラムでは, IRQ0に接続されたスイッチを押すごとに,PDR5の値が増加して,LEDのビット がひとつずつ変化--2進数のビットパターンで+1増加--する.それとともに,GRA の周期が$ 3/4$ずつ短くなる.ただし,デューティ比はいつも50%である.そのため,音 の周波数が,スイッチを押すごとに$ 4/3$倍と高くなる.

H8マイコンで作られたPWM波形は,CN2の13番ピン(FTIOD)から出力される.その出力 をトランジスターで増幅し,スピーカーをならしている.

3.5.2.1 実験順序

以下実験順序を示す.注意事項等については,p.[*]の「複数の LED点灯実験」と同じである.
  1. 13のような回路をブレッドボード上 に作成する.ただし,まだ電源は接続しない.トランジスターの極性を間違えない こと.
  2. 先のプログラム「experiment.c」を書き直して,音を鳴らす実験プログラム「リ スト5」を作成する.
  3. コンパイルする.コマンドは,「make」である.
  4. makeの結果,できあがったプログラムをH8マイコンへ転送する.
  5. H8マイコンを実行させる.割り込みのスイッチを押す毎に周波数が高くなる.

   1 #include "3664.h"
   2 
   3 #pragma interrupt
   4 void int_irq0(void){
   5   CLI();
   6   IRR1 &= 0xfe;
   7 
   8   PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0);		/* カウントアップ */
   9   
  10   GRA=GRA/4*3;                                  /* 音の周期を3/4に */
  11   GRD=GRA/2;
  12 
  13   STI();
  14 }
  15 
  16 
  17 int main()
  18 {
  19 
  20   init_led();                                /* port5を使うときの初期化 */
  21   init_irq0();                               /* irq0割り込みを使うときの初期化 */
  22   init_pwm();
  23 
  24   PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0);      /* PDR5は,port5のデータレジスタ */
  25 
  26   GRA=0xffff;                                /* 音の初期値 */
  27   GRD=GRA/2;
  28 
  29   start_pwm();                               /* pwm 信号スタート */
  30 
  31   while(1){
  32     SLEEP();
  33   }
  34 }
  35 
図 13: PWMを使ったスピーカーを鳴らす実験回路
\includegraphics[keepaspectratio, scale=1.0]{figure/speaker.eps}

3.5.3 DCモーターの速度制御

PWMを使って,DCモーターの速度制御を行う.DCモーターの回転数は平均電流に,大体,比例す る.PWMのデューティ比は,平均電流に比例する.そのため,デューティ比を変化させる ことによりDCモーターの速度を制御することが可能となる.リスト 6のプログラムでは,GRDレジスターの値を$ 1/16$ずつ増加させ ている.16回ボタンを押すとデューティ比が100%となる.

H8マイコンで作られたPWM波形は,CN2の13番ピン(FTIOD)から出力される.その出力 をダーリントン接続したトランジスターで増幅し,モーターを回している.

3.5.3.1 実験順序

以下実験順序を示す.注意事項等については,p.[*]の「複数の LED点灯実験」と同じである.
  1. 14のような回路をブレッドボード上に 作成する.ただし,まだ電源は接続しない.トランジスターの極性を間違えないこと.
  2. 先のプログラム「experiment.c」を書き直して,DCモーターの速度制御の実験プ ログラム「リスト6」を作成する.
  3. コンパイルする.コマンドは,「make」である.
  4. makeの結果,できあがったプログラムをH8マイコンへ転送する.
  5. H8マイコンを実行させる.割り込みのスイッチを押す毎にモーターの回転数が 増える.

   1 #include "3664.h"
   2 
   3 #pragma interrupt
   4 void int_irq0(void){
   5   CLI();
   6   IRR1 &= 0xfe;
   7 
   8   PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0);		/* カウントアップ */
   9   
  10   GRD+=0x1000;                                  /* PWMのHの幅を1/16ずつひろげる */
  11 
  12   STI();
  13 }
  14 
  15 
  16 int main()
  17 {
  18 
  19   init_led();                                /* port5を使うときの初期化 */
  20   init_irq0();                               /* irq0割り込みを使うときの初期化 */
  21   init_pwm();
  22 
  23   PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0);      /* PDR5は,port5のデータレジスタ */
  24 
  25   GRA=0xffff;                                /* モーターの初期速度 */
  26   GRD=0x0000;
  27 
  28   start_pwm();                               /* pwm 信号スタート */
  29 
  30   while(1){
  31     SLEEP();
  32   }
  33 }
  34 
図 14: PWMによるDCモーター動作実験回路
\includegraphics[keepaspectratio, scale=1.0]{figure/motor.eps}

3.6 LCD表示実験

ここでは,LCD(液晶ディスプレイ:Liquid Crystal Display)に文字を表示させる実験を行 う.C言語で書かれたH8マイコンのプログラムにより,LCDをコントロールして任意の文字 を表示させる.プログラムおよびハードウェアーの設定は,主に文献 [3]を参考にした.

3.6.1 LCD

液晶は電圧を加えることにより,光のシャッターとして使うことができる.これを利用し たものがLCDである.ここの実験では,16文字$ \times$2行の表示ができるLCDを使う.こ のLCDはひとつの文字を7$ \times$5ドットで構成しているので,合計1120ドットある.す なわち,1120個の小さい点を液晶によりON/OFFすることにより,いろいろな文字を表示し ているのである.

15にこの実験で使うLCDの外観とピン番号を示す.ここで使うLCDは データを4ビットと8ビットのいずれかで転送することができる.今回の実験では,接続す る線の数を減らすために,4ビットモードで使用する.

図 15: LCDの外観とピン番号
\includegraphics[keepaspectratio, scale=1.0]{figure/LCD_pin_NO.eps}

3.6.2 ポテンションメーター

回路基板に取り付ける部品で,抵抗が可変のものを可変抵抗といったり,トリマーあるい はポテンションメーターと言う.ここでも,ポテンションメーターを使うので,簡単に原 理を説明する.そして,実際にポテンションメーターの動作を実験で確かめる.

16に示すように,それには3本の電極がある.2本は抵抗の両端に 接続されており,残りの1本は抵抗の途中に接続されている.そのため図16のように 接続することにより,0〜5[V]の電圧を取り出すことができる.

ここでは,10 $ \mathrm{[k}\Omega\mathrm{]}$のポテンションメーターを使って,LCDのコ ントラストの調整に用いている.LCDのコントラストは,3番ピンの電圧で決まる.その電 圧をポテンションメーターで供給する.

図 16: ポテンションメーター
\includegraphics[keepaspectratio, scale=1.0]{figure/V_potention.eps}
[練習10]
ポテンションメーターの抵抗が図16のようになっ ていることをテスターで確認せよ.
[練習11]
16の回路を作成し,0〜5[V]が取り出せること を確認せよ.

3.6.3 H8によるLCD制御

H8に接続したLCDに文字を出力する実験を行う.H8マイコンのPort5出力(CN1の14-19番) の6本の線を使って,LCDの表示を制御する.このうち4本(CN1の14-17番)がデータ線で, 残りの2本が制御線である.

3.6.3.1 実験順序

以下実験順序を示す.注意事項等については,p.[*]の「複数の LED点灯実験」と同じである.
  1. 17のように回路をブレッドボード上に作成する.ただし,電源は, 接続しない.
  2. 先のプログラム「experiment.c」を書き直して,LCD制御の実験プログラム「リ スト7」を作成する.
  3. コンパイルする.コマンドは,「make」である.
  4. makeの結果,できあがったプログラムをH8マイコンへ転送する.
  5. H8マイコンを実行させる.文字が表示されるはずである.

LCDを制御するために,以下のような関数を用意した.必要に応じて使うこと.これらの関数のソー スプログラムは,ファイル h8c.c にあるので興味のある者は見るとよいだろう.

関数 void LCD_init(void)
役割 LCDを使うための初期化を行う.LCDを使うときに,最初に必ず呼び 出さなくてはならない.


関数 void LCD_clear(void)
役割 LCDの画面の文字を全て消去する.


関数 void LCD_locate(int row, int col)
引数 第一引数:行数 第二引数:列数
役割 引数で指定した位置にカーソルを移動させる.


関数 void LCD_putstr(char *string)
引数 文字列を示すポインター
役割 文字列をLCDに表示させる.


関数 void LCD_putchar(char c)
引数 表示させたい文字(1文字)
役割 文字をLCDに表示させる.


関数 void LCD_putint(char i)
引数 表示させたい整数.
役割 整数をLCDに表示させる.


関数 void LCD_putfloat(double x, int d)
引数 第一引数:表示させたい倍精度実数 第二引数:小数点以下の桁数
役割 倍精度実数を浮動小数点数として,指定の桁数で表示する.


関数 void LCD_putbit8(unsigned char d)
引数 表示させたい整数(1バイト)
役割 1バイトのビットパターンを表示させる.


関数 void wait_ms(int s)
引数 ミリ秒
役割 指定の時間,CPUの動作を止める.



   1 #include <stdlib.h>
   2 #include "3664.h"
   3 #include "h8c.h"
   4 
   5 
   6 int main()
   7 {
   8   
   9   LCD_init();                      // LCDの初期化
  10   LCD_clear();                     // LCDの画面クリアー
  11   LCD_locate(1,1);                 // カーソル位置変更
  12   LCD_putstr("Hello World !.");    // 文字列出力
  13   LCD_locate(2,1);
  14   LCD_putstr("From Akita.");
  15 
  16   while(1){
  17     SLEEP();
  18   }
  19 }
  20 
図 17: H8によるLCD制御実験の回路
\includegraphics[keepaspectratio, scale=1.0]{figure/LCD.eps}
[練習12]
リスト7を書き換えて,自分の名前を表示(1行目:姓,2 行目:名)せよ.
[練習13]
リスト7を書き換えて,適当な整数を表示せよ.ただし, LCD_putint()関数を使うこと.
[練習14]
リスト7を書き換えて,適当な実数を表示せよ.ただし, LCD_putfloat()関数を使うこと.

3.7 A/D変換器実験

ここでは,H8マイコンのAD変換器(Analog to Digital Converter)の実験を行う.

3.7.1 電圧計

H8マイコンでは,アナログ信号を取り込んで処理することができる.アナログ信号をコン ピューターで処理するためには,デジタル情報に変換する必要がある.その変換を行う部 分をAD変換器と言う.H8マイコンにはAD変換を行う回路が組み込まれている.ここでは, それを使って,デジタル電圧計を作成する.

H8マイコンは,CN1の23番ピンに印加されている電圧(大体5[ $ \mathrm{V}$])を10ビットでデジタ ルに変換する.10ビットで表現できる最大値は 1111111111=1023 である.したがって, 5/1023=4.88[ $ \mathrm{mV}$]が分解能である.

H8マイコンには8個のアナログ入力端子があるが,ここではCN1の10番ピンのAN0のみ使う. この端子に印加する電圧は,AD変換を行う際の比較電圧(CN1の23番ピン)よりも小さくし なくてはならない.また,逆電圧も印加してはならない.回路が破損するからである.そ のため,ここでの実験ではダイオードを用いた保護回路つける.

3.7.1.1 実験順序

以下実験順序を示す.注意事項等については,p.[*]の「複数の LED点灯実験」と同じである.
  1. 18のように回路をブレッドボード上に作成する.ただし,電源は, 接続しない.
  2. 先のプログラム「experiment.c」を書き直して,電圧計実験プログラム「リ スト8」を作成する.
  3. コンパイルする.コマンドは,「make」である.
  4. makeの結果,できあがったプログラムをH8マイコンへ転送する.
  5. H8マイコンを実行させる.すると,電圧が表示される.
  6. 1 $ \mathrm{[k}\Omega\mathrm{]}$のポテンションのネジを回して,電圧を変化さ せてみよ.

AD変換器を制御するために,以下のような関数を用意した.必要に応じて使うこと.これらの関数のソー スプログラムは,ファイル h8c.c にあるので興味のある者は見るとよいだろう.

関数 void ADC_init(void)
役割 AD変換器を使うための初期化を行う.AD変換器を使うときに,最初に必ず呼び 出さなくてはならない.


関数 int ADC(void)
役割 AN0(CN1の10番ピン)に接続さたアナログ電圧よ読み取り,戻り値と して返す.戻り値は 0〜1023の整数値である.0が0[ $ \mathrm{V}$]で,1023がCN1の23番ピン の電圧となる.



   1 #include <stdlib.h>
   2 #include "3664.h"
   3 #include "h8c.h"
   4 
   5 
   6 int main()
   7 {
   8   int vdata;
   9   double v;
  10   
  11   LCD_init();
  12   LCD_clear();
  13   LCD_locate(1,1);
  14   LCD_putstr("Start ADC");
  15   wait_ms(1000);
  16   LCD_clear();
  17 
  18   ADC_init();
  19 
  20   while(1){
  21     vdata= ADC();
  22 
  23     v = (double)vdata/1023*5.1;
  24     
  25     LCD_clear();
  26     LCD_locate(1,1);
  27     LCD_putstr("ADC result");
  28     LCD_locate(2,1);
  29     LCD_putfloat(v,3);
  30     LCD_locate(2,10);
  31     LCD_putstr("[V]");
  32 
  33     wait_ms(100);
  34   }
  35 }
  36 
図 18: A/D変換器を使った電圧計の回路
\includegraphics[keepaspectratio, scale=1.0]{figure/V_measure.eps}
[練習15]
リスト8のプログラムだとノイズによる電圧の揺 らぎが大きい.複数回測定の平均値を祖テク位電圧することにより, この問題は解決できる.10000回測定して,その平均電圧を表示するプ ログラムに直せ.測定精度は,どの程度向上したか?

3.7.2 温度計

電圧計を応用して温度計を作製する.

3.7.2.1 温度センサー

温度センサーは,ナショナルセミコンダクター社の LM35 を使う.これは図 19のような形状をしている.Gをグラウンド電位(0[ $ \mathrm{V}$])にして, +Vsに4〜20[ $ \mathrm{V}$]を印加すると,Voutに10[ $ \mathrm{mV/℃}$]が出力される.20[ $ \mathrm{℃}$]だ と,200[ $ \mathrm{mV}$]が出力される.
図 19: 温度センサー
\includegraphics[keepaspectratio, scale=1.0]{figure/sensor_tmp.eps}
[練習16]
ブレッドボード上で,LM35のGをラウンドウンド電位に,+Vsに 5[ $ \mathrm{V}$]を印加して,Voutを測定せよ.現在の室温と比べてどうか?

3.7.2.2 OPアンプ

温度センサーLM35の出力は,H8マイコンのAD変換器の測定レンジに比べ小さい.20[℃]の 場合のセンサー出力0.2[ $ \mathrm{V}$]に対して,AD変換器は5[ $ \mathrm{V}$]まで入力できる.センサー の出力を増幅させて,測定精度の向上をはかる.

電圧の増幅にはOPアンプ(operational amplifier)をつかう.OPアンプ使った信号の増幅 は簡単で,広範囲に使われている.ここでは,非反転増幅という回路をつかう.その回路 は,図20のようにする.このようにすると入力電圧($ V_{in}$)と出力電圧 ($ V_{out}$)は,

$\displaystyle V_{out}=\frac{R_s+R_f}{Rs}V_{in}$ (1)

となる. $ (R_s+R_f)/R_s$が増幅率になる.抵抗の組み合わせで,簡単に増幅率を変える ことができる.
図 20: OPアンプを使った非反転増幅回路
\includegraphics[keepaspectratio, scale=1.0]{figure/hihanten.eps}

この実験で使うOPアンプはナショナルセミコンダクター社のLMC662で,図 21に示すように,ひとつのパッケージに2つのOPアンプが内蔵されている.

図 21: OPアンプ(LMC662CN)の内部
\includegraphics[keepaspectratio, scale=1.0]{figure/op_amp.eps}
[練習17]
22の回路の増幅率が11倍になっていることを式で示せ.

3.7.2.3 温度計の作製

3.7.2.4 実験内容

電圧計の回路および温度センサー,OPアンプを使って温度計を作成する.

3.7.2.5 実験順序

以下実験順序を示す.注意事項等については,p.[*]の「複数の LED点灯実験」と同じである.
  1. 22のように回路をブレッドボード上に作成する.ただし, 電源は接続しない.
  2. 先のプログラム「experiment.c」を書き直して,温度計の作成実験のプログラム「リ スト9」を作成する.
  3. コンパイルする.コマンドは,「make」である.
  4. makeの結果,できあがったプログラムをH8マイコンへ転送する.
  5. H8マイコンを実行させる.すると,温度が表示される.
  6. 温度センサーを触ったりして,温度の変化を調べよ.

   1 #include <stdlib.h>
   2 #include "3664.h"
   3 #include "h8c.h"
   4 
   5 
   6 int main()
   7 {
   8   int i, sum_ad, N=10000;
   9   double t;
  10   
  11   LCD_init();
  12   LCD_clear();
  13   LCD_locate(1,1);
  14   LCD_putstr("Start ADC");
  15   wait_ms(1000);
  16   LCD_clear();
  17 
  18   ADC_init();
  19 
  20   while(1){
  21     sum_ad=0;
  22 
  23     for(i=0;i<N;i++){
  24       sum_ad += ADC();
  25     }
  26 
  27     t = (double)sum_ad/N*5.1/1023/11.0/0.01;
  28     
  29     LCD_clear();
  30     LCD_locate(1,1);
  31     LCD_putstr("Temperature");
  32     LCD_locate(2,1);
  33     LCD_putfloat(t,4);
  34     LCD_locate(2,11);
  35     LCD_putstr("[deg]");
  36   }
  37 }
  38 
図 22: A/D変換器を使った温度計の回路
\includegraphics[keepaspectratio, scale=1.0]{figure/Temp_measure.eps}

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成19年8月27日


no counter