職業訓練42日目 H8マイコン入門(アセンブラ言語による実習)
LEDの制御
LEDの点灯
早速、使用したソースコードから。
.CPU 300HA ; CPUの指定(アドレス空間は24ビット) .SECTION PROG1, CODE, LOCATE=H'000000 ; メモリの0番地から書き込むコードで、PROG1というセクション名 P1DR .EQU H'FFFFC2 ; ポート1のDRアドレスをP1DRというシンボルに設定 P1DDR .EQU H'FFFFC0 ; ポート1のDDRアドレスをP1DDRというシンボルに設定 .SECTION ROM, CODE, LOCATE=H'000100 ; メモリの100番地から書き込むコードで、ROMというセクション名 MOV.L #H'FFFF00, ER7 ; SP(スタックポインタ)にRAMのアドレスを設定 MOV.B #H'FF, R0L ; 出力用設定データを汎用レジスタに書き込む MOV.B R0L, @P1DDR ; ポート1を出力用に設定する MOV.B #B'10101100, R0L ; LED点灯データを汎用レジスタに書き込む MOV.B R0L, @P1DR ; ポート1へ点灯データを出力する LOOP: JMP @LOOP ; 待機 .END ; プログラム終了
「MOV」や「JMP」は読んで字の如しなので、説明は割愛。
ちょっと面倒だなと思ったのが、データを汎用レジスタ経由じゃないと書き込めないところ。
回路的に直接つながっていないので仕方がないけど…。
実際にやってみて「?」となったのは、「ポート」の概念。
そういえば、H8のアーキテクチャのとき、ポートについてやってなかった気がする。
ポート
ポートの概要
H8/3048Fには、以下のポートが存在する。
- 入出力ポート×10個(ポート1〜6、8、9、A、B)
- 入力専用ポート×1個(ポート7)
→ポート2、4、5では、入力用のプルアップ抵抗の働きをさせることが可能
ポートの使い方
各ポートは、データディレクションレジスタ(DDR)とデータレジスタ(DR)から構成される。
どちらも8ビットのレジスタで、内部I/Oレジスタに割り当てられている。
プルアップ機能の設定は、ポートプルアップMOSコントロールレジスタ(PCR)で行う。
ポートの各ビットを入力用か出力用のどちらで使用するかを指定する。
"0"でクリアしたビット→入力用の端子
"1"をセットしたビット→出力用の端子
書き込み専用のレジスタのため、ビット操作命令を使用するとエラーになることがある。
- DR
ポートへデータを入出力するためのレジスタ。
入力設定のポートのビット→そのビットの値("0"か"1")がDRの対応するビットに入力される
出力設定のポートのビット→DRの対応するビットの値("0"か"1")が出力される
"0"でクリアしたビット→プルアップ無効(初期値は"0")
"1"をセットしたビット→プルアップ有効
各ポートの割り当ては、前回も紹介したコチラを参照。
http://www.takamisawa.org/gcc/3048F.html
LEDの点灯
ポートの説明が終わったところで、再びLEDに戻ります。
上記のコードだと、データ"0"でLEDが点灯するので、
データを反転して出力してみる。
.CPU 300HA .SECTION PROG2, CODE, LOCATE=H'000000 P1DR .EQU H'FFFFC2 P1DDR .EQU H'FFFFC0 .SECTION ROM, CODE, LOCATE=H'000100 MOV.L #H'FFFF00, ER7 MOV.B #H'FF, R0L MOV.B R0L, @P1DDR MOV.B #B'10101100, R0L NOT.B R0L ; ここでデータを反転! MOV.B R0L, @P1DR LOOP: JMP @LOOP .END
スイッチ入力
使用しているマイコンのマザーボードには、8ビットのDIPスイッチが付いていて、
ポート2のP20〜P27に接続されている。
スイッチで設定した通りにLEDを点灯させるプログラム。
.CPU 300HA .SECTION PROG3, CODE, LOCATE=H'000000 ; 各ポートのアドレスにシンボルを設定 P1DR .EQU H'FFFFC2 P1DDR .EQU H'FFFFC0 P2DR .EQU H'FFFFC3 P2DDR .EQU H'FFFFC1 P2PCR .EQU H'FFFFD8 .SECTION ROM, CODE, LOCATE=H'000100 MOV.L #H'FFFF00, ER7 ; SPの設定 MOV.B #H'FF, R0L MOV.B R0L, @P1DDR ; ポート1を出力に設定 MOV.B #H'00, R0H MOV.B R0H, @P2DDR ; ポート2を入力に設定 MOV.B R0L, @P2PCR ; ポート2のプルアップを有効にする LOOP: MOV.B @P2DR, R0L ; ポート2からスイッチデータを入力 MOV.B R0L, @P1DR ; ポート1へ点灯データを出力 JMP @LOOP ; ラベル「LOOP」まで繰り返し .END