職業訓練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スイッチを上げたり下げたりすると、テスタの値が変化するのが観測できるはず。