GENWiki

Premier IT Outsourcing and Support Services within the UK

User Tools

Site Tools


archive:programming:gpib
   Using a Printer Port for Simple GPIB/IEEE-488 Operation
      All programs and documentation, Copyright 1990 by
                            Sydex
                        P.O. Box 5700
                      Eugene, OR  97405
                   Voice:  (503)  683-6033
                   FAX:    (503)  683-1622
                   Data:   (503)  683-1385
                    All Rights Reserved.     

INTRODUCTION

A while back (quite a while, actually) we had a need for the use of a color plotter for some 1-2-3 spreadsheet graphs that we were doing. A friend offered us the use of his HP 7470–but there was a catch. It seems that the thing had the HPIB/GPIB/IEEE-488 interface, not a straight serial or parallel connection.

This posed a problem. A GPIB card for a PC would set us back about $350–and there was no guarantee that 1-2-3 could even talk to the thing.

I recalled that the old Commodore Pet, as well as the Victor 9000 and the Osborne I could do a limited amount of GPIB interfacing with their parallel ports–so why not a PC? I even had an extra port that I wasn't using.

After looking at the IBM Tech Reference manual, I discovered that there's a problem with this. Although the IBM Parallel Printer adapter bills itself as being bi-directional (input and output), it's hard-wired for output mode only! Now, I probably could drive the plotter with an output-only port, but this was aesthetically unsatisfying. How could the parallel port be wired to be REALLY bi-directional?

The offending item appeared to be the 74LS374 IC used as the data output latch–the Output Enable (OE*) pin was grounded (wired active). However, there was a spare bit (bit 5) available on the 74LS174 6-bit latch used to control the printer handshaking lines. The solution was obvious–wire the unused bit to Output Enable on the LS374–viola!

Incidentally, if you're using an IBM PS/2, ignore the next section, IBM finally came to its senses and implemented the same change when it brought the PS/2 out–you can use the software that accompanies this documentation will operate with no changes.

ALTERING A PARALLEL ADAPTER

Once again, note that this applies to PC XT- and AT- type computers (ISA bus) only. If you've got a PS/2, your changed parallel port is standard equipment.

I'll discuss what has to be done to the simple $15.00 born-in- Taiwan parallel adapter, but note that these changes can be made to most other parallel adapters that use generic LSTTL IC's. This category also includes a number of monochrome display adapters.

You should know one end of a soldering iron from another; a short length of wire-wrap or other small-gauge wire and an X-acto or other hobbyist utility knife is useful. The change is simple and will take you about 15 minutes (assuming your iron is hot).

Most inexpensive parallel-only adapters come from the same basic design–12 SSI IC's on a half-slot card.

First, locate the 74LS374 IC adjacent to the printer connector on the rear of the board. Note that one end of the IC has a recessed notch on one end. Also locate the 74LS174 just above it. Note the pin numbering:

           74LS374                             74LS174            
                                                                  
            +-U-+                               +-U-+             
     Pin 1 [|   |] Pin 20                Pin 1 [|   |] Pin 16     
     Pin 2 [|   |] Pin 19                Pin 2 [|   |] Pin 15     
     Pin 3 [|   |] Pin 18                Pin 3 [|   |] Pin 14     
     Pin 4 [|   |] Pin 17                Pin 4 [|   |] Pin 13     
     Pin 5 [|   |] Pin 16                Pin 5 [|   |] Pin 12     
     Pin 6 [|   |] Pin 15                Pin 6 [|   |] Pin 11     
     Pin 7 [|   |] Pin 14                Pin 7 [|   |] Pin 10     
     Pin 8 [|   |] Pin 13                Pin 8 [|   |] Pin 9     
     Pin 9 [|   |] Pin 12                       +---+
    Pin 10 [|   |] Pin 11               
            +---+                       

Remembering that the pin numbering becomes "mirrored", turn the board over and locate pin 1 of the 74LS374. Note that it is connected by an enlargement of the solder pad to the wide ground trace above it. Being careful not to sever the wide ground trace, take your knife and separate the pin 1 pad from the ground trace. Check your work with a continuity tester.

Next, locate pin 7 on the 74LS174. Take a short piece of wire and connect pin 1 on the 74LS374 to this pin. Be neat and check your work.

That's it! Your card will still function normally as a printer adapter, but now has a true bi-directional mode of operation.

BUILDING A CABLE

The next task is to build a cable from the 25-pin parallel printer connection to a 24-pin male GPIB connector. Unfortunately, some "criss-crossing" of connections is necessary between the two, so you can either solder up a multiconductor cable between a male solder-cup DB25P connector and a 24 pin "Blue Ribbon" connector, or you can do what I did.

I took a length of 24-conductor ribbon cable and crimped a male DP25P IDC connector on one end and a male 24 pin "centronics" connector (Scotch No. 3548, for example) on the other end. I then took an inexpensive solder-type DB25 "breakout box" (cost: about $7.50) and performed my "wire weaving" in it.

