<リスト1> AD コンバータへのデータの出力例 NEC PC98 用 mov al,22h // CLK -> 1, CS -> 0, DI -> 0 out 32h,al // シリアル ポートにデータ出力 PC/AT 互換機用 mov al,00h // CLK -> 1 mov dx,3fb

Similar documents
シリアル ポート接続の A-D 変換アダプタを使って 表計算ソフト ExcelのVBAで計測 & グラフ化 棟田 陽 はじめに 記事の概要昨年, 自作のシリアル ポート接続タイプの A-D 変 換アダプタを DOS 上で作動させる記事 ( 1 ) を紹介させて いただきました OS が DOS から

L N P Y F C T V W Z I X Pentomino Form Name Caption Position FormMain podesktopcenter

1 シミュレーションとは何か?

Microsoft PowerPoint - DELPHI�礔.ppt

Microsoft PowerPoint - vp演習課題

D0020.PDF

Microsoft PowerPoint - はじめてのDataSnapアプリケーション_

知って得する!現役ヘルプデスクが答えるDelphiテクニカルエッセンス 9.0

UIOUSBCOM.DLLコマンドリファレンス

Lesson 1 1 EXVBA2000 Lesson01 Lesson01.xls 2


45 VBA Fortran, Pascal, C Windows OS Excel VBA Visual Basic Excel VBA VBA Visual Basic For Application Microsoft Office Office Excel VBA VBA Excel Acc

Pascal Pascal Free Pascal CPad for Pascal Microsoft Windows OS Pascal

untitled

USB汎用インターフェース・キット ガイドブック

