職業訓練45日目 H8マイコン入門(アセンブラ言語による実習)

A-D, D-Aコンバータの制御

A-Dコンバータ

アナログデータをデジタルデータに変換する装置。

  • 分解能:10ビット
  • 方式:逐次変換方式
  • チャネル数:8
  • 変換を行うアナログ電圧の範囲:0〜5V
  • 最大4入力の変換結果を16ビットのA-Dデータレジスタ4個に保持可能。

複数の入力を扱う場合、入力端子を切り替えながら順次変換を行う。

  • 単一モード:1チャネルのみを扱う
  • スキャンモード:指定した最大4チャネルを扱う

変換の実行→A-Dコントロール/ステータスレジスタのADST(ビット5)を"1"にセット
変換の終了→A-Dコントロール/ステータスレジスタのADF(ビット7)が"1"にセットされる

分解能が10ビットで、0〜5Vの電圧を入力した場合
5V / 2^10 = 5 / 1024 = 0.00488...V ≒ 4.88mV
→アナログ電圧がおよそ4.88mV変化するごとに、デジタルデータが"1"変化する

実習で製作した回路は、
5V電源→10kΩの可変抵抗→チャネル0のAN0端子に入力
ポート1のLED0〜7に変換結果を出力
といった感じ。

では、A-Dコンバータを利用したプログラムを。

	.CPU 300HA
	.SECTION PROG11, CODE, LOCATE=H'000000

ADCSR	.EQU	H'FFFFE8		; ADコントロール/ステータスレジスタ
ADDRA	.EQU	H'FFFFE0		; ADデータレジスタ
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		; ポート1を出力に設定

	MOV.B	#H'00, R0H		; 単一モード、チャネル選択(AN0)データ
	MOV.B	R0H, @ADCSR		; ADCSR設定
LOOP:	BSET	#5, @ADCSR		; AD変換スタート
L1:	BTST	#7, @ADCSR		; 変換終了チェック
	BEQ	L1
	MOV.B	@ADDRA, R1L		; 変換結果の取り出し
	NOT.B	R1L			; "1"で点灯するように反転
	MOV.B	R1L, @P1DR
	BCLR	#7, @ADCSR		; AD変換終了フラグのリセット

	JMP	@LOOP

	.END

上記のプログラムを実行すると、
可変抵抗をクルクル回すと、LEDがチカチカするはず。
アナログの量(電圧)が、デジタル(LED)に変換されているわけですね。

D-Aコンバータ

デジタルデータをアナログデータに変換する装置。

  • 分解能:8ビット
  • チャネル数:2

分解能が8ビットで、0〜5Vの電圧を出力する場合
5V / 2^8 = 5 / 256 = 0.0195...V ≒ 19.5mV
→デジタルデータが"1"変化するごとに、アナログ電圧がおよそ19.5mV変化する

製作した回路は、
ポート2のDIPスイッチ8ビットを入力、
ポート1のLED8ビットにデジタルデータを出力、
ポート7にテスタを接続し、アナログデータを測定しました。

では、プログラムはこちら。

	.CPU 300HA
	.SECTION PROG12, CODE, LOCATE=H'000000

DACR	.EQU	H'FFFFDE		; DAコントロールレジスタ
DADR0	.EQU	H'FFFFDC		; DAデータレジスタ
P1DR	.EQU	H'FFFFC2
P1DDR	.EQU	H'FFFFC0
P2DR	.EQU	H'FFFFC1
P2DDR	.EQU	H'FFFFC3
P2PCR	.EQU	H'FFFFD8

	.SECTION ROM, CODE, LOCATE=H'000100	

	MOV.L	#H'FFFF00, ER7

	MOV.B	#H'00, R0L
	MOV.B	#H'FF, R0H
	MOV.B	R0H, @P1DDR
	MOV.B	R0L, @P2DDR
	MOV.B	R0H, @P2PCR		; ポート2のプルアップ有効

LOOP:	MOV.B	@P2DR, R1L		; ポート2からデータ入力
	MOV.B	R1L, @P1DR
	NOT.B	R1L
	MOV.B	R1L, @DADR0		; DAデータレジスタに転送

	MOV.B	#H'40, R1H		; DA変換設定データ
	MOV.B	R1H, @DACR		; DA変換スタート

	JMP	@LOOP

	.END

DIPスイッチを上げたり下げたりすると、テスタの値が変化するのが観測できるはず。