*参考 98とpc/at互換機用のプログラム比較
pc9821用プログラム | pc/at互換機用プログラム |
procedure tform1.button10click(sender: tobject); var roop:integer; xmaxint:integer; dxasm: word; begin asm {assemblerの開始} mov al,$e {クロックl} out $46,al mov al,$f2 {poweron6〜9とcsをh} out $40,al end; {assemblerの終わり xmaxint:=strtoint(form1.edit22.text); for roop:=1 to xmaxint do begin ch1bwr; data[roop]:=dxasm; end; end; {pc9821 1回データを読み込むサブルーチン} procedure ch1bwr; {ch1から入力} begin asm {assemblerの開始} mov al,$f1 {241=240(poweron pin6〜9) out $40,al +1(チップセレクトリセットcsをl) スタートコンバート1} mov al,$f {clock} out $46,al mov al,$e out $46,al { alレジスタと入出力ポートの間でデータの入出力, ポートの指定イミディエート値は8ビット(0〜255,hff) データで示すポート番号} *入出力で使用できる mov al,$f1 {241=240(poweron pin6〜9) out $40,al +1(標準1)} mov al,$f {clock} out $46,al mov al,$e out $46,al mov al,$f1 {$f1 240+1 1 チャネル選択} out $40,al {$f0 240+0 0 チャネル選択} {240(poweron pin6〜9)} mov al,$f {clock} out $46,al mov al,$e out $46,al mov al,$f1 {241=240(poweron pin6〜9) out $40,al +1ステータスデータ1} mov al,$f {clock} out $46,al mov al,$e out $46,al xor dx,dx {dx=0} mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b7 read 11pin busy信号} and al,$4 {2bit,high;0 al=0,low;22 al=1} sub al,$1{high0-1=0 cf=1,low1-1=0 cf=0} adc dx,dx {dx=dx+dx+cf highの時キャリーフラグ cf=1} mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b6 read} and al,$4 sub al,$1 adc dx,dx mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b5 read} and al,$4 sub al,$1 adc dx,dx mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b4 read} and al,$4 sub al,$1 adc dx,dx mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b3 read} and al,$4 sub al,$1 adc dx,dx mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b2 read} and al,$4 sub al,$1 adc dx,dx mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b1 read} and al,$4 sub al,$1 adc dx,dx mov al,$f {clock} out $46,al mov al,$e out $46,al in al,$42 {b0 read} and al,$4 sub al,$1 adc dx,dx mov al,$f {clock} out $46,al mov al,$e out $46,al mov dxasm,dx {dxasmにdata 格納} xor al,al {al=0} mov al,$f2 {240+2;poweron6〜9とcsをh} out $40,al end; {assemblerの終わり} end; { procedureの終わり} |
procedure tform1.button10click(sender: tobject); var roop:integer; xmaxint:integer; dxasm: word; begin asm {assemblerの開始} @{表 操作手順の番号} mov ax,$f {クロックl} mov dx,$37a out dx,ax A mov ax,$f2 {poweron6〜9とcsをh} mov dx,$378 out dx,ax end; {assemblerの終わり} xmaxint:=strtoint(form1.edit22.text); for roop:=1 to xmaxint do begin ch1bwr; data[roop]:=dxasm; end; end; {pc/at互換機1回データを読み込むサブルーチン} procedure ch1bwr; {ch1から入力} begin asm {assemblerの開始} B mov ax ,$f1 {241= 240(poweron pin6〜9) mov dx,$378 1(チップセレクトリセットcsをl) out dx,ax スタートコンバート1} C mov ax ,$e {clock} mov dx,$37a out dx,ax { axレジスタと入出力ポートの間で mov ax,$f データ入出力,dx指定でポート番 mov dx,$37a 号を格納すると16ビットのデータ out dx,ax (0〜65535,hffff)でポート指定 できる} レジスタはax,alレジスタだけである。 D mov ax ,$f1 {241=240(poweron pin6〜9) mov dx,$378 +1(標準1)} out dx,ax E mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax F mov ax ,$f1 {$f1 240+1 1 チャネル選択} mov dx,$378 {$f0 240+0 0 チャネル選択} out dx,ax {240(poweron pin6〜9)} G mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax H mov ax ,$f1 {241=240(poweron pin6〜9) mov dx,$378 +1(ステータスデータ1)} out dx,ax I mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax xor cx,cx {cx=0} J mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax L mov dx,$379 {b7 read 11pin busy信号} in ax,dx and ax,$80 {7bit,high;0 al=0,low;27 $80 al=1} sub ax,$1{high0-1=0ボロー=1 cf=1,low1-1=0 cf=0} adc cx,cx {cx=cx+cx+cf highの時キャリーフラグ cf=1} M mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax N mov dx,$379 {b6 read} in ax,dx and ax,$80 sub ax,$1 adc cx,cx O mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax P mov dx,$379 {b5 read} in ax,dx and ax,$80 sub ax,$1 adc cx,cx Q mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax R mov dx,$379 {b4 read} in ax,dx and ax,$80 sub ax,$1 adc cx,cx S mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax 21 mov dx,$379 {b3 read} in ax,dx and ax,$80 sub ax,$1 adc cx,cx 22 mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax 23 mov dx,$379 {b2 read} in ax,dx and ax,$80 sub ax,$1 adc cx,cx 24 mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax 25 mov dx,$379 {b1 read} in ax,dx and ax,$80 sub ax,$1 adc cx,cx 26 mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax 27 mov dx,$379 {b0 read} in ax,dx and ax,$80 sub ax,$1 adc cx,cx 28 mov ax ,$e {clock} mov dx,$37a out dx,ax mov ax ,$f mov dx,$37a out dx,ax mov dxasm,cx {dxasmにdata 格納} xor ax,ax {ax=0} 30 or 2 mov ax ,$f2 {240+2;poweron6〜9とcsをh} mov dx,$378 out dx,ax end; {assemblerの終わり} end; { procedureの終わり} |
pc9821用プログラム | pc/at互換機用プログラム |
プログラムの流れ
a
ボタンをクリックすることで表3の操作手順@を実行する。コンピュータの起動時はプリンタポートの1番ピン
は通常はhighになっているのでまずlowにする必要がある。
b
チャネル1からデータを読み込む手続きch1bwrをサンプリング数の最大値xmaxintに等しい回数,
ループで呼び出す。
c 手続きch1bwrの中で表3の操作手順A〜28を実行する。
d ビットを読み込む操作手順毎に,busy信号がhighかlowか論理和(and)で判定している。
busy信号は反転してコンピュータに入るのでhighの時0,lowの時1がalまたはaxに格納される。
e busy信号は反転してコンピュータに入るので,論理和の結果(alまたはaxに格納されている値)と$1の
減算(sub)を行って,キャリーフラグcfの値がbusy信号がhighの時1,lowの時 0になる(反転を直す)
ようにする。
f キャリー付き加算(adc)を行ってdx(pc9821の時)またはcxレジスタ(dos/vの時)に格納する。
g 手続きch1bwrの中でd〜fを8回繰り返すことで8ビットの信号に2n―1(nビット目毎 に)の重みがか
かって加算され,アナログデータに対応するデジタルデータの値が得られる。
h 手続きch1bwrの最後でデジタルデータを変数dxasmに格納する。
i
手続きch1bwrを呼ぶループの中で,変数dxasmを配列変数data[roop]に格納する。
roopの最大値がサンプリング数になる。
〔参考文献〕
「パソコンを計測機器として使用する方法の検討」平成4年度長期研修集録
田中 佳典
パソコンアダプタの製作&応用 トランジスタ技術編集部 cq出版社 1999年1月
次へ進む 前に戻る 理科におけるコンピュータの活用へ