API 連携方式 外部 DLL の呼び出し宣言 外部 DLL の呼び出し宣言のサンプルコード (Microsoft Visual C#.NET の場合 ) プログラムコードの先頭で using System.Runtime.InteropServices; が必要 クラスの内部に以下のような外部 D

CashDrawer ライブラリ API 仕様書 2014/07/09 CashDrawer ライブラリ API 仕様書 Rev / 10

Microsoft Word - VBA基礎(3).docx

3軸加速度センサーモジュール MM-2860 書込み済みマイコンプログラム通信コマンド概要

untitled

Microsoft Word - VBA基礎(6).docx

Embarcadero Developer Camp

コンピュータ概論

GS1-128 の描画 DLL について (ver. 2.3) 動作環境など動作環境 WindowsXP Windows Vista Windows7 Windows8/8.1 Windows10 上記 OS について すべて日本語版を対象としております 32bit アプリケーションから呼び出される

netcdf

csv csv

プロバイダ ユーザーズガイド

sinfI2005_VBA.doc

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

C++ ++ Wago_io.dll DLLDynamicLinkLibrary Microsoft VisualBasic Visual C Wago_io.dll Wago_io.dll Wago_io.dll WAGO_OpenCommPort WAGO_CloseCommPort WAGO_

D0120.PDF

94 expression True False expression FalseMSDN IsNumber WorksheetFunctionIsNumberexpression expression True Office support.office.com/ja-jp/ S

VelilogHDL 回路を「言語」で記述する

スライド 1

第10回 コーディングと統合(WWW用).PDF

スライド 1

Microsoft Word - DT-5100Lib_Manual_DotNet.doc

D0090.PDF

B 5 (2) VBA R / B 5 ( ) / 34

データ収集用 NIM/CAMAC モジュールマニュアル 2006/5/23 目次 クレート コントローラ CC/ NIM ADC 1821 (Seiko EG&G)...3 ADC インターフェイス U デッドタイム

PowerPoint プレゼンテーション

EXCEL VBA講座

橡実践Oracle Objects for OLE

Microsoft PowerPoint - NxLecture ppt [互換モード]

開発者が知りたい実践プログラミングテクニック! ~明日から使えるテクニック集~

PowerPoint プレゼンテーション

プロセス間通信

~~~~~~~~~~~~~~~~~~ wait Call CPU time 1, latch: library cache 7, latch: library cache lock 4, job scheduler co

CommandMatrix_8230E

Excel Excel Excel = Excel ( ) 1

スライド 1


PowerPoint プレゼンテーション

コンピュータ概論

CONTEC DIOプロバイダ ユーザーズガイド

バスケットボール

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

NI P1200 Release Notes Cover

adr(Byte)

WAGO PROFIBUS バスカプラ/コントローラと、QJ71PB92Dとのコンフィグレーションマニュアル

PowerPoint プレゼンテーション

MS-ExcelVBA 基礎 (Visual Basic for Application)

Microsoft Word 練習問題の解答.doc

データアダプタ概要

かべうちテニス

Microsoft Word - no15.docx

Microsoft Word - RZOCX取扱説明書.doc

ルーレットプログラム

Oracle Lite Tutorial

ファイル操作-バイナリファイル

新版 明解C++入門編

Transcription:

<リスト1> AD コンバータへのデータの出力例 NEC PC98 用 mov al,22h // CLK -> 1, CS -> 0, DI -> 0 out 32h,al // シリアル ポートにデータ出力 PC/AT 互換機用 mov al,00h // CLK -> 1 mov dx,3fbh out dx al // シリアル ポートにデータ出力 mov al,03h // CS -> 0, DI -> 0 mov dx,3fch out dx,al // シリアル ポートにデータ出力 <リスト2> A-D コンバータからの1ビットの出力データを調べる方法 NEC PC98 用 in 32h,al // シリアル ポートからデータの読み取り test al,80h // D7 ビットを調べる PC/AT 互換機 mov dx,3feh in dx al // シリアル ポートからデータの読み取り test al,20h // D5 ビットを調べる <リスト3> A-D 変換アダプタ作動関数 (DLL タイプ ) NEC PC98 用 ( このリストには, 後述の説明のため行番号を入れてあります 実際には入りません ) 1: library adcpc98; 2: uses 3: SysUtils, 4: Classes; 5: const //CLK CS DI 6: ADSW011 =$08 ;// 0 1 1 7: ADSW101 =$20 ;// 1 0 1 8: ADSW001 =$28 ;// 0 0 1 9: ADSW100 =$22 ;// 1 0 0 10: ADSW000 =$2a ;// 0 0 0 11: function Keisoku(Chan:Word;mati1:Word;mati2:Word):Word;stdcall; 12: var 13: bufdata:word; 14: ChSw1,ChSw2:Byte; 15: label WAIT1,WAIT2,MEJ,DATA0,DATA1,DATA2;

16: 17: if Chan=0 then ChSw1:=ADSW000;ChSw2:=ADSW100; end 18: else ChSw1:=ADSW001;ChSw2:=ADSW101; //CH の選択 19: asm 20: mov al,adsw011 21: out 32h,al // 表 5の1 22: mov al,adsw001 23: out 32h,al // 表 5の2 24: mov cx,mati1 // 表 5のWait1 25: WAIT1: 26: dec cx 27: jns WAIT1 28: mov al,adsw101 29: out 32h,al // 表 5の3 30: mov al,adsw001 31: out 32h,al // 表 5の4 32: mov al,adsw101 33: out 32h,al // 表 5の5 34: mov al,chsw1 35: out 32h,al // 表 5の6 36: mov al,chsw2 37: out 32h,al // 表 5の7 38: mov al,adsw000 39: out 32h,al // 表 5の8 40: mov al,adsw100 41: out 32h,al // 表 5の9 42: mov cx,mati2 // 表 5のWait2 43: WAIT2: 44: dec cx 45: jns WAIT2 46: mov dl,07h //for i=0 to7 47: MEJ: 48: mov al,adsw000 49: out 32h,al // 表 5の10 50: mov al,adsw100 51: out 32h,al // 表 5の11 52: in al,32h // 表 5の12 53: push ax //1ビットのデータをスタックへ入れます 54: dec dl 55: jns MEJ //next i, 以上 8 回入力を行います //8 ビットの計測データをメモリへ入れます 56: mov dx,00ffh //dx レジスタに計測データを入れます

57: mov cx,07h // for i=0 to 7 58: DATA0: 59: pop ax // スタックから1ビットのデータを取り出します 60: test al,80h //al レジスタの D7 が0か1かを調べます 61: je DATA1 62: ror dl,1h //al レジスタの D7 が1であれば dl レジスタの D7 に1を入れます 63: jmp DATA2 64: DATA1: 65 shr dl,1h //al レジスタの D7 が0であれば dl レジスタの D7 に0を入れます 66: DATA2: 67: dec cx //next i, 以上 8 回繰り返します 68: jns DATA0 69: mov bufdata,dx //dx レジスタの値を変数 bufdata に入れるます 70: //asm 71: Keisoku:=bufdata; // デジタル変換された8ビットのデータをこの関数の戻り値とします 72: //main 73: exports Keisoku index 1; // 外部からこの関数を参照できるようにします 74: 75: end. PC/AT 互換機用 library adcdosv; uses SysUtils, Classes; const PCLK =$3FB; PCSDI =$3FC; PDO =$3FE; CLK0=$40 ; CLK1=$00 ; CSDI00=$3 ; CSDI01=$2 ; CSDI10=$1 ; CSDI11=$0 ; function Keisoku(Chan:Word;mati1:Word;mati2:Word):Word;stdcall; var bufdata:word; ChSw:Byte; label WAIT1,WAIT2,MEJ,DATA0,DATA1,DATA2;

if Chan=0 then ChSw:=CSDI00 else ChSw:=CSDI01; asm mov dx,pclk;mov al,clk0;out dx,al mov dx,pcsdi;mov al,csdi11;out dx,al // 表 5の 1 mov dx,pcsdi;mov al,csdi01;out dx,al // 表 5の 2 mov cx,mati1 WAIT1: dec cx jns WAIT1 mov dx,pclk;mov al,clk1;out dx,al // 表 5の3 mov dx,pclk;mov al,clk0;out dx,al // 表 5の4 mov dx,pclk;mov al,clk1;out dx,al // 表 5の5 mov dx,pclk;mov al,clk0;out dx,al // 表 5の6 mov al,chsw mov dx,pclk;mov al,clk1;out dx,al // 表 5の7 mov dx,pclk;mov al,clk0;out dx,al // 表 5の8 mov dx,pcsdi;mov al,csdi00;out dx,al mov dx,pclk;mov al,clk1;out dx,al // 表 5の9 mov cx,mati2 WAIT2: dec cx jns WAIT2 mov ah,07h //for i=0 to7 MEJ: mov dx,pclk;mov al,clk0;out dx,al // 表 5の10 mov dx,pclk;mov al,clk1;out dx,al // 表 5の11 mov dx,pdo in al,dx // 表 5の12 push ax //1ビットのデータをスタックへ入れます dec ah jns MEJ //next i, 以上 8 回入力を行います //8 ビットの計測データをメモリへ入れます ここに,NEC PC98 用の行番号 56~ 行番号 69 の命令を入れます ただし,60:test al,80h は,test al,20h に変更します //asm Keisoku:=bufdata; //main exports Keisoku index 1;

end. <リスト4> シリアル ポートのオープン関数 (EXE タイプ ) unit Ad_swtch; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(tform) AD_ON: TButton; Switch: TLabel; procedure AD_ONClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private 宣言 } FHandle:THandle; public { Public 宣言 } var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.AD_ONClick(Sender: TObject); FHandle:=CreateFile( 'COM1', //address of name of the file GENERIC_READ or GENERIC_WRITE, //access (read-write) mode 0, //share mode nil, // address of security descriptor OPEN_EXISTING, //how to create FILE_ATTRIBUTE_NORMAL, //file attributes 0 // handle of file with attributes to copy );// パラメータの詳細は Win32 Programmer s Reference, 文献 6をご覧ください Switch.caption:='ON'; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); CloseHandle(FHandle);

end. <リスト5> VBA でA-D 変換アダプタの作動関数 Keisoku を利用するプログラム 1 チャンネル入力の場合 Declare Function Keisoku Lib "adcpc98" (ByVal C As Integer,ByVal N As Integer, ByVal M As Integer) As Integer NEC PC 用 Declare Function Keisoku Lib "adcdosv" (ByVal C As Integer,ByVal N As Integer, ByVal M As Integer) As Integer PC/AT 互換機用 Sub 計測 () Dim MejData(256) As Integer Dim counter As Integer Dim Mejcounter As Integer Mejcounter = 256 必ず MejData(X) のX より小さい値を指定してください For counter = 1 To Mejcounter MejData(counter) = Keisoku(0, 0, 0) CH0 からの入力信号を測定 Next counter For counter = 1 To Mejcounter Worksheets("Sheet1").Cells(counter,1).Value = MejData(counter) Sheet1 の1 列目に計測データが表示されます Next counter End Sub 2チャンネル入力の場合 Declare Function Keisoku Lib "adcpc98" (ByVal C As Integer,ByVal N As Integer, ByVal M As Integer) As Integer NEC PC 用 Declare Function Keisoku Lib "adcdosv" (ByVal C As Integer,ByVal N As Integer, ByVal M As Integer) As Integer PC/AT 互換機用 Sub 計測 () Dim MejData0(256) As Integer Dim MejData1(256) As Integer Dim counter As Integer Dim Mejcounter As Integer Mejcounter = 256 必ず,MejData0(X),MejData1(X) のX より小さい値を指定してください For counter = 1 To Mejcounter MejData0(counter) = Keisoku(0, 0, 0) CH0 からの入力信号を測定 MejData1(counter) = Keisoku(1, 0, 0) CH1 からの入力信号を測定

Next counter For counter = 1 To Mejcounter Worksheets("Sheet1").Cells(counter, 1).Value = MejData0(counter) Worksheets("Sheet1").Cells(counter, 2).Value = MejData1(counter) CH0からの計測データを Sheet1 の1 列目に表示 CH1からの計測データを Sheet1 の2 列目に表示 Next counter End Sub <リスト6> タイムスタンパを利用する方法 function Sampling:Double; // 戻り値は, 経過時間を ms の単位で返します var TimeS,TimeE:Word; TimeMej:Integer; asm in ax,005ch // タイムスタンパのカウントを読みます mov TimeS,ax { 時間計測を行いたい部分 } in ax,005ch // もう一度タイムスタンパのカウントを読みます mov TimeE,ax TimeMej:=TimeE-TimeS; if TimeMej<0 then TimeMej:=TimeMej+ 65536; Sampling:=TimeMej*0.00326; // カウントの差を出します // カウントが ffffh から 0000h に変化した場合 //1 カウント当たり 0.00326ms の時間経過です <リスト7> サンプリング時間の計測を含んだ A-D 変換アダプタ作動関数 (DLL タイプ ) library adcpc98t; uses SysUtils, Classes; const ADSW011 =$08 ;// CLK=0 CS=1 DI=1 ADSW101 =$20 ;// 1 0 1 ADSW001 =$28 ;// 0 0 1 ADSW100 =$22 ;// 1 0 0 ADSW000 =$2a ;// 0 0 0 type

PDouble = ^double; PWord = ^Word; procedure Keisoku_time(Data:PWord;Time:PDouble;count:Word;Chan:Word;mati1:Word;mati2:Word);stdcall; var i:word; bufdata:word; timecount:word; TimeMej:Integer; ChSw1,ChSw2:Byte; TimeData : array[0..1024] of Word; label WAIT1,WAIT2,MEJ,DATA0,DATA1,DATA2; if Chan=0 then ChSw1:=ADSW000;ChSw2:=ADSW100; end else ChSw1:=ADSW001;ChSw2:=ADSW101; // ここに, asm cli を入れると取りこぼしなく計測データが取り込めますが大変危険な方法です for i:=1 to count do asm ここに, リスト2の NEC PC98 用の行番号 20~ 行番号 69 の命令を入れます in ax,005ch // タイムスタンパのカウントを読み出します mov timecount,ax //asm Data^:=bufdata; // 得られた8ビットの計測データを変数 Data に入れます inc(data); TimeData[i]:=timecount; // タイムスタンパのカウントを変数 TimeData に入れます //for next // もし, 割り込み禁止を入れた場合は, ここに asm sti を入れます TimeData[0]:=timeData[1]; for i:=1 to count do // 以下, 計測データ一つ一つのサンプリング時間を求めます TimeMej:=TimeData[i]-TimeData[i-1]; if TimeMej<0 then TimeMej:=TimeMej+ 65536; Time^:= TimeMej*0.00326; // サンプリング時間を変数 Time に入れます inc(time); //main exports Keisoku_time index 1;

end. <リスト8> VBA でA-D 変換アダプタの作動関数 Keisoku を利用するプログラム Declare Sub Keisoku_time Lib "adcpc98t" (ByRef D As Integer, ByRef T As Double, ByVal C As Integer, ByVal H As Integer, ByVal N As Integer, ByVal M As Integer) Sub 計測 () Dim Data(1024) As Integer Dim time(1024) As Double Dim count As Integer Dim Mejcount As Integer Mejcount=1024 Data(X),time(X) のXより小さい値を指定してください Call Keisoku_time(Data(1), time(1), Mejcount, 0, 0, 0) CH0 からの入力信号を 1024 個測定します For count = 1 To Mejcount Worksheets("Sheet1").Cells(count + 1, 1).Value = time(count) Worksheets("Sheet1").Cells(count + 1, 2).Value = Data(count) サンプリング時間を Sheet1 の1 列目, 計測データを Sheet1 の2 列目に表示します Next count End Sub