モニタプログラムの動作確認(LED編)
ここでは,モニタープログラムの動作確認を兼ねて,C言語でプログラムを作成せずに,モニタープログラムの簡単なコマンドを使い,ハードウェア資源への直接アクセスを体験してみる.
すでに解説したようにMEMEsのSH7085内蔵FlashROMにはモニタープログラムが書き込まれている.電源投入で実行を開始し,初期設定を行い,シリアル通信経由でコマンド待ち状態で待機している.
以降,モニタプログラム経由でハードウェアを直接アクセスするための予備知識や,手順を説明する.
LED点灯
最初にMEMEs上のLEDをモニタープログラムからの手動操作で,点灯/消灯させてみることとする.図1のようにボード右側にあるLED5,6を使用する.
図1:ボード上のLEDの位置
ハードウェア的には図2のようになる.
図2:LED回路の概略図
基板上のLED5はSH7085のPE9に,LED6はPE11に接続されている.LEDのもう片側は抵抗を通して電源に接続されている.この抵抗はLEDに電流が流れすぎるのを防ぐための抵抗である.
LEDを点灯するには,LEDに電流が流れればよい→LEDの両端に電位差があれば電流は流れる→片側が電源(3.3[V])なのだから,もう片側は0[V]にすればよい.
と考えると,PE9またはPE11が0[V]になればLEDが点灯するはずである.
逆にLEDを消灯するには,LEDに電流が流れない→LEDの両端に電位差がない→片側が電源(3.3[V])なので,もう片側も3.3[V]にすればよい.
となり,PE9またはPE11 が3.3[V]になればLEDが消灯する.
ここでは理解しやすくするために,具体的な電圧として0[V]や3.3[V]を用いて解説したが,SH7085はディジタル回路であるので(A/DやD/Aコンバータ等を使わない限り)0[V]か3.3[V]のどちらかの電圧レベルで動作している.今後は0[V]を論理0またはLレベル,3.3[V]を論理1またはHレベルとして説明をすることとする.
また,“SH7080グループ ハードウェアマニュアル”を参照しながら作業を進めることを推奨する.
SH7085の設定
点灯させるための方法を理解したところで,次にSH7085の設定を説明する.SH7085のPE9端子(139番ピン)の内部を簡単にしたものが図3である.
図3:ポート9のレジスタの構造
PE9のように,単純にH/Lの入出力を行う機能を“汎用I/Oポート”と呼ぶ.PE9端子には他の機能もあるのだが,いまの段階では無視することにする.
図3中の三角は,バッファと呼ばれるもので,一方通行の信号伝達素子である.三角の下の線が出ているところは,伝達素子のスイッチと考えてよい.○付きのスイッチは0入力でON,○なしのスイッチは1入力でONする.
図4−1は,PE9を出力に設定した例である.PEIORLレジスタのビット9に1を格納すると,図4−1のように,上のバッファが動作し,下のバッファは動作しない.そのため,PE9は出力用端子として使用でき,PEDRLレジスタのビット9に代入された値をHighまたはLowレベルの信号として出力することとなる.
図4−1:PE9を出力端子に設定した例
図4−2は,PE9を入力端子として設定した例である.PEIORLレジスタのビット9に0を格納すると,上のバッファは動作せず,下のバッファが動作することとなる.このとき,PE9端子に接続されている回路からのHighまたはLowの情報を0または1として,PEDRLのビット9に格納する.ユーザは,PEDRLのビット9を読み出すことでPE9端子の状態を確認することができるのである.
図4−2:PE9を入力端子に設定した例
PEIORLレジスタの設定
汎用I/Oポートは入出力の向きを指定する必要がある.SH7085の場合は,電源投入後の初期値として,たいていは入力になっている.
今回はHまたはLレベルを“出力”したいので,信号の向きが出力になるように設定を行う.SH7085でPE9やPE11の入出力を決めるのはPEIORLレジスタである.PEIORLレジスタはSH7085のメモリ空間に存在し,実際のアドレスは0xffffd306番地である.
このレジスタ16bitで,PE0~PE15の向きを指定できる.該当するビットを0にすると入力に,1にすると出力になる.PE9はレジスタのbit9で,PE11はbit11で設定する.
以上からPEIORLのbit9とbit11を1にすれば良いことがわかる.では二進数で”00001010_00000000”を書き込めばよいかというと,それでは関係のないビットを変化させてしまうことになる.他のビットを変化させてしまうことにより,思わぬ動作を引き起こしたりしないように気を付けなければならない.
従って,安全に行うために
- PEIORLを読み出す
- 00001010_00000000と論理和演算し,bit9とbit11だけを1に変更する
- PEIORLに書き込む
という手順をとることとする.
PEIORLを読み出す
PEIORLの読み出しには,モニタのDコマンドを用いる.Hterm上で図5のように,
”d [スペース] ffffd300[スペース] ffffd30f;w [ENTER]”
と入力すると fffd300 番地付近の値が16進表示される.
論理和演算を行う
ターゲットのビットだけを1に変更するために,論理和演算を行う.
図6の赤で囲まれたビットは,変更されず,1となっているビットだけが結果として1となる.これを論理マスクなどと呼ぶ.この場合は,ターゲットのビットを1にしているが,0にする場合のマスクもある.それについては今後登場するのでそのときに説明する.
0000 0111 0100 1111 (0x074f) OR 0000 1010 0000 0000 (0x0a00) -------------------------- 0000 1111 0100 1111 (0x0f4f)
PEIORLに書き込む
PEIORLへの書き込みはMコマンドを使用する.図7のようにHterm上で
”m[スペース]ffffd306;w[ENTER]”
と入力すると新しい値の入力待ちになる.ここで計算した値 0x0f4f を入力する(”0x”は不要).続けて次の番地のデータ入力待ちになるので,ここは“.”(ピリオド)を入力して終了する.
念のため再びDコマンドを発行して正しく変更されているか確認をしてみる.
図7:mコマンドの実行と確認
以上でPEIORレジスタの変更は完了である.
PEDRLレジスタの設定
ここまでの手順でPE9とPE11端子は,汎用I/Oの出力モードになっている.次は端子に出力する信号レベルを手動操作する.
PE9やPE11端子に出力する信号レベルを決めたり,入力として使用する場合に外部からの信号レベルを取得するときに用いられるのがPEDRLレジスタである.PEIORLレジスタと同様にSH7085のメモリ空間上に置かれていて,アドレスは0xffffd302番地である.
このレジスタは16bitであり,PE0~PE15端子に対応する.PE9はbit9に,PE11はbit11に割り当てられる.
このビットを0とするとLEDが点灯し,1とすれば消灯する.
PEIORLレジスタを操作した時と同様に,関係のないビットは変更しないように注意が必要である.よって,0にしたいときは論理積(AND)演算を用い,1にしたいときは論理和(OR)演算を行う必要がある.
たとえばbit9とbit11を同時に0にしたい場合は次のようにする.
1111 0010 1111 0000 (0xf2f0) AND 1111 0101 1111 1111 (0xf5ff) ------------------------- 1111 0000 1111 0000 (0xf0f0)
以上の手順の実行例を下に示す.
図9:mコマンドの実行とメモリ内の確認
実際にMEMEsのLED5とLED6が点灯することを確認する.
応用として,LED5だけ点灯やLED6だけ点灯などを,自身で論理演算をして正しく操作できることを確認する.