PCI-P8R8/P16R16/P16C16/P16POR16
User’s Manual
Warranty
All products manufactured by ICP DAS are warranted against defective
materials for a period of one year from the date of delivery to the original
purchaser.
Warning
ICP DAS assumes no liability for damages consequent to the use of this
product. ICP DAS reserves the right to change this manual at any time without
notice. The information furnished by ICP DAS is believed to be accurate and
reliable. However, no responsibility is assumed by ICP DAS for its use, nor for
any infringements of patents or other rights of third parties resulting from its use.
Copyright
Copyright © March 1998~1999 by ICP DAS. All rights are reserved.
Trademark
The names used for identification only may be registered trademarks of
their respective companies.
License
The user can use, modify and backup this software on a single
machine. The user may not reproduce, transfer or distribute this
software, or any copy, in whole or in part.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …1
1 . Introduction
Model Number
PCI-P8R8
Isolated Digital Input Output Type
8 Channel
16 Channel
16 Channel
16 Channel
8 Channel Relay Output
16 Channel Relay Output
16 Channel Open-Collector Output
16 Channel PhotoMos-Relay
Output
PCI-P16R16
PCI-P16C16
PCI-P16POR16
• PCI-P8R8 / PCI-P16R16
The PCI-P16R16 and PCI-P8R8 are relay actuator output / isolation
input interface cards for PCs and compatible computers. The former provides
16 channels and the latter provides 8 channel input and output channels.
Both can be easily installed in a 5V PCI slot and can support truly “Plug and
Play". They can be used in many applications.
• PCI-P16C16
The PCI-P16C16 provides 16-channel transistor outputs and 16-channel
isolated digital input. The transistor can outputs up to 30Vdc / 600mA(open
collector). The isolated digital input, like the PCI-P16R16, provides AC/DC input
and R/C filter.
• PCI-P16POR16
The PCI-P16POR16 provides 16-channels PhotoMos Relay output and
16-channel isolated digital input. The PhotoMos relay output can switch up to
350Vac / 130mA (max.), with designed LED indicated for output status. The
isolated digital input, like the PCI-P16R16, provides AC/DC input and R/C filter.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …3
1.1. Features and Applications
1.1.1.
Features
PCI-P8R8
PCI-P16R16
PCI-P16C16
PCI-
P16POR16
Common ꢀ 5V PCI Bus add-on card
Features ꢀ Optically isolated digital input
ꢀ AC/DC digital signed input
ꢀ AC digital input with filter by jumper setting
Input channel 8
Input type Optically isolated digital input
Output channel 8 16
Output type Relay Output Relay output
16
16
16
16
16
Transistor
(Open-
collector)
PhotoMos
Relay
Led indicators None
None
External Power Output Status
status
Table 1-1. Features of PCI-P8R8/P16R16/P16C16/P16POR16 card
1.1.2.
Applications
• Factory automation.
• Laboratory automation.
• Communication switching
• Security control.
• Product test.
• Energy management.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …4
1.2. Block Diagram
PCI BUS
P8R8 / P16R16
EEPROM
PCI Controller
Relay
Relay
Transistor
Transistor
PhotoMos
Buffers
&
Drivers
Relay
Relay
Transistor
PhotoMos
Transistor
P16POR1
PhotoMos
PhotoMos
Photo-couple
Photo-couple
Buffers
&
Filters
Photo-couple
Photo-couple
Figure 1-1: Functional Block diagram.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …5
1.3. Specifications
Product
PCI-P16R16
PCI-P8R8
Channels
16
8
Photo-coupler
Input-Current (per
channel)
PC-814
PC-814
20 mA max (24V)
20 mA max (24V)
INPUT
Input-Voltage
AC/DC 5 - 24 V
(AC 50 - 1K HZ)
1.2 KΩ
AC/DC 5 - 24 V
(AC 50 - 1K HZ)
1.2 KΩ
Input Impedance
Withstanding Voltage 1KV
1KV
Response Time
Without Filter 20µS Without Filter 20µS
With Filter 2.2mS With Filter 2.2mS
Relay Output
Channels
16
8
Relay Type
8 SPDT 8 SPST
4 SPDT 4 SPST
Contact Rating
AC: 120V / 0.5A
DC: 24V/1A,
48V/0.15A
AC: 120V / 0.5A
DC: 24V/1A,
48V/0.15A
1KV
OUTPUT
Breakdown Voltage 1KV
Operate Time
Release Time
Insulation
5 m Sec
5 m Sec
2 m Sec
2 m Sec
1,000 M Ω
1,000 M Ω
Resistance
Life Mechanical
Electrical
5 ¯ 106
1 ¯ 105
100mΩ
5 ¯ 106
1 ¯ 105
100mΩ
Input Resistance
(initial)
Switching Power
Operating
60VA, 24W
60VA, 24W
0~60 deg. C
Temperature
Common Storage
Temperature
-20~70 deg. C
Humidity
0~90%
Dimensions
183mm X 105 mm
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …6
Product
PCI-P16C16
PCI-P16POR16
Channels
16
16
Photo-coupler
Input-Current (per
channel)
PC-814
PC-814
20 mA max (24V)
20 mA max (24V)
INPUT
Input-Voltage
AC/DC 5 - 24 V
(AC 50 - 1K HZ)
1.2 KΩ
AC/DC 5 - 24 V
(AC 50 - 1K HZ)
1.2 KΩ
Input Impedance
Withstanding Voltage 1KV
1KV
Response Time
Without Filter 20µS Without Filter 20µS
With Filter 2.2mS With Filter 2.2mS
Output Channels
Output Type
16
16
Transistor
(Open collector)
PhotoMos Relay
(Form A)
Output Rating (per 30Vdc /
350Vac / 130mA
(Peak AC)
0.7 m Sec
0.05 m Sec
350Vac
channel)
600mA(max)
Turn On Time
Turn OFF Time
Switching Power
Output On
OUTPUT
30Vdc
23Ω
Resistance
LED indicators
External Power
Input status
Output status
Operating
Temperature
Storage
0~60 deg. C
Common
-20~70 deg. C
Temperature
Humidity
0~90%
Dimensions
183mm X 105 mm
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …7
1.4. Hardware Configuration
This chapter describes how to unpack this I/O card and how to
install it to your system. Both the unpacking information and the jumper
settings are described in the following text. This manual should be
carefully read before installation.
1.4.1.
Unpacking
This I/O card was well-tested and inspected both mechanically and
electrically before shipping. It was free of marks and scratches our
quality delivery policy requires that all equipment be in perfect order
before delivery. However, some unconditional damages may occur while
unpacking!! Please read this section before unpacking the card. Feel free
to contact your carrier and retain your carton in case there is error.
CAUTION:
This card contains sensitive electronic components that can be easily damaged by
static electricity.
1. This card should be packed with an anti-static mat.
2. The user should wear an anti-static wristband, grounded at the same point
to the anti-static mat.
3. Inspect the carton for obvious damage. Either shipping or handing may
cause damages!! Be sure there are no shipping and handing damages on
the card before using.
4. After opening the carton, place the system board handle on a grounded
anti-static surface and let the component side up.
CAUTION: Do not apply power to the board if it has been damaged!
• You are now ready to install your card.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …8
1.4.2.
Board Layout
PCI-P8R8
Input Resistor: 1.2KΩ
JP8..........JP1
Figure 1-2. PCI–P8R8 Board Layout.
PCI-P16R16
Input Resistor: 1.2KΩ
JP16 —— JP9
JP8......….JP1
Figure 1-3. PCI–P16R16 Board Layout.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …9
Transistor
External Power LED
indicator
External Power protection
(Pico Fuse)
PCI-P16C16
JP16 — JP9
JP8............JP1
Figure 1-4. PCI-P16C16 Board Layout
LED indicator
PCI-P16POR16
JP16 —— JP9
JP8...........JP1
Figure 1-5. PCI-P16POR16 Board Layout
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …10
1.4.3.
Jumper Setting
• For PCI-P8R8 / P16R16 / P16C16 / P16POR16
You can change the I/O card configuration simply by setting the
jumpers on this board. Each digital input channel can be jumper-
configured as a single-pole, RC filter with a time constant of 1.2 ms. The
table listed below shows each digital input channel and the
corresponding jumper.
Jumper
JP1
Channel
DI0
Jumper
JP9
Channel
DI8
JP2
DI1
JP10
JP11
JP12
JP13
JP14
JP15
JP16
DI9
JP3
DI2
DI10
DI11
DI12
DI13
DI14
DI15
JP4
DI3
JP5
DI4
JP6
DI5
JP7
DI6
JP8
DI7
Table 1-2. Jumper assignment.
The figure below shows how to select the digital input type :
1
2
3
1
2
3
With AC Filter
For AC Signal
Without Filter
For DC Signal
(Default Settling)
Figure 1-6. Jumper Settings.
If you are using AC input signals, you must short AC FILTER
pin2-3 of the corresponding jumpers. If you are using DC input signals,
the AC FILTER is optional. If the DC input signal response is less than
20 µs, set the filter to off. If you want a slow response (about 5 to 10 ms)
to reject either noise or contact bouncing, short AC FILTER Pin2-3.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …11
1.5. Pin Assignments
PCI-P8R8 / PCI-P16R16
Pin Assignment
CON 1
CON 2
CON 2
Extender Cable
NO: Normal Open
COM: Common
NC: Normal Close
DIA: Digital Input (Point A)
DIB: Digital Input (Point B)
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …12
CON 1
PCI-P16C16 Pin Assignment
CON 2
CON 2
External Cable
Ext. Power: External Power Input
GND: External Power Ground
OUT: Open Collector Output
DIA: Digital Input (Point A)
DIB: Digital Input (Point B)
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …13
CON 1
PCI-P16POR16 Pin Assignment
CON 2
CON 2
B
B
B
8
8
9
9
10
11
12
13
14
15
10
External Cable
NO
B 11
B
B
B
B
12
13
14
15
DIA: Digital Input (Point A)
DIB: Digital Input (Point B)
CM
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …14
2 . Hardware applications
Model Number
OUTPUT
Input
PCI-P8R8 / PCI-P16R16 Relay Output
Optical isolation
Optical isolation
PCI-P16C16
Transistor Output
(Open collector)
PCI-P16POR16
PhotoMos Relay Output Optical isolation
2.1 Relay Output
• For PCI-P8R8 / PCI-P16R16 Only
Whenever data is written data to the output control register, the relays will
switch to NC or NO as specified by the control code. A`1'in the control
register will energize the corresponding relay. The relay will switch from COM to
NO (normally open ). A `0' in the control register will turn off the
corresponding relay and the relay will be switch from COM to NC (normally
closed). The control register powers-on in NC mode. A hardware reset signal or
programmable reset signal will also turn the relay to NC!!
The following figures show how to use the relay.
Basic Circuitry: (Current Rating < 0.3 A):
Relay Contact
COM NO
Load
AC/ DC
Power Supply
Figure 2-1. Basic Relay Circuit.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …15
Heavy Loading Application ( > 0.3 A ) :
P16R16DI
O Relay
Power Relay
Contact
Power Relay
Heavy Loading
Figure 2-3. Heavy load relay circuit.
2.2 Open Collector Output
• For PCI-P16C16 Only
The PCI-P16C16 provides 16-channel open collector outputs and 4 channels
per common power. Each common power has designed fuse protection and
LED indicated status.
Wiring diagrams
- Load
- Load
30Vdc
(Max.)
- Load
- Load
Load current per channel: 30Vdc/600mA (max.)
PCI-P16C16
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …16
2.3 PhotoMos Relay Output
• For PCI-P16POR16 Only
The PCI-P16POR16 includes 16 normally open, form A, PhotoMOS relays. The
board can eliminate ground-loop problems and isolate the computer from
damaging voltages. Use the PCI-P16POR16 to switch loads, up to 350VAC and
130mA.
350VAC@130mA(max.)
NO
Load
Power
AC/DC
CM
NO
Measurement Meter
CM
AC/DC Signal
PCI-P16POR16
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …17
2.4 Isolated Input
• For PCI-P8R8 / P16R16 / P16C16 / P16POR16
Reading the isolation input register will give the digital input state of the photo-
couple (isolation input). Figures 2-3 and 2-4 show the basic circuit of the digital
input.
Switch
DIA 0
If Using AC
Internal
Circuit
5 ~ 24 V
Signal, JP1 must
be shorted 2-3!!
AC/DC
DIB 0
Figure 2-3. Basic Digital Input Circuit.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …18
Although the normal input voltage range is 5 to 24V AC or DC, the input
can still be changed to a larger range by choosing suitable external resistors.
The following figure shows how to connect to a larger input. Please note that
the input current should be limited between 2mA to 20mA; too large an input
current will burn down the internal resistor Ri, while too low of an input current
will not active the photo-coupler isolator. Calculate input voltage and current,
then replace resister Ri.
R = 1.2K Ω /1W
i
If 20mA
Vin
On board circuits
External Circuit
PC - 814
Figure 2-4. Isolated Digital Input
A rough estimate:
If =
2mA ~ 20mA
if Vin = 120V and we ignore photo-coupler turn-on voltage.
We’ll get:
Vin / If = Ri
Vin = 120(V) , If =10(mA) , Ri = Vin/ If
120(V) / 0.01 (A) = 12000 (Ω)
If you replace 1.2KΩ as resistor Ri, we can calculate the power consumption of
Ri as follows:
2
2
P = I R = (10mA) * 1.2KΩ = 1.2W
ex
The power consumption is 1.2 watts, but choosing 1.5 or 2 watts is better.
Thus, we can choose a 1.2K / 2W resistor to replace the resistor Ri.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …19
3 . Software Installation Guide
• FOR PCI-P8R8/PCI-P16R16/PCI-P16C16/PCI-P16POR16
The software package for this card consists of CD-ROM.
Please choose the exact disk for setup according to your PC platform.
3.1 Plug and Play of Windows
95/98/2000/XP
Because Windows 95/98/2000/XP provides the Plug and Play, two stages must
be completed to setup the I/O card.
After plugging the PCI-P8R8/P16R16/P16C16/P16POR16 on
the main-board and turning on the power, you will see these the
following windows. Please follow these steps to finish this driver
installation. Refer to Figures 1 to 15.
Figure 1. Click on the “Next >” button to install driver
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …20
Figure 2. Click on the “Next >” button to search device
Figure 3. Click on the “Next>” button to search drivers
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …21
Figure 4. Select the second item and click “Next >”
Figure 5. Select the item “Other devices” and click “Next>”
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …22
Figure 6. Click the “Have Disk button…”
Figure 7. Click “Browse” to select driver
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …23
Figure 8. Click “OK” after selecting the “P16R16.inf”driver.
This folder corresponds to on the CD-ROM drive.
(Note: PCI-P8R8 uses the driver P8R8.inf)
Figure 9. Click “OK”
(Note: PCI-P8R8 uses the driver P8R8.inf)
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …24
Figure 10. Click “Next>”
Figure 11. Click “Next>”
(Note: PCI-P8R8 uses the driver P8R8.inf)
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …25
Figure 12. Click “Finish”
Figure 13. Double click the item “System” in the “Control Panel”
folder
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …26
Figure 14. Select the device “PCI-P16R16”(or PCI-P8R8)
and click “Properties”
Figure 15. Please ensure that this device has no conflicts
with other devices.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …27
3.2 Software Installation for DOS
Here’s the DOS software installation:
Refer to the install.bat in sub-directory of P16R16 with CD-ROM.
After installation, the sub-directory is as follows:
/**** Demo code, Lib for Borland C++ ***/
...\P16R16\BC\HUGE\DEMO ← huge mode demo programs.
...\P16R6\BC\HUGE\LIB
← huge mode library, P16R16H.LIB
...\P16R6\BC\LARGE\DEMO ← large mode demo programs.
...\P16R6\BC\LARGE\LIB
← large mode library, P16R16L.LIB
/**** Demo code, Lib for MSC ***/
...\P16R6\MSC\HUGE\DEMO ← huge mode demo programs.
...\P16R6\MSC\HUGE\LIB ← huge mode library, P16R16H.LIB
...\P16R6\MSC\LARGE\DEMO ← large mode demo programs.
...\P16R6\MSC\LARGE\LIB
← large mode library, P16R16L.LIB
/**** Demo code, Lib for TC ***/
...\P16R16\TC\HUGE\DEMO ← huge mode demo programs.
...\P16R16\TC\HUGE\LIB ← huge mode library, P16R16H.LIB
...\P16R16\TC\LARGE\DEMO ← large mode demo programs.
...\P16R16\TC\LARGE\LIB ← large mode library, P16R16L.LIB
Please see readme.txt in sub-directory of DEMO and LIB for further
information.
3.3 Software Installation for
WINDOWS 95/98/NT/2000/XP
The software installation for WINDOWS 95/98/NT/2000/XP is as follows:
Refer to readme.txt of CD-ROM.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …28
4 . I/O Control Register
The First 16 double words of a PCI device's configuration space is referred
to as the device's configuration region. Within these the 16 (0-15) double words,
the 04, 05, 06, 07, 08 and 09 double words are referred to as Base Address0,
Base Address1, Base Address2, Base Address3, Base Address4 and Base
Address5. For more detailed information for about these 16 double words,
please referring the book titled PLUG AND PLAY SYSTEM
ARCHITECTURE(written by Tom Shanley, Addison-Wesley Publish Company,
1995). These base addresses are utilized as control register and/or I/O register
for many data acquisition boards. On PCI-P16R16 and PCI-P8R8 boards, the
base address2 is utilized as the base address of digital in and digital out. So the
Digital I/O functions for PCI-P16R16 and PCI-P8R8 are coded as follows:
#define WORD unsigned int
#define UCHAR unsigned char
void P16R16_DO(WORD BaseAddr, WORD wOutData)
{
outport(BaseAddr,wOutData);
}
WORD P16R16_DI(WORD BaseAddr)
{
WORD DigitalIn;
DigitalIn=inport(BaseAddr);
return DigitalIn;
}
void P8R8_DO(WORD BaseAddr, WORD wOutData)
{
outportb(BaseAddr,wOutData);
}
UCHAR P8R8_DI(WORD BaseAddr)
{
UCHAR DigitalIn;
DigitalIn=inportb(BaseAddr);
return DigitalIn;
}
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …29
Please refer to the following program code to get these six base addresses for
PCI-P16R16 and PCI-P8R8. These codes are based on PCI Plug & Play
mechanism 2.
/******************************************************/
/* Reading PCI card's configuration address space
/******************************************************/
WORD GetAddress(void)
*/
{
DWORD dConfigAddress,dBaseAddress;
WORD HiWord,LoWord;
WORD ReturnCode;
UCHAR Bus,Device,Function,WhichLong;
WORD VendorID,DeviceID;
WORD wIrqNumber;
wTotalBoards=0; /* initial board number is 0 */
Bus=0;
for(Bus=0; Bus<10; Bus++)
{
Function=0;
WhichLong=1;
for(Device=0; Device<32; Device++)
{
WhichLong=0;
WriteAddress(Bus,Device,Function,WhichLong);
VendorID=inport(0xcfc);
DeviceID=inport(0xcfe);
if( VendorID==0x1234 && DeviceID==0x1616 )
{ /*----------- PCI-P16R16 --------------*
WhichLong=4; // Base Address 0
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr0=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][0]=wBaseAddr0;
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …30
/*----------------------------------------*/
WhichLong=5; /* Base Address 1 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr1=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][1]=wBaseAddr1;
/*------------------------------------------*/
WhichLong=6; /* Base Address 2 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr2=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][2]=wBaseAddr2;
/*------------------------------------------*/
WhichLong=7; /* Base Address 3 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr3=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][3]=wBaseAddr3;
/*------------------------------------------*/
WhichLong=8; /* Base Address 4 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr4=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][4]=wBaseAddr4;
/*-------------------------------------------*/
WhichLong=9; /* Base Address 5 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr5=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][5]=wBaseAddr5;
/*----------- store the type name ID --------*/
wConfigSpace[wTotalBoards][6]=TYPE_P16R16;
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …31
/*-------------------------------------------*/
wTotalBoards++; /* increment board number */
wGetAddress=1;
}
if( VendorID==0x1234 && DeviceID==0x0808 )
{ /*---------- PCI-P8R8 -----------*/
WhichLong=4; /* Base Address 0 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr0=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][0]=wBaseAddr0;
/*------------------------------------------*/
WhichLong=5; /* Base Address 1 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr1=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][1]=wBaseAddr1;
/*------------------------------------------*/
WhichLong=6; /* Base Address 2 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr2=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][2]=wBaseAddr2;
/*------------------------------------------*/
WhichLong=7; /* Base Address 3 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr3=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][3]=wBaseAddr3;
/*------------------------------------------*/
WhichLong=8; /* Base Address 4 */
WriteAddress(Bus,Device,Function,WhichLong);
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …32
dBaseAddress=_inpd(0xcfc);
wBaseAddr4=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][4]=wBaseAddr4;
/*-------------------------------------------*/
WhichLong=9;
/* Base Address 5 */
WriteAddress(Bus,Device,Function,WhichLong);
dBaseAddress=_inpd(0xcfc);
wBaseAddr5=(WORD)(dBaseAddress&0xfffe);
wConfigSpace[wTotalBoards][5]=wBaseAddr5;
/*---------- store the type name ID --------*/
wConfigSpace[wTotalBoards][6]=TYPE_P8R8;
wTotalBoards++; /* increment board number */
wGetAddress=1;
}
}
}
if( wTotalBoards>16 )
return( NotFoundBoard );
else
return( NoError );
}
void WriteAddress(UCHAR bBus, UCHAR bDevice, UCHAR bFunction,
UCHAR bWhichLong)
{
DWORD dOutData;
WORD HiWord,LoWord;
UCHAR HiByte,LoByte;
HiWord=0x8000|bBus;
HiByte=(bDevice<<3)|bFunction;
LoByte=(bWhichLong<<2) & 0xfc;
LoWord=( (WORD)HiByte<<8 )|LoByte;
dOutData=( (DWORD)HiWord<<16 ) | LoWord;
_outpd(0xcf8,dOutData);
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …33
}
4.1 Function Call in P16R16.DLL
A function in P16R16.DLL(DLL for Windows 95/98/NT) will be exactly the
same prototype as P16R16H.LIB(huge mode library for DOS) and
P16R16L.LIB(large mode library for DOS). It is convenient to develop
applications under different platforms.
4.2 P16R16.H
#define EXPORTS extern "C" __declspec (dllimport)
// return code
#define NoError
0
1
2
3
4
#define DriverHandleError
#define DriverCallError
#define NotFoundBoard
#define FindBoardError
#define ExceedBoardNumber 5
// define Type Name ID
#define TYPE_P16R16
#define TYPE_P8R8
#define TYPE_TMC12
#define TYPE_DA16
#define TYPE_DA8
0
1
2
3
4
EXPORTS float CALLBACK PCI_FloatSub2(float fA, float fB);
EXPORTS short CALLBACK PCI_ShortSub2(short nA, short nB);
EXPORTS WORD CALLBACK PCI_GetDllVersion(void);
EXPORTS WORD CALLBACK PCI_DriverInit(WORD *wTotalBoards);
EXPORTS void CALLBACK PCI_DriverClose(void);
EXPORTS WORD CALLBACK PCI_GetDriverVersion(WORD *wVxdVersion);
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …34
EXPORTS WORD CALLBACK PCI_GetConfigAddressSpace
(WORD wBoardNo, WORD *TypeID,
WORD *wAddress0, WORD *wAddress1, WORD *wAddress2,
WORD *wAddress3, WORD *wAddress4, WORD *wAddress5);
EXPORTS WORD CALLBACK PCI_WhichBoardActive(void);
EXPORTS void CALLBACK P16R16_DO(WORD BaseAddr, WORD OutData);
EXPORTS WORD CALLBACK P16R16_DI(WORD BaseAddr);
EXPORTS void CALLBACK P8R8_DO(WORD BaseAddr, WORD OutData);
EXPORTS BYTE CALLBACK P8R8_DI(WORD BaseAddr);
4.3 PCI_FloatSub2
ꢀDescription:
Performs subtraction (like A-B) for float data types. This function is
provided for testing DLL linkage.
ꢀSyntax: float PCI_FloatSub2(float fA, float fB)
ꢀInput Parameters:
fA: 4 bytes floating point value
fB: 4 bytes floating point value
ꢀReturn Value: the value of fA-fB
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …35
4.4 PCI_ShortSub2
ꢀDescription:
Performs subtraction as (like A-B) in short data types. This function
is provided for testing DLL linkage.
ꢀSyntax: float PCI_ShortSub2(short nA, short nB)
ꢀInput Parameters:
nA :2 bytes short data type value
nB :2 bytes short data type value
ꢀReturn Value: the value of nA-nB
4.5 PCI_GetDllVersion
ꢀ Description: Gets the version number of P16R16.DLL
ꢀ Syntax:
WORD PCI_GetDllVersion(Void)
ꢀ Input Parameters: Void
ꢀ Return Value: 201(hex) for version 2.01
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …36
4.6 PCI_Driverlnit
ꢀDescription:
Initializes the device driver (napwnt.sys for Windows NT/2000XP,
nappci.vxd for Windows 95/98). It is necessary to call on the function the
first time you use this program.
ꢀSyntax: WORD PCI_Driverlinit(WORD*wTolalBoard)
ꢀInput Parameters:
*wTotalBoard: address of wTotalBoard
When wTotalBoard = 1: either P16R16 or P8R8 in PC.
When wTotalBoard = 2: possibility of combination →
ꢀ One P16R16 and one P8R8 in PC.
ꢀ Two P16R16 boards in PC.
ꢀ Two P8R8 boards in PC.
ꢀ Return Value:
NoError: OK
NotFoundBoard: can’t detect the existence of P16R16/P8R8
DriverCallError: can’t open the NAPPCI.VXD in Windows 95/98.
Can’t open the NAPWNT.SYS in Windows NT/2000/XP.
DriverHandleError: return handle is wrong when open device driver.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …37
ꢀDemo Program
[VC example]
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM,
lParam)
{
static char cBuf[80];
HDC
hdc;
TEXTMETRIC tm;
PAINTSTRUCT ps;
int
i;
switch (iMsg)
{
case WM_CREATE : // window initial
/**************************************************************/
/* NOTICE: call PCI_DriverInit() to initialize the driver. */
/**************************************************************/
// Initial the device driver, and return the board number in the PC
wInitialCode=PCI_DriverInit(&wTotalBoard);
if( wInitialCode!=NoError )
{
MessageBox(hwnd,"No PCI card in this system !!!","PCI Card Error",MB_OK);
}
:
:
:
}
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …38
4.7 PCI_DriverClose
ꢀ
Description:
Terminates the device driver (napwnt.sys for window NT/2000/XP,
nappci.vxd for Windows 95/98). In DOS version, this function is
provided just for uniformity or W32 program. It can only return a
NoError.
ꢀSyntax: void PCI_DriverClose(void)
ꢀInput Parameters: void
ꢀ Output Parameters: void
4.8 PCI_GetDriverVersion
ꢀ Description: Gets the version number of device driver
(nappci.vxd for windows 95/98, napwnt.sys for Windows NT/2000/XP)
ꢀ Syntax: WORD PCI_GetDriverVersion (WORD *wDriverVersion)
ꢀ Input Parameters:
*wDriverVersion: address of wDriverVersion.
WDriverVersion = 200[hex] → Version 2.00
ꢀ Return Value:
NotError: OK
NotFoundBoard: can’t detect the existence of P16R16/P8R8
DriverCallError: can’t open the NAPPCI.VXD in Windows 95/98
Can’t open the NAPWNT.SYS in Windows NT/2000/XP.
DriverHandleError: return handle is wrong when open device driver.
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …39
4.9 PCI_GetCongfigAddressSpace
ꢀ
Description: Reads configuration space for P16R16 and P8R8
board, then gets the content of Base Address0, Base Address1,
Base Address2, Base Address3, Base Address4 and Base
Address5.
ꢀ
Syntax:
WORD PCI_GetConfigAddressSpace (WORD wBoadNo, WORD
*wTypeID,WORD*wAddress0,WORD*wAddress1,WORD*wAdd-
ress2, WORD*wAddress3, WORD*wAddress4,WORD*wAddress5)
ꢀ
Input Parameters:
wBoardNo: The Board number for P16R16/P8R8 board.
*wTypeID: Address of wType
0: this board is PCI_P16R16
1:this board is PCI_P8R8
2:this board is PCI_TMC12
3:this board is PIO_DA16
4:this board is PIO_DA8
*wAddress0, *wAddress1, *wAddress2, *wAddress3, *wAddress4,
*wAddress5: the six base address of a PCI device will be stored in
these variables.
ꢀ
Return Value:
NoError: OK
FindBoardError: can’t detect the existence of P16R16/P8R8
ExceedBoardError: can’t open the NAPPCI.VXD in Windows 95/98
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …40
4.10 P16R16_DO
ꢀ
ꢀ
ꢀ
Description: Sends 16-bit data to D/O port of the P16R16.
Syntax: Void P16R16_DO(WORD BaseAddr.WORD OutData)
Input Parameters:
BaseAddr: D/O port base address.
OutData: the 16-bit data sent to D/O port
ꢀ
Return Value: void
ꢀ Demo Program: Please refer to page 42.
4.11 P16R16_DI
ꢀ
ꢀ
ꢀ
ꢀ
Description: Reads 16-bit data from P16R16’s D/I port.
Syntax: WORD P16R16_DI (WORD BaseAddr)
Input Parameters: BaseAddr: D/O port base address.
Return Value: the 16-bit value read from D/I port
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …41
• Demo Program
/******************************************************/
/* This program is developed by Turbo C 2.0
/******************************************************/
/* Demo 1: One P16R16 card demo.
/******************************************************/
#include "P16R16.H"
*/
*/
int main()
{
int
i,j;
WORD nVal;
float fVal;
WORD wBoards,wRetVal,wVal;
WORD wInData;
WORD wTypeID;
WORD wAddress0,wAddress1,wAddress2;
WORD wAddress3,wAddress4,wAddress5;
WORD P16R16_BaseAddress,P8R8_BaseAddress;
WORD wP16R16No,wP8R8No;
clrscr();
/* initiaing PCI-P16R16 card and detect how many P16R16/P8R8 card in PC */
wRetVal=PCI_DriverInit(&wBoards);
printf("Threr are %d PCI-P16R16/P8R8 Cards in this PC, tally.\n",wBoards);
if( wBoards==0 )
{
putch(0x07); putch(0x07); putch(0x07);
printf("There are no P16R16/P8R8 card in this PC !!!\n");
exit(0);
}
/* dump every P16R16/P8R8 card's configuration address space */
for(i=0; i<wBoards; i++)
{
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …42
wRetVal=PCI_GetConfigAddressSpace(i,&wTypeID,
&wAddress0,&wAddress1,&wAddress2, &wAddress3,&wAddress4,&wAddress5);
if( !wRetVal )
{
switch( wTypeID )
{
case 0: printf("==> %02d Board Name:PCI-P16R16\n",i);
P16R16_BaseAddress=wAddress2;
wP16R16No++;
break;
case 1: printf("==> %02d Board Name:PCI-P8R8\n",i);
P8R8_BaseAddress=wAddress2;
wP8R8No++;
break;
case 2: printf("==> %02d Board Name:PCI-TMC12\n",i);
break;
case 3: printf("==> %02d Board Name:PCI-DA16\n",i);
break;
case 4: printf("==> %02d Board Name:PCI-DA8\n",i);
break;
}
printf(" --> Addr0:%04x | Addr1:%04x | Addr2:%0x\n",
wAddress0,wAddress1,wAddress2);
printf(" --> Addr3:%04x | Addr4:%04x | Addr5:%0x\n\n",
wAddress3,wAddress4,wAddress5);
}
}
/* Getting the Driver version */
wRetVal=PCI_GetDriverVersion(&wVal);
printf("Driver Version=%x\n",wVal);
/* call a function to test if exact calling LIB */
nVal=PCI_ShortSub2(1,2);
printf("P180X_ShortSub2(1,2) = %d\n",nVal);
/* call another function to test if exact calling LIB */
fVal=PCI_FloatSub2(1.0,2.0);
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …43
printf("P180X_FloatSub2(1.0,2.0) = %f\n",fVal);
if( wP16R16No<1 )
{
putch(0x07);
printf("Please plug one PCI-P16R16 in PC !!!\n");
exit(0);
}
/*************************************/
/***** PCI-P16R16 DO/DO demo *****/
/*************************************/
printf("The PCI-P16R16 DO/DI testing !!!\n");
P16R16_DO(P16R16_BaseAddress,0x0000); /* Digital output */
delay(500); /* Delay a little time 500ms */
wInData=P16R16_DI(P16R16_BaseAddress); /* Digital input */
printf("Digital Output -> 0000H | Digital Input -> %04xH\n",wInData);
P16R16_DO(P16R16_BaseAddress,0xFFFF); /* Digital output */
delay(500); /* Delay a little time 500ms */
wInData=P16R16_DI(P16R16_BaseAddress); /* Digital input */
printf("Digital Output -> FFFFH | Digital Input -> %04xH\n",wInData);
P16R16_DO(P16R16_BaseAddress,0x5555); /* Digital output */
delay(500); /* Delay a little time 500ms */
wInData=P16R16_DI(P16R16_BaseAddress); /* Digital input */
printf("Digital Output -> 5555H | Digital Input -> %04xH\n",wInData);
P16R16_DO(P16R16_BaseAddress,0xAAAA); /* Digital output */
delay(500); /* Delay a little time 500ms */
wInData=P16R16_DI(P16R16_BaseAddress); /* Digital input */
printf("Digital Output -> AAAAH | Digital Input -> %04xH\n",wInData);
PCI_DriverClose();
return 0;
}
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …44
4.12 P8R8_DO
ꢀ Description: Sends 8-bit data to PCI-P8R8’s D/O port.
ꢀ Syntax: Void P8R8_DO(WORD BaseAddr.WORD OutData)
ꢀ Input Parameters:
BaseAddr: D/O port base address.
OutData: the 8 bit data sent to D/O port
ꢀ Return Value: void
• Demo Program: Please refer to page 46
4.13 P8R8_DI
ꢀ
ꢀ
ꢀ
Description: Reads 8-bit data from PCI-P8R8’s D/I port.
Syntax: WORD P8R8_DI (WORD wBaseAddr)
Input Parameters:
wBaseAddr: D/O port base address.
ꢀ
Return Value: the 8-bit value reading from D/I port
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …45
• Demo Program
/************************************************/
/* This program is developed by Turbo C 2.0
/***********************************************/
/* Demo 2: One P8R8 card demo.
/***********************************************/
#include "P16R16.H"
*/
*/
int main()
{
int
i,j;
WORD nVal;
float fVal;
WORD wBoards,wRetVal,wVal;
WORD wInData;
WORD wTypeID;
WORD wAddress0,wAddress1,wAddress2;
WORD wAddress3,wAddress4,wAddress5;
WORD P16R16_BaseAddress,P8R8_BaseAddress;
WORD wP16R16No,wP8R8No;
clrscr();
/* initiaing PCI-P16R16 card and detect how many P16R16/P8R8 card in PC */
wRetVal=PCI_DriverInit(&wBoards);
printf("Threr are %d P180X Cards in this PC\n",wBoards);
if( wBoards==0 )
{
putch(0x07); putch(0x07); putch(0x07);
printf("There are no P16R16/P8R8 card in this PC !!!\n");
exit(0);
}
/* dump every P16R16/P8R8 card's configuration address space */
for(i=0; i<wBoards; i++)
{
wRetVal=PCI_GetConfigAddressSpace(i,&wTypeID,
&wAddress0,&wAddress1,&wAddress2,
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …46
&wAddress3,&wAddress4,&wAddress5);
if( !wRetVal )
{
switch( wTypeID )
{
case 0: printf("==> %02d Board Name:PCI-P16R16\n",i);
P16R16_BaseAddress=wAddress2;
wP16R16No++;
break;
case 1: printf("==> %02d Board Name:PCI-P8R8\n",i);
P8R8_BaseAddress=wAddress2;
wP8R8No++;
break;
case 2: printf("==> %02d Board Name:PCI-TMC12\n",i);
break;
case 3: printf("==> %02d Board Name:PCI-DA16\n",i);
break;
case 4: printf("==> %02d Board Name:PCI-DA8\n",i);
break;
}
printf(" --> Addr0:%04x | Addr1:%04x | Addr2:%0x\n",
wAddress0,wAddress1,wAddress2);
printf(" --> Addr3:%04x | Addr4:%04x | Addr5:%0x\n\n",
wAddress3,wAddress4,wAddress5);
}
}
/* Getting the Driver version */
wRetVal=PCI_GetDriverVersion(&wVal);
printf("Driver Version=%x\n",wVal);
/* call a function to test if exact calling LIB */
nVal=PCI_ShortSub2(1,2);
printf("P180X_ShortSub2(1,2) = %d\n",nVal);
/* call another function to test if exact calling LIB */
fVal=PCI_FloatSub2(1.0,2.0);
printf("P180X_FloatSub2(1.0,2.0) = %f\n",fVal);
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …47
if( wP8R8No<1 )
{
putch(0x07);
printf("Please plug one PCI-P8R8 in PC !!!\n");
exit(0);
}
/***********************************/
/***** PCI-P8R8 DO/DO demo *****/
/***********************************/
printf("The PCI-P8R8 DO/DI testing !!!\n");
P8R8_DO(P8R8_BaseAddress,0x0000);
/* Digital output */
delay(500);
/* Delay a little time */
wInData=P8R8_DI(P8R8_BaseAddress);
/* Digital input */
printf("Digital Output -> 0000H | Digital Input -> %04xH\n",wInData);
P8R8_DO(P8R8_BaseAddress,0xFFFF);
/* Digital output */
/* Digital input */
delay(500);
/* Delay a little time */
wInData=P8R8_DI(P8R8_BaseAddress);
printf("Digital Output -> FFFFH | Digital Input -> %04xH\n",wInData);
P8R8_DO(P8R8_BaseAddress,0x5555);
/* Digital output */
/* Digital input */
delay(500);
/* Delay a little time */
wInData=P8R8_DI(P8R8_BaseAddress);
printf("Digital Output -> 5555H | Digital Input -> %04xH\n",wInData);
P8R8_DO(P8R8_BaseAddress,0xAAAA);
/* Digital output */
delay(500);
/* Delay a little time */
wInData=P8R8_DI(P8R8_BaseAddress);
/* Digital input */
printf("Digital Output -> AAAAH | Digital Input -> %04xH\n",wInData);
PCI_DriverClose();
return 0;
}
PCI-P8R8/P16R16/P16C16/P16POR16 User’s Manual (Ver.2.2, 2005/5/5) …48
|