「練習プログラム1」の編集履歴(バックアップ)一覧はこちら
「練習プログラム1」(2011/05/19 (木) 16:11:53) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p> 練習用のプログラムでは、参考のプログラムをもとに、マイコンの機能を使う課題のプログラムを組みます。</p>
<p>これらの練習用プログラムは,サークル内で使っている練習用基板の回路を動かし,そのなかでプログラムを習得しようというものです.<br />
なお,開発環境にはBestTechnology製のGCC Developer Lite(以下GDL)を用いています.</p>
<h5> 参考プログラム① 『LED全点灯』</h5>
<pre>
#include <3694.h>
int main(void){
IO.PCR5 = 0xff; //Port5をすべて出力に設定.
while(1){ //無限ループさせる.
IO.PDR5.BYTE = 0x00; //Port5すべての端子状態を【Low】に設定.
}
return 0;
}
</pre>
<h5> ・プログラムの解説</h5>
<p>マイコンのプログラムは,通常のC言語と違い,main()関数から始まらなければならないという規則はありません.<br />
ですが,今回のプログラムにおいて,main()関数でプログラムを始めているのは,GDL標準のスタートアップルーチン上に,<br />
main()関数を呼び出すことが定義されているためです.<br />
それにより,通常のC言語と同様にmain()関数から違和感なくプログラムを組むことが可能になっています.<br />
また,スタートアップルーチンとは,具体的な動作を始める前に,マイコンの準備などを行うために作られるモジュールです.<br />
GDLでは,標準の場合はリンカスクリプトでベクタテーブルを設定しており,起動後にスタートアップルーチンに記述された<br />
_start:<br />
ルーチンを呼び出すように定義されているようです.<br />
興味のある人は"h8crt0.s"(スタートアップルーチン)や,"h8rom.x"(リンカスクリプト)を見てみるといいかと思います.<br /><br />
さて,プログラムの中身を見ていきます.<br />
まずは,第一行目です.</p>
<pre>
#include <3694.h>
</pre>
<p>GDLが用意しているターゲットファイルの中にある,3694.hというヘッダファイルを読み込みます.<br />
このヘッダファイルには,マイコンを操作する上で欠かせない様々なレジスタ情報などが定義されています.</p>
<p>次に,main()関数の中身を見ていきます.<br />
今回のプログラムの目的は,Port5につないであるLEDをすべて点灯させることです.<br />
回路図をみれば分かりますように,Port5の各端子が5Vよりも低電位になれば電流が流れます.(実際はもっと低くないといけませんが)<br />
H8/3694では,Port5の各端子の状態をそれぞれ,5V付近である【High】と0V付近である【Low】状態に設定することが出来ます.<br />
また,Port8は汎用入出力ポートであり(ここではTMWの話はおいておきます),「入力」と「出力」の機能を選択することが出来ます.<br />
LEDを光らせたりするために,端子の状態をプログラム上で変更するには,出力状態にする必要があるので,まずはその機能の選択をします.<br />
Port5の入出力の機能を選択は,ポートコントロールレジスタ5(PCR5)を設定することで出来ます.そこで,次の一行を加えます.</p>
<pre>
IO.PCR5 = 0xff;
</pre>
<p>これで,Port5の端子はすべて出力ポートに設定されます.<br />
次のPDR5とも併せて,それらのレジスタについての説明は後述します.</p>
<p>さて,これでLEDを光らせるための下準備は終わりです.<br />
後は,Port5の端子状態を【Low】に設定すれば,LEDを通ってH8に電流が流れ込み,LEDが点灯します.<br />
端子状態は,ポートデータレジスタ5(PDR)を設定することで決定されます.</p>
<pre>
IO.PDR8.BYTE = 0x00;
</pre>
<p> これにより,Port8のすべての端子が【Low】状態になり,LEDが点灯するはずです.</p>
<p>なお,今回はPDR8への書き込みを無限ループさせていますが,実際は一度設定してmain()関数を抜けてしまっても,<br />
スタートアップルーチン内の無限ループで拾ってもらえます.<br />
しかしながら,スタートアップルーチンも抜けて,本来プログラムが書き込まれていないはずの領域までプログラムコードとして読みに<br />
いきますと,バグなどの原因になりかねませんので,極力自分の分かるところで終わらせるようにしましょう.<br />
(スタートアップルーチンを書き換えない限り,あり得ないことだと思いますが.)</p>
<h5>・レジスタの解説</h5>
<p><strong>ポートコントロールレジスタ5(PCR5) アドレス:H'FFEB</strong><br />
汎用入出力ポートとして使用する端子の入出力の機能を各ビットごとに定義します.<br />
PCR5の0ビットから7ビットまで,それぞれがPort5の端子である,P50からP57に対応します.<br />
PCR5の設定(各ビット0か1)による端子の機能は次のようになります.<br />
0: 入力ポート<br />
1: 出力ポート<br />
なお,GDL標準の定義ファイル(3694.h)では,BYTE単位でのアクセスしか定義されていません.</p>
<p><strong>ポートデータレジスタ5(PDR5)
アドレス:H'FFDB<br /></strong>汎用出力ポートの出力値を格納します.このレジスタを設定することで,Port8の端子の状態を決定することが出来ます.<br />
PCR5と同様に,各ビットごとにそれぞれの端子と対応関係にあります.<br />
PDR5の設定による端子状態の変化は次のとおりです.<br />
0: Low状態出力<br />
1: High状態出力<br />
CMOSです.<br />
なお,入力設定のときに,PDR5を読み込みますと,端子の状態を知ることが出来ます.<br />
(CMOSの基準で【High】か【Low】かを)<br />
また,PCR5とは違い,各ビットが定義されており,BYTE単位のアクセスか,Bit単位のアクセスかを選択できます.<br />
ただし,Bitアクセスといっても結局BYTEアクセスを用いたBitアクセスなので,実行速度はあまり変わりません.</p>
<p> </p>
<p> 課題プログラムの①:『LEDを一個置きに点灯させよ』</p>
<p> 練習用のプログラムでは、参考のプログラムをもとに、マイコンの機能を使う課題のプログラムを組みます。</p>
<p>これらの練習用プログラムは,サークル内で使っている練習用基板の回路を動かし,そのなかでプログラムを習得しようというものです.<br />
なお,開発環境にはBestTechnology製のGCC Developer Lite(以下GDL)を用いています.</p>
<h5> 参考プログラム① 『LED全点灯』</h5>
<pre>
#include <3694.h>
int main(void){
IO.PCR5 = 0xff; //Port5をすべて出力に設定.
while(1){ //無限ループさせる.
IO.PDR5.BYTE = 0x00; //Port5すべての端子状態を【Low】に設定.
}
return 0;
}
</pre>
<h5> ・プログラムの解説</h5>
<p>マイコンのプログラムは,通常のC言語と違い,main()関数から始まらなければならないという規則はありません.<br />
ですが,今回のプログラムにおいて,main()関数でプログラムを始めているのは,GDL標準のスタートアップルーチン上に,<br />
main()関数を呼び出すことが定義されているためです.<br />
それにより,通常のC言語と同様にmain()関数から違和感なくプログラムを組むことが可能になっています.<br />
また,スタートアップルーチンとは,具体的な動作を始める前に,マイコンの準備などを行うために作られるモジュールです.<br />
GDLでは,標準の場合はリンカスクリプトでベクタテーブルを設定しており,起動後にスタートアップルーチンに記述された<br />
_start:<br />
ルーチンを呼び出すように定義されているようです.<br />
興味のある人は"h8crt0.s"(スタートアップルーチン)や,"h8rom.x"(リンカスクリプト)を見てみるといいかと思います.<br /><br />
さて,プログラムの中身を見ていきます.<br />
まずは,第一行目です.</p>
<pre>
#include <3694.h>
</pre>
<p>GDLが用意しているターゲットファイルの中にある,3694.hというヘッダファイルを読み込みます.<br />
このヘッダファイルには,マイコンを操作する上で欠かせない様々なレジスタ情報などが定義されています.</p>
<p>次に,main()関数の中身を見ていきます.<br />
今回のプログラムの目的は,Port5につないであるLEDをすべて点灯させることです.<br />
回路図をみれば分かりますように,Port5の各端子が5Vよりも低電位になれば電流が流れます.(実際はもっと低くないといけませんが)<br />
H8/3694では,Port5の各端子の状態をそれぞれ,5V付近である【High】と0V付近である【Low】状態に設定することが出来ます.<br />
また,Port5は汎用入出力ポートであり(ここではTMWの話はおいておきます),「入力」と「出力」の機能を選択することが出来ます.<br />
LEDを光らせたりするために,端子の状態をプログラム上で変更するには,出力状態にする必要があるので,まずはその機能の選択をします.<br />
Port5の入出力の機能を選択は,ポートコントロールレジスタ5(PCR5)を設定することで出来ます.そこで,次の一行を加えます.</p>
<pre>
IO.PCR5 = 0xff;
</pre>
<p>これで,Port5の端子はすべて出力ポートに設定されます.<br />
次のPDR5とも併せて,それらのレジスタについての説明は後述します.</p>
<p>さて,これでLEDを光らせるための下準備は終わりです.<br />
後は,Port5の端子状態を【Low】に設定すれば,LEDを通ってH8に電流が流れ込み,LEDが点灯します.<br />
端子状態は,ポートデータレジスタ5(PDR)を設定することで決定されます.</p>
<pre>
IO.PDR5.BYTE = 0x00;
</pre>
<p> これにより,Port5のすべての端子が【Low】状態になり,LEDが点灯するはずです.</p>
<p>なお,今回はPDR5への書き込みを無限ループさせていますが,実際は一度設定してmain()関数を抜けてしまっても,<br />
スタートアップルーチン内の無限ループで拾ってもらえます.<br />
しかしながら,スタートアップルーチンも抜けて,本来プログラムが書き込まれていないはずの領域までプログラムコードとして読みに<br />
いきますと,バグなどの原因になりかねませんので,極力自分の分かるところで終わらせるようにしましょう.<br />
(スタートアップルーチンを書き換えない限り,あり得ないことだと思いますが.)</p>
<h5>・レジスタの解説</h5>
<p><strong>ポートコントロールレジスタ5(PCR5) アドレス:H'FFEB</strong><br />
汎用入出力ポートとして使用する端子の入出力の機能を各ビットごとに定義します.<br />
PCR5の0ビットから7ビットまで,それぞれがPort5の端子である,P50からP57に対応します.<br />
PCR5の設定(各ビット0か1)による端子の機能は次のようになります.<br />
0: 入力ポート<br />
1: 出力ポート<br />
なお,GDL標準の定義ファイル(3694.h)では,BYTE単位でのアクセスしか定義されていません.</p>
<p><strong>ポートデータレジスタ5(PDR5)
アドレス:H'FFDB<br /></strong>汎用出力ポートの出力値を格納します.このレジスタを設定することで,Port8の端子の状態を決定することが出来ます.<br />
PCR5と同様に,各ビットごとにそれぞれの端子と対応関係にあります.<br />
PDR5の設定による端子状態の変化は次のとおりです.<br />
0: Low状態出力<br />
1: High状態出力<br />
CMOSです.<br />
なお,入力設定のときに,PDR5を読み込みますと,端子の状態を知ることが出来ます.<br />
(CMOSの基準で【High】か【Low】かを)<br />
また,PCR5とは違い,各ビットが定義されており,BYTE単位のアクセスか,Bit単位のアクセスかを選択できます.<br />
ただし,Bitアクセスといっても結局BYTEアクセスを用いたBitアクセスなので,実行速度はあまり変わりません.</p>
<p> </p>
<p> 課題プログラムの①:『LEDを一個置きに点灯させよ』</p>