職業訓練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