In any case, you'll have to make sure the wiring works out this way:

      GPIB Pin      Signal Name     DB-25
      ========      ===========     =====
        1             -DATA 1         2
        2             -DATA 2         3
        3             -DATA 3         4
        4             -DATA 4         5
        5             -EOI            13
        6             -DAV            1
        7             -NRFD           16
        8             -NDAC           17
        9             -IFC            10
        10            -SRQ            15
        11            -ATN            14
        12            GND             18
        13            -DATA 5         6
        14            -DATA 6         7
        15            -DATA 7         8
        16            -DATA 8         9
        17            -REN            12
        18            GND             19
        19            GND             20
        20            GND             21
        21            GND             22
        22            GND             23
        23            GND             24
        24            GND             25

Check your work for accuracy!

THE SOFTWARE

We've supplied the source and object for a set of "C"-callable routines to manage the GPIB interface. We use Microsoft "C" and Microsoft MASM, though there should be no reason why this wouldn't also work with Borland's Turbo "C" and TASM. Note that we make use of the "small" memory model–you could alter this to use the huge, large or compact models by making sure that full segment-offset addresses are handled and the necessary segment register juggling is done.

Similarly, there's no reason that the package couldn't be modifed to work with BASIC or FORTRAN with appropriate changes.

The source file is the file "GPIB_C.ASM" and is written in 8086 assembly language. These are the routines that are included in it:

       int GPIB_Init( int io_port, int our_address)
       Initializes the GPIB interface. "io_port" is the address 
       of the printer adapter being used--usually 0x378 for the 
       first and 0x278 for the second.  If your adapter is part 
       of  a monochrome display adapter, its address is  0x3bc.  
       "Our_address"  is the GPIB talker/listener address  that 
       the PC is to consider to be its own.
       The interface is initialized; if no response can be had, 
       a  status of -1 is returned; a return of 0 signifies  no 
       error.
       int GPIB_Send( int listen, char what)
       This routine sends a single character to the GPIB device 
       addressed  by  "listen".  If this function  returns  -1, 
       there's a problem, otherwise the return value is 0.
       int GPIB_PutStr( int listen, char *string, int count)
       This routine sends a string of bytes to the GPIB  device 
       addressed by "listen".  "count" bytes are sent.  Returns 
       are -1 for failure, 0 for success.
       int GPIB_Stat(void);
       Simply  returns  the  value of the  GPIB  status  lines.  
       These  are  encoded in the lower 8 bits  of  the  return 
       value as:
             IFC REN EOI SRQ NDAC NRFD ATN DAV
       int GPIB_Get( int listen)
       Reads  a  character from the GPIB  device  addressed  by 
       "listen".  Returns the character or -1 if error.
       int GPIB_GetStr( int listen, char *buf)
       Reads  a  string of data from the  device  addressed  by 
       "listen".   Returns the number of bytes read into  "buf" 
       or -1 if error.
       int GPIB_SerPoll( int listen)
       Executes  a  Serial  Poll on  the  device  at  "listen".  
       Returns  the serial poll status in the lower 8  bits  of 
       the return value or -1 if error.
       int GPIB_PutAdd( char what)
       GPIB primitive.  Puts the value "what" out as an address 
       byte.  Returns 0 if success or -1 if failure.
       int GPIB_PutData( char what)
       GPIB  primitive.   Puts the value "what" out as  a  data 
       byte.  Returns 0 if success or -1 if failure.
       int GPIB_GetData(void);
       GPIB  primitive.  Reads the value on the GPIB bus  as  a 
       data value and returns it or -1 if failure.

As an example of usage, a terminate-and-stay-resident program, LPPLOT, is included to talk to an HP 7470 plotter disguised as LPT3. It works–but note that the GPIB version of the 7470 lacks arc and circle-drawing HPGL extensions.

MISCELLANY

Clearly, this scheme represents a way to get by on the cheap. This method will not support all GPIB functions, nor is it likely to be able to drive more than one GPIB device at a time–the output current drive capability just isn't there.

If I had it to do over again, I'd change the way I wired the cable and wire the ATN signal to pin 10 on the DB25 so that I could use the interrupt capability on the printer card to service asynchronous requests such as Parallel Poll.

But the thing does work–and with a little work, 2 PC's could be coupled to do full 8-bit transfers in either direction. Current printer port data transfer schemes "nibble" the data, rather than use the full data bus width.

USAGE AND LICENSING

License is hereby granted by Sydex for single-use non-commercial application of this code. Contact Sydex for commercial use and system-integration licensing rights. Any other use of this code or documentation is hereby prohibited without explicit written permission from Sydex.

Text and programs by Chuck Guzis

Certain products and terms referred to in this document are property of the following firms:

  Hewlett-Packard Corporation, International Business Machines, 
  Microsoft  Corporation,  Borland  International,  Centronics, 
  ITT-Cannon, 3M Corporation.



/data/webs/external/dokuwiki/data/pages/archive/programming/gpib.txt · Last modified: 2001/09/13 08:44 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki