;ADLED.SRC (c)yas@E-SYS Lab.
;************************************************
;* AD変換値をLEDに表示するプログラム *
;************************************************
;------CPUの指定---------
.CPU 300HA ;CPUの指定
;---------シンボルの定義----------
;A/D変換値を行います.
;H8ではA/D変換値は10bitで出てきますが,
;今回はその上位8bitをLEDに表示します.
;表示用にはプログラミング1回目に使った8連LEDを使用します.
;それに伴ってポートBを使用します.
;また,A/D変換値を一時的に記憶しておくRAM領域を設けて名前をつけています.
;下の方の4行はA/D変換に必要な部分です.
PBDR .EQU H'FFFFD6 ;ポートBデータレジスタ
AD_BIN .EQU H'FFEF10 ;A/D変換した2進数値結果を格納するRAM領域
ADCSR .EQU H'FFFFE8 ;A/Dコントロール/ステータスレジスタの番地
ADST .BEQU 5,ADCSR ;ADCSRのbit5,変換開始/停止を選択
ADF .BEQU 7,ADCSR ;ADCSRのbit7,変換終了を示すフラグ
ADDRAH .EQU H'FFFFE0 ;A/D変換結果を入れる上位8bitレジスタの番地
ADDRAL .EQU H'FFFFE1 ;A/D変換結果を入れる下位8bitレジスタの番地
.SECTION ROM,CODE,LOCATE=H'000100 ;コードセクション宣言
;---------初期設定------------
;ポートBを出力に設定しています.
;A/D変換については今回はここでは特に設定していません.
INIT: MOV.L #H'FFF10,ER7 ;スタックポインタの設定
MOV.B #H'FF,R0L ;ポートBを出力に設定するため
MOV.B R0L,@H'FFFFD4 ;ポートBデータディレクションレジスタにH'FFを書き込む
;-----MAINルーチン--------
;メイン部分の流れを説明します.
; 1:A/D変換を行う.
; 2:AD_BINに格納されたA/D変換値上位8bitをLEDに出力する.
; 3:1へ飛ぶ.(繰り返す)
;
START: JSR @AD ;AD(サブルーチン)にジャンプします
MOV.W @AD_BIN,R0 ;R0にAD_BINをいれます
MOV.B R0H,@PBDR ;PBDRにR0Hをいれます
BRA START ;STARTにジャンプします
;------サブルーチン------------
;A/D変換を行い結果をAD_BINへと入れるサブルーチンです.
;分解能は10bitですが,結果は16bit左詰めで出てくるので注意が必要です.
;通常は6bit分右にずらして右詰めにします.
;今回は値の大きい側8bitを使用するのでこのまま進めます.
;
;では,具体的な説明.
;ADST(A/Dスタート)をON(1を書き込む)にすると設定したとおりにA/D変換を開始します.
;今回は特に設定していないのでデフォルトの単一モードCH0のみのA/D変換を開始します.
;A/D変換が終了したらADF(A/Dフラグ)が1となり終了を知らせます.
;これを使って,A/D変換が終了するまで待ちます.
;今回はCH0でのA/Dなので変換値は上位8bitがADDRAHに,下位8bitがADDRAL入っています.
;これをRAM領域へとコピーしています.
;A/Dチャンネルとレジスタ(ADDR*)の関係は別表を参照してください.
;これらの操作が終わったらADFをクリアして割り込み動作等の禁止を解除します.
;
AD: JSR @TIME00 ;WAIT
BSET ADST ;ADSTに「1」をビットセット,A/D変換を開始
ADEND: BTST ADF ;ADFの状態をチェック,A/D変換が終了したか?
BEQ ADEND ;ADFが「1」なら変換終了,「0」ならADENDにジャンプ
MOV.L #0,ER1 ;変換結果を入れるレジスタER1をクリア
MOV.B @ADDRAH,R1H ;変換後のデータ上位8bitをR1の上位へ
MOV.B @ADDRAL,R1L ;変換後のデータ下位2bitをR1の下位へ
BCLR ADF ;ADFを「0」にビットクリア,変換終了フラグをクリア
MOV.W R1,@AD_BIN ;AD_BINにA/D変換値を入れる
RTS ;元のルーチンに戻る
;-----タイマ(WAIT)サブルーチン--------
TIME00: MOV.W #H'FFFF,R0
TIME01: SUB.W #1,R0 ;R0にH' FFFFを書き込みH'1ずつ減算
BNE TIME01 ;ゼロになるまでTIME01を繰り返す
RTS ;元のルーチンに戻る
.END
|