本章ではビュートローバーに搭載されたLEDを制御するために必要となる入出力(I/O)ポート機能を解説します。
マイコンにおける入出力ポート機能はもっとも基本的なハードウェア機能です。まずは、入出力ポートの使い方からレジスタをプログラムから扱う感覚を覚えていきましょう。
入出力ポートの役割と使い方
皆さんの目の前にあるビュートローバーの基盤を見てみてください。真ん中に正方形の黒色のICが搭載されていますね。これこそがH8/36064マイコンです。マイコンの周辺から銀色の線がたくさん出ていますが、これをピンと呼びます。このピンの先にLEDやスイッチといった周辺機器がつながっているのです。
周辺機器がつながったピンは入出力ポート(I/Oポート)と呼ばれるマイコン機能につながっています。ポートとはマイコンと周辺機器が接続されている端子のことです。
マイコンからLEDを点灯/消灯させたければ、プログラムからポート制御というものを行うことで実現することができます。ポート制御は組み込み開発者が最初に覚えるべきハードウェア制御テクニックになります。
高機能マイコンではI/OポートのことをGPIO(General Purpose Input/Output:汎用入出力)と呼ぶが、機能はI/Oポートと同じものである!
入出力ポートと回路図・ブロック図の関係性
基盤にはマイコンとLED、スイッチ、モーターなど様々な周辺機器がつながっています。
マイコンからこれらの周辺機器を制御するためには、マイコンのどこに何がつながっているかを知る必要があります。この接続を確認するためには基盤の回路図が必要となります。
回路図は対象製品のハードウェア開発担当の方が周辺機器をマイコンのどのピンにつなげるのかを検討して作ります。皆さんに回路図を読み解く力があればどのようなプログラムで周辺機器を制御できるかを理解することが可能です。
では、回路図のPDFファイルを見てみましょう。中心に描かれた四角形がH8/36064マイコンですね。下左図はオレンジLEDであるLED1の部分のみを抜粋した回路図になります。
ソフト開発者が周辺機器を制御するために必要な情報はポート番号と呼ばれるマイコンとの接続情報です。回路図を簡略化したブロック図を用意しておくと開発が行いやすくなります。
入出力ポートレジスタとポート番号の関係性
プログラムから周辺機器を制御するうえでポート番号というものが鍵となります。
オレンジ色のLED1が接続されたポート番号は「P60」ですね。この「P60」が何かを知るために再度H8のデータシートを参照しましょう。
「P60」というキーワードは「9.5章 ポート6」に登場します。次の図が描かれていますね。一番下に「P60」が記載されているのがわかります。
ポート6はマイコンと外部のピンとの接続口であり全部で8本のポートを管理しています。「P60」とはポート6の0番端子であることを示した番号なのです。
例えば「P74」のポート番号であった場合はポート7の4番端子ということになります。
周辺機器を制御するためには必ずポート番号が必要となります。しっかりと理解しましょう。
ポートの端子番号はビット番号と同じで0番から始まることに注意!
入出力ポート6のレジスタ構成
ハードウェアの各機能にはそれぞれ制御用のレジスタが割り当てられています。
I/Oポート6にもレジスタが割りついているということです。どのようなレジスタが存在するかをデータシートを見て確認してみましょう。
データシート「9.5章 ポート6」を見ると次のレジスタがあると書いてあるのがわかります。
- ポートコントロールレジスタ6(PCR6)
- ポートデータレジスタ6(PDR6)
この2つのレジスタはI/Oポート制御の代表的なレジスタです。H8マイコンに限らず多くのマイコンにおいても同様のレジスタがI/Oポートには用意されています。それでは各レジスタの役割を順にみていきましょう。
ポートコントロールレジスタ6(PCR6)
最初に抑えるべきレジスタはポートコントロールレジスタです。まずはデータシートの解説をしっかりと確認することから始めます。「9.5.1章 ポートコントロールレジスタ6(PCR6)」を見てみましょう。
このレジスタ仕様を見ることで次のことを読み解くことができます。
- 1Byte(8ビット)で構成されている
- 各ビットが8本のポートと1対1で対応している
- 書き込みしかできない
- 各ビットに対して0の時は入力ポート、1の時は出力ポートになる
- システム起動直後の初期値は全てが入力ポートの設定である
8本の各ポートは必ず入力ポートか出力ポートのどちらかのモードを選択する必要があります。では、入力ポートと出力ポートとは何なのかを説明しましょう。
入力ポートの役割とは
入力ポートに設定した場合、プログラムから対象のポートに掛かる外部電圧の状態を読み取ることができるモードになります。電圧が高いか低いかのどちらかを調べることができます。入力ポートに接続される代表的な周辺機器はスイッチです。
出力ポートの役割とは
出力ポートに設定した場合、プログラムから対象のポートの外部電圧を上げ下げすることができます。電圧を上げ下げすることで、接続された周辺機器を操ることができます。出力ポートに接続される代表的な周辺機器はLEDです。
ポートコントロールレジスタの入力/出力の設定値の決め方について
ポートにはLEDやスイッチといった周辺機器が接続されています。これらの周辺機器に応じてポートコントロールレジスタの入力と出力を決定します。周辺機器は大きく入力デバイスと出力デバイスの分類に分けることができます。
入力ポートに設定するか出力ポートに設定するかはポートに接続される周辺機器が入力系か出力系かにより決定します。本例以外のデバイスももちろん世の中にはたくさんありますが、どちらに所属しそうか想像できますよね。
マイコンの中で皆さんが作成したプログラムが動作します。例えば、スイッチが押されたことをプログラムで検知して、モーターに回す指示を与えるといった動きがポートを使った代表的な周辺機器の制御になります。
ポートコントロールレジスタはあくまでも入力と出力の制御方向を決定する役割のみのレジスタであることに注意!
ポートデータレジスタ6(PDR6)
ポートコントロールレジスタにより決められた入出力方向に従い、具体的な周辺機器の制御を行うのがポートデータレジスタになります。
データシートから「9.5.2章 ポートデータレジスタ6(PDR6)」の仕様を見てみましょう。
レジスタの特徴は次の通りです。
- 1Byte(8ビット)で構成されている
- 各ビットが8本のポートと1対1で対応している
- 読み書き両方ができる
- 対応するPCR6の入力/出力設定により意味合いが変化する
- システム起動直後の初期値は全てが0の設定である
ポイントはPCR6の設定値に連動して扱い方が変化することです。
ポートコントロールレジスタが入力設定の時のポートデータレジスタ制御
PCRが入力設定の場合はPDRは読み取り制御になります。
PDRのビット値を見ることで対象ポートに掛かる外部電圧がHigeかLowかを調べることができます。スイッチが周辺機器で接続されていた場合はスイッチを押す・押さないで外部電圧が変化するようにハードウェアを構成します。
これにより電圧状態をプログラムから読み取ることでスイッチが押されたか、離されているかを調べることができるのです。
ポートコントロールレジスタが出力設定の時のポートデータレジスタ制御
PCRが出力設定の場合はPDRは書き込み制御になります。
PDRのビット値に1を書き込むことで対象ポートに掛かる外部電圧をHigeに0を書き込むことで電圧をLowにすることができます。
LEDが周辺機器で接続されていた場合は電圧を上げ下げすることでLEDを点灯/消灯することができます。
ポートコントロールレジスタとポートデータレジスタの関係性のまとめ
この2つのレジスタを最後にまとめておきましょう。ソフトウェア・レジスタ・ハードウェアは次のように連動しています。
※注意:上図はレジスタ解説用のイメージ図でありビュートローバーにおけるLEDやスイッチの接続ポート番号は異なります。
このようにソフトウェアとハードウェアの境界線上にレジスタは存在します。ソフトウェアからハードウェアを制御するとはレジスタを通して対話をするということなのです。
Q&A:入出力ポートのレジスタに関するよくある質問
はい、アクセスできません。iodefine.hの定義においてPDR6とPCR6の定義内容が大きく違うことを再度確認してください。PCR6はただの「unsigned char PCR6;」として定義されていることがわかります。そのため、ビットフィールドを利用したアクセスはできません。
では、なぜPCR6はビットフィールドとして定義されていないのか?これがこの質問の本質です。PCR6にはPDR6にはないレジスタ制約が存在します。
レジスタの仕様を見ると書き込み専用のレジスタであることがわかります。これこそがビットフィールドが使用できない理由です。ビットフィールドが使用できるPDR6を例に説明しましょう。
IO.PDR6.BIT.B0 = 1;
このビットフィールドによる代入処理とは、次のビット演算のOR演算と同じ処理となります。
IO.PDR6.BYTE = IO.PDR6.BYTE | 0x01;
つまり、ビットフィールドとはビット演算のOR演算やAND演算を簡略化した記法なのです。ビット演算の処理を見ると右辺にIO.PDR6.BYTEが登場していますが、これは読み取りを行ったということを示します。つまり、読み取りができないPCR6ではビットフィールドがそもそも使えないのです。
レジスタは読み書き以外にも様々な制約があります。組み込み開発者はレジスタのマニュアルを細かくチェックし、制約の範囲内でプログラムを作る必要があります。そのためデータシートをしっかり読むことができることは組み込み開発者の技術力の高さを表すのです。
データシートのページ数は非常に多いですね。それだけ多くの機能をマイコンというものは持っているということです。データシートというものを初めて見た人は質問のように不安を感じる方が多いのですが、データシートを全て読むことなど私にもできませんので安心してください。
データシートは間違っても1ページ目から最後まで読もうなどと思ってはなりません。データシートを読むコツは自分が制御したい機能から目を通すことです。例えば本章においては「IOポート機能」になりますね。さらにその中でも「ポート6」の機能がオレンジLEDに関わる機能なわけです。
そのためデータシートは「9章 IOポート」と「9.5章 ポート6」を読み込みます。最初はこのように小さな単位でドキュメントを読み解いていきます。読み解く中で他に関連する章が出てきたら、そちらを読みます。
このようにして少しずつでもよいのでマイコンに関する機能を自分の中に蓄積していくのです。これを繰り返すことでマニュアルの構成が把握でき読み方が自然と身についていきます。