United Kingdom:One Omega Drive, River Bend Technology Centre
ISO 9002 CertifiedNorthbank, Irlam, Manchester
M44 5BD United Kingdom
TEL: +44 (0)161 777 6611FAX: +44 (0)161 777 6622
Toll Free in United Kingdom: 0800-488-488
e-mail: sales@omega.co.uk
OMEGAnet®Online Service Internet e-mail
www.omega.com info@omega.com
It is the policy of OMEGA to comply with all worldwide safety and EMC/EMI regulations that
apply. OMEGA is constantly pursuing certification of its products to the European New Approach
Directives. OMEGA will add the CE mark to every appropriate device upon certification.
The information contained in this document is believed to be correct, but OMEGA Engineering, Inc. accepts
no liability for any errors it contains, and reserves the right to alter specifications without notice.
WARNING: These products are not designed for use in, and should not be used for, patient-connected applications.
OME-PIO-D56/D24
User Manual
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 1
In addition to this manual, the package includes the following items:
• One OME-PIO-D56(or OME-PIO-D24) card
• One software floppy diskette or CD
• One release note
Please read the release note first. Important information that could be given in release
note such as:
1. Where you can find the software driver & utility?
2. How to install software & utility?
3. The location of the diagnostic program?
4. FAQ
Attention!
If any one of these items is missing or damaged, please contact
Omega Engineering immediately. Save the shipping materials
and carton in case you want to ship or store the product in the
future.
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 5
2. Hardware configuration
2.1 Board Layout
CON3
DI/O
Port0
Port1
Port2
PIO-D24
PIO-D56
PCI BUS
only for PIO-D56
D/O
CON1
12
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 6
1920
D/I
CON2
12
1920
2.2 I/O Port Location
The OME-PIO-D56/OME-PIO-D24 consists of one 24-bit bi-directional port, one
16 bit input port and one 16 bit output port (only for OME-PIO-D56). The 24-bit port
supports three 8-bit groups: PA, PB & PC. Each 8-bit group can be individually
configured to function as either inputs or outputs. All groups using 24-bit bi-
directional ports are configured as inputs upon power-up or reset. The I/O port
locations are as follows:
Connector of
OME-PIO-D56/D24
CON3 (DI/O) Port0 Port1 Port2
Connector of OME-PIO-D56 Description
CON1 D/O
CON2 D/I
Refer to Sec. 2.1 for board layout & I/O port location.
Note: PC0, PC1, PC2 and PC3 can be used as interrupt signal source. Refer to Sec.
2.4 for more information.
PA0 ~ PA7 PB0 ~ PB7 PC0 ~ PC7
2.3 Enabling I/O Operation
2.3.1 DI/DO Port Architecture (CON3)
Upon power-up, all D/I/O port (CON3) operations are disabled. The RESET\
signal controls the enable/disable state of D/I/O port. Refer to Sec. 3.3.1 for more
information about RESET\ signal. The power-up states are as follows:
• All D/I/O operations are disabled
• All three D/I/O ports are configured as D/I port
• All D/O latch register are undefined.(refer to Sec. 2.3.2)
Initialization must be performed before using these D/I/Os. The recommended
steps are as follows:
Step 1: Find address-mapping of OME-PIO/PISO cards (refer to Sec. 3.1)
Step 2: Enable all D/I/O operations (refer to Sec. 3.3.1)
Step 3: Configure the three ports (in CON3) to their expected D/I/O state &
send the initial value to all D/O ports (refer to Sec. 3.3.8)
Refer to DEMO1.C for demo program.
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 7
I/O select (Sec. 3.3.7)
RESET\ (Sec. 3.3.1)
Data
(Sec. 3.3.8)
Data
(Sec. 3.3.8)
disable\
input Latch
Clock input
D/O latch CKT
disable
Buffer input
Clock input
D/I buffer CKT
D/I/O
• When the RESET\ is in Low-state Æ all D/I/O operations are disabled
• When the RESET\ is in High-state Æ all D/I/O operation are enabled.
• If D/I/O is configured as D/I port Æ D/I= external input signal
• If D/I/O is configured as D/O port Æ D/I = read back of D/O
• If D/I/O is configured as D/I port Æ send to D/O will change the D/O latch
register only. The D/I & external input signals will not change.
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 8
2.3.2 DI Port Architecture (CON2)
When the PC is powered up, all DI (CON2) port operations are disabled. The
RESET\ signal controls the enable/disable signal for the DI port. Refer to Sec. 3.3.1
for more information about the RESET\ signal.
• The RESET\ is in Low-state Æ all DI operations are disabled
• The RESET\ is in High-state Æ all DI operations are enabled
RESET\
disable
Data
Bufferinput
Clock input
CON2
D/I buffer CKT
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 9
2.3.3 DO Port Architecture (CON1)
When the PC is powered up, all DO port (CON1) operations are disabled. The
RESET\ signal controls the enable/disable signal for the DI port. Refer to Sec. 3.3.1
for more information about the RESET\ signal.
• The RESET\ is in Low-state Æ all DO operations are disabled
• The RESET\ is in High-state Æ all DO operations are enabled
The power-up states are as follows:
• All DO operations are disabled
• All output latches are cleared to Low-Level
RESET\
clear
Data
inputLatch
CON1
Clock input
D/O buffer CKT
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 10
2.4 Interrupt Operation
All PC0, PC1, PC2 and PC3 can be used as an interrupt signal sources. Refer to
Sec. 2.1 for PC0/PC1/PC2/PC3 location. The interrupt of OME-PIO-D56/OME-
PIO-D24 is level-trigger & Active_High. The interrupt signal can be programmed to
inverted or non-inverted state. The programming procedure is given as follows:
1. Make sure the initial level is High or Low
2. If the initial state is High Æ select the inverted signal (Sec. 3.3.6)
3. If the initial state is Low Æ select the
4. Enable the INT function (Sec. 3.3.4)
5. If the interrupt signal is active Æ program will transfer into the interrupt
service routine Æ if INT signal is High now Æ select the inverted input
Æif INT signal is Low now Æ select the non-inverted input
Refer to DEMO3.C & DEMO4.C for single interrupt source. Refer to
DEMO5.C for four interrupt sources.
If only one interrupt signal source is used, the interrupt service routine does not
have to identify the interrupt source. (Refer to DEMO3.C & DEMO4.C)
If there is more than one interrupt source, the interrupt service routine has to
identify the active signals via the following steps: (Refer to DEMO5.C)
1. Reads the new status of the interrupt signal source
2. Compares the new status with the old status to identify the active signals
3. If PC0 is active, service PC0 & non-inverter/inverted the PC0 signal
4. If PC1 is active, service PC1 & non-inverted/inverted the PC1 signal
non-inverted signal (Sec. 3.3.6)
5. If PC2 is active, service PC2 & non-inverted/inverted the PC2 signal
6. If PC3 is active, service PC3 & non-inverted/inverted the PC3 signal
7. Saves the new status to old status
Note: If the interrupt signal is too short, the new status may be the same as old
status. So the interrupt signal must be held active until the interrupt service
routine is executed. This hold time is different for different operating systems. It
can be as a short as micro-second or as a long as second. In general, 20ms is
enough for most operating systems.
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 11
2.4.1 Interrupt Block Diagram of OME-PIO-
D56/D24
INT_CHAN_0
INT\
Level_trigger
The interrupt output signal of OME-PIO-D56/OME-PIO-D24, INT\ is
Level_trigger & Active_Low. If the INT\ generates a low pulse, the OME-PIO-
D56/OME-PIO-D24 will interrupt the PC only once. If the INT\ is fixed in low level,
the OME-PIO-D56/OME-PIO-D24 will interrupt the PC continuously.
INT_CHAN_0/1/2/3 must be controlled in a pulse type signals. It must be fixed in
low level state normally and generate a high pulse to interrupt the PC.
The priority of INT_CHAN_0/1/2/3 is the same. If all these four signals are active
at the same time, then INT\ will be active only one time. So the interrupt service
INT_CHAN_1
INT_CHAN_2
INT_CHAN_3
initial_low
active_high
routine has to read the status of all interrupt channels for a multi-channel interrupt.
Refer to Sec. 2.4 for mare information.
DEMO5.C → for multi-channel interrupt source
If only one interrupt source is used, the interrupt service routine does not have to read
the status of interrupt source. The demo programs DEMO3.C and DEMO4.C are
designed for single-channel interrupt demo, as follows:
DEMO3.C → for INT_CHAN_0 only (PC0 initial low)
DEMO4.C → for INT_CHAN_0 only (PC0 initial high)
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 12
2.4.2 INT_CHAN_0/1/2/3
INT_CHAN_0 (1/2/3)
PC0(PC1/PC2/PC3)
Inverted/Noninverted select
INV0(1/2/3)
Enable/Disable select
EN0(1/2/3)
The INT_CHAN_0 must normally be fixed in low level state and generate a
high pulse to interrupt the PC.
The EN0 (EN1/EN2/EN3) can be used to enable/disable the INT_CHAN_0(1/2/3)
as follows : (Refer to Sec. 3.3.4)
EN0 (1/2/3) = 0 → INT_CHAN_0(1/2/3) = disable
EN0 (1/2/3) = 1 → INT_CHAN_0(1/2/3) = enable
The INV0 can be used to invert/non-invert the PC0 (1/2/3) as follows: (Refer to
Sec.3.3.6)
INV0 (1/2/3) = 0 → INT_CHAN_0(1/2/3) = inverted state of PC0 (1/2/3)
INV0 (1/2/3) = 1 → INT_CHAN_0(1/2/3) = non-inverted state of PC0 (1/2/3)
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 13
2.4.3 Initial_high, active_low Interrupt source
If the PC0 is a initial_high, active_low signal, the interrupt service routine
should use INV0 to invert/non-invert the PC0 for high_pulse generation as follows:
(Refer to DEMO4.C)
Initial setting:
now_int_state=1; /* initial state for PC0 */
outportb(wBase+0x2a,0); /* select the inverted PC0 */
void interrupt irq_service()
{
if (now_int_state==1) /* now PC0 is changed to LOW */(a)
{ /* --> INT_CHAN_0=!PC0=HIGH now */
COUNT_L++; /* find a LOW_pulse (PC0) */
If((inport(wBase+7)&1)==0)/* the PC0 is still fixed in LOW */
{ /* Æ need to generate a high_pulse */
outportb(wBase+0x2a,1);/* INV0 select the non-inverted input */(b)
/* INT_CHAN_0=PC0=LOW --> */
/* INT_CHAN_0 generate a high_pulse */
now_int_state=0; /* now PC0=LOW */
}
else now_int_state=1; /* now PC0=HIGH */
/* don’t have to generate high_pulse */
}
else /* now PC0 is changed to HIGH */(c)
{ /* --> INT_CHAN_0=PC0=HIGH now */
COUNT_H++; /* find a HIGH_pulse (PC0) */
If((inport(wBase+7)&1)==1)/* the PC0 is still fixed in HIGH */
{ /* need to generate a high_pulse */
outportb(wBase+0x2a,0);/* INV0 select the inverted input */(d)
/* INT_CHAN_0=!PC0=LOW --> */
/* INT_CHAN_0 generate a high_pulse */
now_int_state=1; /* now PC0=HIGH */
}
else now_int_state=0; /* now PC0=LOW */
/* don’t have to generate high_pulse */
}
if (wIrq>=8) outportb(A2_8259,0x20);
outportb(A1_8259,0x20);
}
PC0
(a)(b)(c)(d)
INV0
INT_CHAN_0
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 14
2.4.4 Initial_low, active_high Interrupt source
If the PC0 is a initial_low, active_high signal, the interrupt service routine
should use INV0 to inverted/non-inverted the PC0 for high_pulse generation as
follows: (Refer to DEMO3.C)
Initial setting:
now_int_state=0; /* initial state for PC0 */
outportb(wBase+0x2a,1); /* select the non-inverted PC0 */
void interrupt irq_service()
{
if (now_int_state==1) /* now PC0 is changed to LOW */(c)
{ /* --> INT_CHAN_0=!PC0=HIGH now */
COUNT_L++; /* find a LOW_pulse (PC0) */
If((inport(wBase+7)&1)==0)/* the PC0 is still fixed in LOW */
{ /* Æ need to generate a high_pulse */
outportb(wBase+0x2a,1);/* INV0 select the non-inverted input */(d)
/* INT_CHAN_0=PC0=LOW --> */
/* INT_CHAN_0 generate a high_pulse */
now_int_state=0; /* now PC0=LOW */
}
else now_int_state=1; /* now PC0=HIGH */
/* don’t have to generate high_pulse */
}
else /* now PC0 is changed to HIGH */(a)
{ /* --> INT_CHAN_0=PC0=HIGH now */
COUNT_H++; /* find a High_pulse (PC0) */
If((inport(wBase+7)&1)==1)/* the PC0 is still fixed in HIGH */
{ /* need to generate a high_pulse */
outportb(wBase+0x2a,0);/* INV0 select the inverted input */(b)
/* INT_CHAN_0=!PC0=LOW --> */
/* INT_CHAN_0 generate a high_pulse */
now_int_state=1; /* now PC0=HIGH */
}
else now_int_state=0; /* now PC0=LOW */
/* don’t have to generate high_pulse */
}
if (wIrq>=8) outportb(A2_8259,0x20);
outportb(A1_8259,0x20);
}
PC0
(a)(b)(c)(d)
INV0
INT_CHAN_0
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 15
2.4.5 Muliti-Interrupt Source
Assume: PC0 is initial Low, active High,
PC1 is initial High, active Low
PC2 is initial Low, active High
PC3 is initial High, active Low
as follows :
PC0
PC1
PC2
PC3
PC0 & PC1 are
active at the same
time.
PC2 & PC3 are
active at the same
time.
Refer to DEMO5.C for source program. All these four falling-edge & rising-edge
can be detected by DEMO5.C.
PC0 & PC1 are
return to normal
at the same time.
PC2 & PC3 are
return to normal at
the same time.
Note: When the interrupt is active, the user program has to identify the active
signals. These signals may be active at the same time. The interrupt service
routine has to service all active signals at the same time.
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 16
void interrupt irq_service()
{
new_int_state=inportb(wBase+7)&0x0f; /* read all interrupt state */
int_c=new_int_state^now_int_state; /* compare which interrupt */
/* signal be change */
if ((int_c&0x1)!=0) /* INT_CHAN_0 is active */
{
if ((new_int_state&0x01)!=0) /* now PC0 change to high */
{
CNT_H1++;
}
else /* now PC0 change to low */
{
CNT_L1++;
}
invert=invert^1; /* to generate a high pulse */
}
if ((int_c&0x2)!=0)
{
if ((new_int_state&0x02)!=0) /* now PC1 change to high */
{
CNT_H2++;
}
else /* now PC1 change to low */
{
CNT_L2++;
{
invert=invert^2; /* to generate a high pulse */
}
if ((int_c&0x4)!=0)
{
If ((new_int_state&0x04)!=0) /* now PC2 change to high */
{
CNT_H3++;
}
else /* now PC2 change to low */
{
CNT_L3++;
}
invert=invert^4; /* to generate a high pulse */
}
if ((int_c&0x8)!=0)
{
if ((new_int_state&0x08)!=0) /* now PC3 change to high */
{
CNT_H4++;
{
else /* now PC3 change to low */
{
CNT_L4++;
}
invert=invert^8; /* to generate a high pulse */
}
now_int_state=new_int_state;
outportb(wBase+0x2a,invert);
if (wIrq>=8) outportb(A2_8259,0x20);
outportb(A1_8259,0x20);
}
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 17
2.5 Daughter Boards
2.5.1 OME-DB-37
The OME-DB-37 is a general purpose daughter board for D-sub 37 pins,
designed for an easy-wiring connection.
2.5.2 OME-DN-37
The OME-DN-37 is a general purpose daughter board for OME-DB-37 with DIN-
Rail Mounting. It is designed for easy-wiring connection..
37pin cable
OME-DN-37
2.5.3 OME-DB-8125
The OME-DB-8125 is a general purpose screw terminal board. It is designed for
easy wire connection. There is one D-Sub37 & two 20-pin flat-cable headers on the
OME-DB-8125.
37pin cable
OME-DB-8125
(D-Sub 37 or
20-pin flat-cable header)
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 18
2.5.4 OME-ADP-20/PCI
The OME-ADP-20/PCI is an extender for 20-pin header. One side of OME-
ADP-20/PCI connects to a 20-pin header. The other side mounts on the PC chassis as
follows:
NOTE: Please choose the suitable extender for your application
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 19
2.5.5 OME-DB-24PD Isolated Input Board
The OME-DB-24PD is a 24 channel isolated digital input daughter board. The
optically isolated inputs of the OME-DB-24PD consist of a bi-directional opto-
coupler with a resistor for current sensing. Use the OME-DB-24PD to sense DC
signals from TTL levels up to 24V or use the OME-DB-24PD to sense a wide range
of AC signals. Use this board to isolate the computer from large common-mode
voltages, ground loops and transient voltage spikes that often occur in industrial
environments.
OME-PIO-D56/D24
Opto-Isolated
OME-PIO-D56/D24
OME-DB-24PD
AC or DC Signal
0V to 24V
+
-
OME-DB-24PD
50-pin flat-cable header Yes
D-sub 37-pin header Yes
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 20
2.5.6 OME-DB-24RD Relay Board
The OME-DB-24RD, a 24 channel relay output board, consists of 24 form C
relays for efficient, programmable load switching. The relays are energized by
applying a 12V/24V signal to the appropriate relay channel on the 50-pin flat
connector. There are 24 enunciator LEDs for each relay which light when their
associated relay is activated.
Form C Relay
Normal Open
Normal Close
Com
OME-PIO-
OME-DB-24RD
D56/PIO-D24
Note:
Channel : 24 Form C Relay
Relay: Switch up to 0.5A at 110ACV
or 1A at 24DCV
OME-DB-24RD
50-pin flat-cable header Yes
D-sub 37-pin header Yes
OME-DB-24R, OME-DB-24RD 24*Relay (120V, 0.5A)
OME-DB-24PR,OME-DB-24PRD 24* Power Relay (250V, 5A)
Note. Refer to Sec. 3.1 for more information about wBase.
Aux0=PC0, Aux1=PC1, Aux2=PC2, Aux3=PC3, Aux7~4=Aux-ID. Refer to
DEMO5.C for more information. The Aux 0~3 are used as interrupt source. The
interrupt service routine has to read this register for interrupt source identification.
Refer to Sec. 2.5 for more information.
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 35
3.3.6 Interrupt Polarity Control Register
(Read/Write): wBase+0x2A
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 0 0 0 INV3 INV2 INV1 INV0
Note. Refer to Sec. 3.1 for more information about wBase.
INV0=1Æ select the non-inverted signal from PC0
INV0=0Æ select the inverted signal from PC0
outportb(wBase+0x2a,0x0f); /* select the non-inverted input PC0/1/2/3 */
outportb(wBase+0x2a,0x00); /* select the inverted input of PC0/1/2/3 */
outportb(wBase+0x2a,0x0e); /* select the inverted input of PC0 */
/* select the non-inverted input PC1/2/3 */
outportb(wBase+0x2a,0x0c); /* select the inverted input of PC0/1 */
/* select the non-inverted input PC2/3 */
Refer to Sec. 2.4 for more information.
Refer to DEMO5.C for more information.
3.3.7 I/O Selection Control Register
(Write): wBase+0xcc
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 0 0 0 0 Port2 Port1 Port0
Note. Refer to Sec. 3.1 for more information about wBase.
Port? = 1Æ this port is used as a D/O port
Port? = 0Æ this port is used as a D/I port
outportb(wBase+0xcc,0x00); /* configure Port0/1/2 as D/I port */
outportb(wBase+0xcc,0x04); /* configure Port0/1 as D/I port */
/* configure Port2 as D/O port */
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 36
3.3.8 Read/Write 8-bit data Register
(Read/Write):wBase+0xc0/0xc4/0xc8/0xd0/0xd4
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
D7 D6 D5 D4 D3 D2 D1 D0
Note. Refer to Sec. 3.1 for more information about wBase.
There are five/three 8-bit I/O ports in the OME-PIO-D56/OME-PIO-D24. Each
port is easy to read/write to by access to their own data registers.
outportb(wBase+0xc0,Val); /* write to D/O port */
Val=inportb(wBase+0xc0); /* read from D/I port */
outportb(wBase+0xcc,0x07); /* configure Port0~Port2 as DO port */
outportb(wBase+0xc0,i1); /* write to Port0 */
outportb(wBase+0xc0,i2); /* write to Port1 */
outportb(wBase+0xc0,i3); /* write to Port2 */
outportb(wBase+0xcc,0x01); /* configure Port0 as DO port */
/* Port1~Port2 as DI port */
outportb(wBase+0xc0,i1); /* write to Port0 */
j2=inportb(wBase+0xc4); /* read Port1 */
j3=inportb(wBase+0xc8); /* read Port2 */
l=inportb(wBase+0xd0); /* read CON2 Low byte */
h=inportb(wBase+0xd4); /* read CON2 High byte */
Val=(h<<8)+l; /* Val is 16 bit data */
outportb(wBase+0xd0,Val); /* write to CON1 Low byte */
outportb(wBase+0xd4,(Val>>8)); /* write to CON1 high byte */
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 37
4. Demo program
It is recommended to read the release notes first. Important information will be given
in release note as follows:
1. Where you can find the software driver & utility?
2. How to install software & utility?
3. Where is the diagnostic program?
4. FAQs
There are many demo programs available on the software floppy disk or CD.
After the software installation, the driver will be installed into disk as follows:
• \TC\*.* Æ for Turbo C 2.xx or above
• \MSC\*.* Æ for MSC 5.xx or above
• \BC\*.* Æ for BC 3.xx or above
• \TC\LIB\*.* Æ for TC library
• \TC\DEMO\*.* Æ for TC demo program
• \TC\LIB\Large\*.* Æ TC large model library
• \TC\LIB\Huge\*.* Æ TC huge model library
• \TC\LIB\Large\PIO.H Æ TC declaration file
• \TC\\LIB\Large\TCPIO_L.LIB Æ TC large model library file
• \TC\LIB\Huge\PIO.H Æ TC declaration file
• \TC\\LIB\Huge\TCPIO_H.LIB Æ TC huge model library file
• \MSC\LIB\Large\PIO.H Æ MSC declaration file
• \MSC\LIB\Large\MSCPIO_L.LIB Æ MSC large model library file
• \MSC\LIB\Huge\PIO.H Æ MSC declaration file
• \MSC\\LIB\Huge\MSCPIO_H.LIB Æ MSC huge model library file
• \BC\LIB\Large\PIO.H Æ BC declaration file
• \BC\LIB\Large\BCPIO_L.LIB Æ BC large model library file
• \BC\LIB\Huge\PIO.H Æ BC declaration file
• \BC\\LIB\Huge\BCPIO_H.LIB Æ BC huge model library file
NOTE: The library is validated for all OME-PIO/PISO series cards.
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 38
4.1 PIO_PISO
/* ------------------------------------------------------------ */
/* Find all PIO_PISO series cards in this PC system */
/* step 1 : plug all PIO_PISO cards into PC */
/* step 2 : run PIO_PISO.EXE */
/* ------------------------------------------------------------ */
#include "PIO.H"
WORD wBase,wIrq;
WORD wBase2,wIrq2;
int main()
{
int i,j,j1,j2,j3,j4,k,jj,dd,j11,j22,j33,j44;
WORD wBoards,wRetVal;
WORD wSubVendor,wSubDevice,wSubAux,wSlotBus,wSlotDevice;
char c;
float ok,err;
clrscr();
wRetVal=PIO_DriverInit(&wBoards,0xff,0xff,0xff); /*for PIO-PISO*/
printf("\nThrer are %d PIO_PISO Cards in this PC",wBoards);
if (wBoards==0 ) exit(0);
NOTE: the PIO_PISO.EXE is valid for all PIO/PISO cards. The user can execute
the PIO_PISO.EXE to get the following information:
• List all PIO/PISO cards installed in this PC
• List all resources allocated to every PIO/PISO cards
• List the wSlotBus & wSlotDevice for specified PIO/PISO card identification.
(Refer to Sec. 3.2 for more information)
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 39
4.1.1 PIO_PISO.EXE for Windows
User can find this utility in the company CD or floppy disk. It is useful for all
OME-PIO/PISO series card.
After executing the utility, detailed information for all OME-PIO/PISO cards that
installed in the PC will be show as follows:
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 40
4.2 DEMO1
/* demo 1 : D/O demo of CON3 */
/* step 1 : connect a OME-DB-24C to CON3 of OME-PIO-D56/D24 */
/* step 2 : run DEMO1.EXE */
/* step 3 : LEDs of OME-DB-24C will turn on sequentially */
/* -------------------------------------------------------------- */
#include "PIO.H"
WORD wBase,wIrq;
int main()
{
int i1,i2,i3;
long i;
WORD wBoards,wRetVal,t1,t2,t3,t4,t5,t6;
WORD wSubVendor,wSubDevice,wSubAux,wSlotBus,wSlotDevice;
char c;
clrscr();
/* step1 : find address-mapping of PIO/PISO cards */
wRetVal=PIO_DriverInit(&wBoards,0x80,0x01,0x40);/* for OME-PIOD56/D24*/
printf("\n(1) Threr are %d OME-PIO-D56/D24 Cards in this PC",wBoards);
if ( wBoards==0 ) exit(0);
printf("\n\n-------------- The Configuration Space --------------");
for(i=0;i<wBoards;i++)
{
PIO_GetConfigAddressSpace(i,&wBase,&wIrq,&wSubVendor,
&wSubDevice,&wSubAux,&wSlotBus,&wSlotDevice);
printf("\nCard_%d:wBase=%x,wIrq=%x,subID=[%x,%x,%x],SlotID=
[%x,%x]",i,wBase,wIrq,wSubVendor,wSubDevice,
wSubAux,wSlotBus,wSlotDevice);
printf(" --> ");
ShowPioPiso(wSubVendor,wSubDevice,wSubAux);
}
PIO_GetConfigAddressSpace(0,&wBase,&wIrq,&t1,&t2,&t3,&t4,&t5);
/* select card_0 */
/* step2 : enable all D/I/O port */
outportb(wBase,1); /* /RESET -> 1 */
/* step3 : configure I/O direction */
outportb(wBase+0xcc,0x07); /* set CON3 as D/O ports */
i=1;
for (;;)
{
i1=i&0xff;
i2=(i>>8)&0xff;
i3=(i>>16)&0xff;
outportb(wBase+0xc0,i1);
outportb(wBase+0xc4,i2);
outportb(wBase+0xc8,i3);
delay(10000);
i=i<<1;
i=i&0x0ffffff;
if (i==0) i=1;
if (kbhit()!=0) break;
}
PIO_DriverClose();
}
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 41
4.3 DEMO2
/* demo 2 : DI/O demo of CON1, CON2 & CON3 */
/* step 1 : connect OME-DB-24P to CON3 of OME-PIO-D56/D24 */
/* : connect CON1 t0 CON2 of OME-PIO-D56 */
/* step 2 : run DEMO2.EXE */
/* step 3 : check the information on screen D/I will same as D/O */
/* : check the result on screen will same as CON3 input */
/* -------------------------------------------------------------- */
#include "PIO.H"
WORD wBase,wIrq;
int main()
{
int i1,i2,i3,j1,j2,j3;
WORD wBoards,wRetVal,t1,t2,t3,t4,t5,t6;
WORD wSubVendor,wSubDevice,wSubAux,wSlotBus,wSlotDevice;
char c;
long i;
clrscr();
/* step1 : find address-mapping of PIO/PISO cards */
.
.
/* step2 : enable all D/I/O port */
outportb(wBase,1); /* /RESET -> 1 */
/* step3 : configure I/O direction */
outportb(wBase+0xcc,0x00); /* set CON3 as D/I ports */
i=1;
for (;;)
{
gotoxy(1,7);
i1=i&0xff;
i2=(i>>8)&0xff;
outportb(wBase+0xd0,i1);
outportb(wBase+0xd4,i2);
j1=inportb(wBase+0xd0);
j2=inportb(wBase+0xd4);
printf("\nDO = [%2x,%2x], DI = [%2x,%2x]",i2,i1,j2,j1);
if ((j1!=i1)||(j2!=i2))
{
printf("\n\nError ......");
}
else printf("\nO.K. ......");
j1=inportb(wBase+0xc0);
j2=inportb(wBase+0xc4);
j3=inportb(wBase+0xc8);
printf("\n\nD/I of CON3 [PA, PB, PC] = [%2x,%2x,%2x] ",j1,j2,j3);
i=i<<1;
i=i&0x0ffff;
if (i==0) i=1;
if (kbhit()!=0) return;
}
PIO_DriverClose();
}
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 42
4.4 DEMO3
/* demo 3 : Count high pulse of PC0 */
/* (initial Low & active High) */
/* step 1 : run DEMO3.EXE */
/* -------------------------------------------------------------- */
outportb(wBase+5,1); /* enable interrupt (PC0) */
now_int_state=0; /* now ini_signal is low */
outportb(wBase+0x2a,1); /* select the non-inverte */
enable();
}
void interrupt irq_service()
{
if (now_int_state==1) /* now PC0 change to low */
{ /* INT_CHAN_0 = !PC0 */
if ((inportb(wBase+7)&1)==0) /* PC0 still fixed in low */
{ /* need to generate a high pulse */
outportb(wBase+0x2a,1); /* INV0 select noninverted input */
now_int_state=0; /* now PC0=low */
}
else now_int_state=1; /* now PC0=High */
}
else /* now PC0 change to high */
{ /* INT_CHAN_0 = PC0 */
COUNT++;
if ((inportb(wBase+7)&1)==1) /* PC0 still fixed in high */
{ /* need to generate a high pulse */
outportb(wBase+0x2a,0); /* INV0 select inverted input */
now_int_state=1; /* now PC0=high */
}
else now_int_state=0; /* now PC0=low */
}
if (wIrq>=8) outportb(A2_8259,0x20);
outportb(A1_8259,0x20);
}
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 44
4.5 DEMO4
/* demo 4 : Count high pulse of PC0 */
/* (initial High & active Low) */
/* step 1 : run DEMO4.EXE */
/* -------------------------------------------------------------- */
static void interrupt irq_service();
int COUNT,irqmask,now_int_state;
int main()
{
int i,j;
WORD wBoards,wRetVal,t1,t2,t3,t4,t5,t6;
WORD wSubVendor,wSubDevice,wSubAux,wSlotBus,wSlotDevice;
char c;
clrscr();
/* step1 : find address-mapping of PIO/PISO cards */
.
.
/* select card_0 */
/* step2 : enable all D/I/O port */
outportb(wBase,1); /* /RESET -> 1 */
/* step3 : configure I/O direction */
outportb(wBase+0xcc,0x00); /* set CON3 as D/I ports */
COUNT=0;
init_high();
printf("\n\n***** show the count of Low_pulse *****\n");
for (;;)
{
gotoxy(1,7);
printf("\nCOUNT=%d",COUNT);
if (kbhit()!=0) break;
}
outportb(wBase+5,0); /* disable all interrupt */
PIO_DriverClose();
}
/* Use PC0 as external interrupt signal */
WORD init_high()
{
disable();
outportb(wBase+5,0); /* disable all interrupt */
if (wIrq<8)
{
irqmask=inportb(A1_8259+1);
outportb(A1_8259+1,irqmask & 0xff ^ (1<<wIrq));
setvect(wIrq+8,irq_service);
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 45
outportb(wBase+5,1); /* enable interrupt (PC0) */
now_int_state=1; /* now ini_signal is high */
outportb(wBase+0x2a,0); /* select the inverte */
enable();
}
void interrupt irq_service()
{
if (now_int_state==1) /* now PC0 change to low */
{ /* INT_CHAN_0 = !PC0 */
COUNT++;
if ((inportb(wBase+7)&1)==0) /* PC0 still fixed in low */
{ /* need to generate a high pulse */
outportb(wBase+0x2a,1); /* INV0 select noninverted input */
now_int_state=0; /* now PC0=low */
}
else now_int_state=1; /* now PC0=High */
}
else /* now PC0 change to high */
{ /* INT_CHAN_0 = PC0 */
if ((inportb(wBase+7)&1)==1) /* PC0 still fixed in high */
{ /* need to generate a high pulse */
outportb(wBase+0x2a,0); /* INV0 select inverted input */
now_int_state=1; /* now PC0=high */
}
else now_int_state=0; /* now PC0=low */
}
if (wIrq>=8) outportb(A2_8259,0x20);
outportb(A1_8259,0x20);
}
OME-PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 46
4.6 DEMO5
/* demo 5 : Four interrupt source */
/* PC0 : initial Low , active High */
/* PC1 : initial High , active Low */
/* PC2 : initial Low , active High */
/* PC3 : initial High , active Low */
/* step 1 : run DEMO5.EXE */
/* -------------------------------------------------------------- */
static void interrupt irq_service();
int irqmask,now_int_state,new_int_state,invert,int_c,int_num;
int CNT_L1,CNT_L2,CNT_L3,CNT_L4;
int CNT_H1,CNT_H2,CNT_H3,CNT_H4;
int main()
{
int i,j;
WORD wBoards,wRetVal,t1,t2,t3,t4,t5,t6;
WORD wSubVendor,wSubDevice,wSubAux,wSlotBus,wSlotDevice;
char c;
clrscr();
/* step1 : find address-mapping of PIO/PISO cards */
.
.
/* select card_0 */
/* step2 : enable all D/I/O port */
outportb(wBase,1); /* /RESET -> 1 */
/* step3 : configure I/O direction */
outportb(wBase+0xcc,0x00); /* set CON3 as D/I ports */
init();
printf("\n***** show the count of pulse *****\n");
for (;;)
{
gotoxy(1,7);
printf("\n(CNT_L,CNT_H)=(%d,%d) (%d,%d) (%d,%d) (%d,%d)
%x",CNT_L1,CNT_H1,CNT_L2,CNT_H2,CNT_L3,CNT_H3,CNT_L4,CNT_H4,int_num);
if (kbhit()!=0) break;
}
outportb(wBase+5,0); /* disable all interrupt */
PIO_DriverClose();
}
/* Use PC0, PC1, PC2 & PC3 as external interrupt signal */
WORD init()
{
disable();
outportb(wBase+5,0); /* disable all interrupt */
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 47
CNT_L1=CNT_L2=CNT_L3=CNT_L4=0; /* Low_pulse counter */
CNT_H1=CNT_H2=CNT_H3=CNT_H4=0; /* High_pulse counter */
int_num=0;
outportb(wBase+5,0x0f); /* enable interrupt PC0,PC1 */
enable(); /* PC2,PC3 */
}
/* -------------------------------------------------------------- */
/* NOTE:1.The hold-time of INT_CHAN_0/1/2/3 must long enough */
/* 2.The ISR must read the interrupt status again to the */
/* active interrupt sources. */
/* 3.The INT_CHAN_0&INT_CHAN_1 can be active at the same time*/
/* -------------------------------------------------------------- */
void interrupt irq_service()
{
char c;
int_num++;
new_int_state=inportb(wBase+7)&0x0f; /* read all interrupt state */
int_c=new_int_state^now_int_state; /* compare which interrupt */
/* signal be change */
if ((int_c&0x1)!=0) /* INT_CHAN_0 is active */
{
if ((new_int_state&0x1)!=0)/* now PC0 is change to high */
{
CNT_H1++;
}
else /* now PC0 is change to low */
{
CNT_L1++;
}
invert=invert^1; /* to generate a high pulse */
}
if ((int_c&0x2)!=0) /* INT_CHAN_1 is active */
{
if ((new_int_state&0x2)!=0)/* now PC1 is change to high */
{
CNT_H2++;
}
PIO-D56/PIO-D24 User Manual (Ver.2.1, Oct/2003, PPH-005-21) ---- 48
else /* now PC1 is change to low */
{
CNT_L2++;
}
invert=invert^2; /* to generate a high pulse */
}
if ((int_c&0x4)!=0) /* INT_CHAN_2 is active */
{
if ((new_int_state&0x4)!=0)/* now PC2 is change to high */
{
CNT_H3++;
}
else /* now PC2 is change to low */
{
CNT_L3++;
}
invert=invert^4; /* to generate a high pulse */
}
if ((int_c&0x8)!=0) /* INT_CHAN_3 is active */
{
if ((new_int_state&0x8)!=0)/* now PC3 is change to high */
{
CNT_H4++;
}
else /* now PC3 is change to low */
{
CNT_L4++;
}
invert=invert^8; /* to generate a high pulse */
}
now_int_state=new_int_state;
outportb(wBase+0x2a,invert);
if (wIrq>=8) outportb(A2_8259,0x20);
outportb(A1_8259,0x20);
}
OME-PIO-D56/OME-PIO-D24 User Manual (Ver.2.1, Oct/2003) ---- 49
WARRANTY/DISCLAIMER
OMEGA ENGINEERING, INC. warrants this unit to be free of defects in materials and workmanship for a
period of 13 months from date of purchase. OMEGA’s WARRANTY adds an additional one (1) month
grace period to the normal one (1) year product warranty to cover handling and shipping time. This
ensures that OMEGA’s customers receive maximum coverage on each product.
If the unit malfunctions, it must be returned to the factory for evaluation. OMEGA’s Customer Service
Department will issue an Authorized Return (AR) number immediately upon phone or written request.
Upon examination by OMEGA, if the unit is found to be defective, it will be repaired or replaced at no
charge. OMEGA’s WARRANTY does not apply to defects resulting from any action of the purchaser,
including but not limited to mishandling, improper interfacing, operation outside of design limits,
improper repair, or unauthorized modification. This WARRANTY is VOID if the unit shows evidence of
having been tampered with or shows evidence of having been damaged as a result of excessive corrosion;
or current, heat, moisture or vibration; improper specification; misapplication; misuse or other operating
conditions outside of OMEGA’s control. Components which wear are not warranted, including but not
limited to contact points, fuses, and triacs.
OMEGA is pleased to offer suggestions on the use of its various products. However,
OMEGA neither assumes responsibility for any omissions or errors nor assumes liability for any
damages that result from the use of its products in accordance with information provided by
OMEGA, either verbal or written. OMEGA warrants only that the parts manufactured by it will be
as specified and free of defects. OMEGA MAKES NO OTHER WARRANTIES OR
REPRESENTATIONS OF ANY KIND WHATSOEVER, EXPRESS OR IMPLIED, EXCEPT THAT OF TITLE,
AND ALL IMPLIED WARRANTIES INCLUDING ANY WARRANTY OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. LIMITATION OF
LIABILITY: The remedies of purchaser set forth herein are exclusive, and the total liability of
OMEGA with respect to this order, whether based on contract, warranty, negligence,
indemnification, strict liability or otherwise, shall not exceed the purchase price of the
component upon which liability is based. In no event shall OMEGA be liable for
consequential, incidental or special damages.
CONDITIONS: Equipment sold by OMEGA is not intended to be used, nor shall it be used: (1) as a “Basic
Component” under 10 CFR 21 (NRC), used in or with any nuclear installation or activity; or (2) in medical
applications or used on humans. Should any Product(s) be used in or with any nuclear installation or
activity, medical application, used on humans, or misused in any way, OMEGA assumes no responsibility
as set forth in our basic WARRANTY/ DISCLAIMER language, and, additionally, purchaser will indemnify
OMEGA and hold OMEGA harmless from any liability or damage whatsoever arising out of the use of the
Product(s) in such a manner.
RETURN REQUESTS/INQUIRIES
Direct all warranty and repair requests/inquiries to the OMEGA Customer Service Department. BEFORE
RETURNING ANY PRODUCT(S) TO OMEGA, PURCHASER MUST OBTAIN AN AUTHORIZED RETURN
(AR) NUMBER FROM OMEGA’S CUSTOMER SERVICE DEPARTMENT (IN ORDER TO AVOID
PROCESSING DELAYS). The assigned AR number should then be marked on the outside of the return
package and on any correspondence.
The purchaser is responsible for shipping charges, freight, insurance and proper packaging to prevent
breakage in transit.
FOR W
ARRANTY
RETURNS, please have the
following information available BEFORE
contacting OMEGA:
1. Purchase Order number under which the product
was PURCHASED,
2. Model and serial number of the product under
warranty, and
3. Repair instructions and/or specific problems
relative to the product.
FOR NON-W
ARRANTY
REPAIRS,
consult OMEGA
for current repair charges. Have the following
information available BEFORE contacting OMEGA:
1. Purchase Order number to cover the COST
of the repair,
2. Model and serial number of the product, and
3. Repair instructions and/or specific problems
relative to the product.
OMEGA’s policy is to make running changes, not model changes, whenever an improvement is possible. This affords
our customers the latest in technology and engineering.
reproduced, translated, or reduced to any electronic medium or machine-readable form, in whole or in part, without the
prior written consent of OMEGA ENGINEERING, INC.