If you just can not stay away from getting your hands dirty with low-level code, we have this starter package of DOS and Windows software. The C library and DLL lets you control the data acquisition hardware directly. You can create all those special functions you want, such as, digital averaging, triggering on a level, vectored playback table, etc. If you want to use Visual Basic see this example program. See example C code for typical use of the library.
Programmer's Kit
The kit consists of 3.5" media and Programmer's Guide and includes source code of the Data Acquisition example program and description and use of the APIs and DLL for hardware control.
Description of the files in the Windows / DOS starter code package:
The functions in the guide show you typical use to Initialize a hardware port, Calibrate a port, Power up the A/D, Get a sample, and Shut down the A/D.
//*************************************************************************
// adcsamp.c
// Example code of using the DOS library "adc12ams.lib" to get a sample
// from the Adcdongle 12A.
//*************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include "adc12a_c.h"
//** Function Prototypes **
void main(void);
int getportnbr(void);
int samples[2000];
//************************************************************************
//* Start of main
//************************************************************************
void main()
{
int i, ret, portno;
int cablelen = 6; // length of cable from PC to Adcdongle is 6 feet.
char ch, tmp[80];
char fname[80];
FILE *fptr;
portno = getportnbr();
printf("\nDoing port calibration.");
ret = DoPortCalib12A(portno,cablelen);
if (ret != 0)
{ printf("\nInvalid port number, could not calibrate port");
exit(0);
}
printf("\nInitialing COM port for use with AdcDongle.");
Dacq12ACOMInit(portno);
printf("\nTurning on power to AdcDongle 12A module.");
Dacq12ACOMPowOn(portno);
printf("\n\nReady to sample 2000 samples from channel 1 and store in array.");
printf("\nPress a key when ready to start sampling.");
getch();
for (i=0; i<2000; i++)
samples[i] = Get12ASampComPort(0,portno);
printf("\nDone sampling, turning off power");
Dacq12ACOMPowOff(portno);
printf("\n\nEnter filename to save samples in: ");
gets(fname);
//* open file for read to see if file already exists.
ch = 'Y';
if((fptr = fopen(fname, "rb" )) != NULL )
{ fclose(fptr);
printf("\nFile %s already exists, ",fname);
do
{ printf("do you want to overwrite it? (Y/N): ");
ch = _toupper(getch());
} while ((ch != 'Y') && (ch != 'N'));
}
if (ch == 'Y')
{ if ((fptr = fopen(fname, "wb" )) != NULL)
{ printf("\n\nWriting samples to file %s",fname);
fwrite(samples, sizeof(int), 2000, fptr);
printf("\nDone writing sample, closing file.");
fflush(fptr);
fclose(fptr);
}
else
printf("\nERROR: Could not open file: %s",fname);
}
}
//**************************************************************************
//* int getportnbr(void)
//*
//* This example function just prompts for and gets the port number,
//* then checks the port number against a list of known COM ports.
//**************************************************************************
int getportnbr()
{
char tmp[80];
unsigned int portno;
do
{ printf("\n\nWhat COM port is the AdcDongle 12A hardware attached? ");
printf("\n\tCOM1: %4u (%X hex),\n\tCOM2: %4u (%X hex),\n\tCOM3: %4u (%X hex),\n\tCOM4: %4u (%X hex)? ",
COMPORT1,COMPORT1,COMPORT2,COMPORT2,COMPORT3,COMPORT3,COMPORT4,COMPORT4);
printf("\nPlease enter the decimal port number: ");
gets(tmp);
portno = atoi(tmp);
switch(portno)
{ case COMPORT1:
case COMPORT2:
case COMPORT3:
case COMPORT4: //* these are valid ports **
break;
default: //* Don't recognize port number **
portno = 0;
}
if (portno == 0)
{ printf("\nThe Port number you entered is an invalid port number.");
printf("\nPlease enter a different port number, or press CNTL-C to exit.");
printf("\n");
}
} while(portno == 0);
return(portno);
}
// ******************************** End of C Example *********************
'************************* Visual Basic Example ************
' This code segment example sets up the AdcDongle for a selected
' COM port and starts the sampling process.
'***********************************************************
Option Explicit
'*** Call this function once before using any Com Port ***
Declare Function DoPortCalib12A% Lib "adc12awn.dll" (ByVal Port%, ByVal CableLen%)
'*** Call this sub once before using selected Com Port ***
Declare Sub Dacq12AComInit Lib "adc12awn.dll" (ByVal Port%)
'*** Call this sub just before getting a sample from idled A/D
Declare Sub Dacq12AComPowOn Lib "adc12awn.dll" (ByVal Port%)
'*** Call this sub to idle A/D
Declare Sub Dacq12AComPowOff Lib "adc12awn.dll" (ByVal Port%)
'*** Call this function to get integer sample form A/D
Declare Function Get12ASampComPort% Lib "adc12awn.dll" (ByVal Chan%, ByVal Port%)
Dim Sample(7, 10000) As Integer '8 channels x MaxSamples samples array
Const MaxSamples = 10000
Dim SampleNum&
Dim SampleCount& ' current sample
Dim SampRate$ ' sampling timer setting
Dim RecFlag% ' ready to record?
Dim RecPort% ' input port
Dim RecPortLabel$ ' input port label
Dim RecPortNo$ ' relative port # 1- x
Dim Msg$ ' message box string
Dim ret% ' function return value
Dim StartTime$ ' start of recording
Dim ProgramDir$ ' path to program
Dim DataExt ' data file count
Dim UpdateDisplay
Const ProgramName$ = "ADONG12A"
'File open error codes
Const Err_DeviceUnavailable = 68
Const Err_DiskNotReady = 71, Err_FileAlreadyExists = 58
Const Err_TooManyFiles = 67, Err_RenameAcrossDisks = 74
Const Err_Path_FileAccessError = 75, Err_DeviceIO = 57
Const Err_DiskFull = 61, Err_BadFileName = 64
Const Err_BadFileNameOrNumber = 52, Err_FileNotFound = 53
Const Err_PathDoesNotExist = 76, Err_BadFileMode = 54
Const Err_FileAlreadyOpen = 55, Err_InputPastEndOfFile = 62
Const MB_EXCLAIM = 48, MB_STOP = 16
Declare Function GetModuleHandle Lib "Kernel" (ByVal lpModuleName As String) As Integer
Declare Function GetModuleUsage% Lib "Kernel" (ByVal hProgram%)
Declare Function GetModuleFileName Lib "Kernel" (ByVal hModule%, ByVal FileName$, ByVal nSize%) As Integer
Sub GetAdcData () ' Get a sample from selected channels
' and print and plot to screen.
Dim AdcSamp&, ChNo%
SampleCount& = SampleCount& + 1
If SampleCount& > MaxSamples Then
SampleCount& = 1
Msg = "The sampled data buffer is full. "
Msg = Msg + "Do you want to save to a file?"
If MsgBox(Msg, 1, "Save Data?") = 2 Then
Exit Sub
End If
OpenFile (DataFileName) 'Save the test data
End If
If RecFlag% = False Then Exit Sub
For ChNo% = 0 To 7
AdcSamp& = Get12ASampComPort%(ChNo%, RecPort%)
SampleTotal.Caption = SampleCount&
If PodCh(ChNo%).Value = True Then 'show if Ch is selected
If UpdateDisplay = 0 Then
gauge(ChNo%).Value = AdcSamp&
ch(ChNo%).Caption = Format(AdcSamp& / 1000, "#0.000 V")
End If
Sample(ChNo%, SampleCount&) = AdcSamp&
Else
If UpdateDisplay = 0 Then
gauge(ChNo%).Value = 0 'reset to 0
ch(ChNo%).Caption = "off"
End If
' Sample(ChNo%, SampleCount&) = 0
End If
Next ChNo%
DoEvents 'update gauges
End Sub
Sub InputPort_Load () 'load list of possible PC serial ports
RecordPort.AddItem "Com1: 3F8 hex", 0
RecordPort.AddItem "Com2: 2F8 hex", 1
RecordPort.AddItem "Com3: 3E8 hex", 2
RecordPort.AddItem "Com4: 2E8 hex", 3
End Sub
Sub RecCntrl_click () 'Start recording
If RecPort% = 0 Then 'which port?
MsgBox "No port selected."
Exit Sub
End If
'************** Test port once before the first use. ****
ret% = DoPortCalib12A(RecPort%, 0) 'test the port
If ret% = -1 Then
MsgBox "Port number is not valid."
Exit Sub
End If
Erase Sample 'clear array
RecFlag% = True 'start recording
'************** Set up Com Port for I/O *****************
Dacq12AComInit (RecPort%) 'set up selected port
'************** Activate A/D ****************************
Dacq12AComPowOn (RecPort%) 'Power up A/D
PowerLbl.Caption = "On"
SampleCount& = 0 'reset count
StartTime$ = Time$
SampleStartTime.Caption = StartTime$
SampleStopTime.Caption = ""
End Sub
Sub RecordPort_Change ()
'RecordPort.List
Select Case RecordPort.ListIndex
Case 0
RecPortNo$ = "1" 'Com1
RecPortLabel$ = "Serial Port 3F8"
RecPort% = &H3F8
Case 1
RecPortNo$ = "2" 'Com2
RecPortLabel$ = "Serial Port 2F8"
RecPort% = &H2F8
Case 2
RecPortNo$ = "3" 'Com3
RecPortLabel$ = "Serial Port 3E8"
RecPort% = &H3E8
Case 3
RecPortNo$ = "4" 'Com4
RecPortLabel$ = "Serial Port 2E8"
RecPort% = &H2E8
End Select
End Sub
Sub RecordPort_Click () 'update selection
RecordPort_Change
End Sub
Sub SampleRate_Click (Index As Integer, Value As Integer)
Select Case Index
Case 0
Timer1.Interval = 1 '1000 samples/sec
SampRate$ = "1000 samples/sec"
Case 1
Timer1.Interval = 10 '100 samples/sec
SampRate$ = "100 samples/sec"
Case 2
Timer1.Interval = 100 '10 samples/sec
SampRate$ = "10 samples/sec"
Case 3
Timer1.Interval = 1000 '1 sample/sec
SampRate$ = "1 sample/sec"
Case 4
Timer1.Interval = 2000 '1 sample/2 secs
SampRate$ = "1 sample/2 secs"
Case 5
Timer1.Interval = 5000 '1 sample/5 secs
SampRate$ = "1 sample/5 secs"
Case 6
Timer1.Interval = 10000 '1 sample/10 secs
SampRate$ = "1 sample/10 secs"
End Select
Dim RecTimeMS, RecTimeHr, RecTimeMin, RecTimeSec, RecTimeSecTotal
Dim RecHr$, RecMin$, RecSec$
RecTimeMS = MaxSamples * Timer1.Interval
RecTimeSecTotal = (RecTimeMS / 1000)
RecTimeSec = (RecTimeSecTotal Mod 60)
RecTimeMin = (Fix(RecTimeSecTotal / 60)) Mod 60
RecTimeHr = (Fix(RecTimeSecTotal / 3600)) Mod 60
RecHr$ = Format(RecTimeHr, "00")
RecMin$ = Format(RecTimeMin, "00")
RecSec$ = Format(RecTimeSec, "00")
MaxRecTime.Caption = RecHr$ + ":" + RecMin$ + ":" + RecSec$
End Sub
Sub StopCntrl_Click () ' Stop the recording
RecFlag% = False
'********** Idle A/D and Com Port ******************
Dacq12AComPowOff (RecPort%) 'idle A/D
PowerLbl.Caption = "Off"
SampleStopTime.Caption = Time$
End Sub
'******************************* End of VB Example *********
Contact: SiliconSoft Inc. www.siliconsoft.com San Jose, CA USA Support Lines: Email: siliconsoft@pacbell.net Phone: (408)446-4521