programmers resources
  http://www.intel-assembler.it/  (c)2017 intel-assembler.it   info@intel-assembler.it
 
Search :  
Lingua Italiana    English Language   
Index
 
just an empty assembly space
just an arrow Intel Platform
just an arrow Article & Guides
just an arrow Download Software


23/01/2009 Featured Article: How to remove Buzus Virus (permalink)




:::3373433:::
Bottone Scambio Directory Pubblicitaonline.it
Home Page | Articles & Guides | Download | Intel Platform | Contacts

Google
 


Bookmark and Share
Download 
Tell a friend



Intel i8255 PIO Programming Tutorial: Extracts

A practical use of the 8255 with basic programming

(by richard steven walz)

A collection of docs about the Intel 8255. There's a very interesting example of how to make your own experimental board using the 8255 / 74138 and other components, programming the thing in quickbasic.
This article is online from 2683 days and has been seen 17239 times





          Intel i8255 PIO Programming Tutorial: Extracts

-------------------------------------------------------------------------------

   From: Thomas Scherrer's Web Site at:
   http://cybernet.dk/users/tscherrer/z8/Z80_Home.htm & z8/8255pro.htm file.

-------------------------------------------------------------------------------
                                      
   24 BIT DIGITAL I/O PIO DETAILS
  
    PROGRAMMING INFORMATION
    
   The 8255 I/O PIO occupies (4) consecutive 8 bit I/O locations starting
   at BASE+0 and going to BASE+3.
   
   The structure of the addressing is as follows:
     * BASE+0 = Port A (read or write)
     * BASE+1 = Port B (read or write)
     * BASE+2 = Port C (read or write)
     * BASE+3 = Control Register (write only)
       
   The following is an overview of each of the three available modes:
   
   MODE 0 (Basic Input/Output):
     * (2) Eight bit ports and (2) 4 bit ports
     * Any port can be either input or output
     * Outputs are latched
     * Inputs are not latched
     * (16) different Input/Output configurations are possible in this
       mode
   
   MODE 1 (Strobed Input/Output):
     * (2) Groups (Group A and Group B)
     * Each group contains one 8 bit data port and (1) 4 bit control/data
       port
     * The 8 bit data port can be either input or output
     * Both inputs and outputs are latched
     * The 4 bit port is used for control and status of the 8 bit data
       port
   
   MODE 2 ( Strobed Bi-directional Bus I/O):
     * Used in Group A only
     * One 8 bit bi-directional bus port (Port A) and one 5 bit control
       port (Port C)
     * Both inputs and outputs are latched
     * The 5 bit control port (Port C) is used for control and status for
       the 8 bit, bi-directional bus port (Port A)
       
     _________________________________________________________________
                                      
   CONTROL WORD to define operation mode: (This word is written to
   base+3)
   
    D7 = 1  Designation of mode set flag

    D6  D5  Mode selection of Group A
    0   0  = mode 0
    0   1  = mode 1
    1   x  = mode 2

    D4  Input/Output selection of Port A
    0 = Output
    1 = Input

    D3  Input/Output selection of high order 4 bits of Port C
    0 = Output
    1 = Input

    D2  Mode selection of Group B
    0  = mode 0
    1  = mode 1

    D1  Input/Output selection of Port B
    0 = Output
    1 = Input

    D0  Input/Output selection of low order 4 bits of Port C
    0 = Output
    1 = Input

     _________________________________________________________________
                                           
   CONTROL WORD to set and reset bits in In/Out Port C (This word is
   written to base+3)
   
     D7 = 0  Bit set/reset flag 0 = Active.

     D6 D5 D4 Don't care.

     D3 D2 D1 Bit selection
     0  0  0  PC0
     0  0  1  PC1
     0  1  0  PC2
     0  1  1  PC3
     1  0  0  PC4
     1  0  1  PC5
     1  1  0  PC6
     1  1  1  PC7

     D0 Bit set/reset selection
     0 = Reset
     1 = Set

     _________________________________________________________________          
                             


    8255 PIO Pin Description:

                    _________    _________
                  _|         \__/         |_
             PA3 |_|1                   40|_| PA4
                  _|                      |_
             PA2 |_|2                   39|_| PA5
                  _|                      |_
             PA1 |_|3        8255       38|_| PA6
                  _|        82C55         |_
             PA0 |_|4                   37|_| PA7
                  _|                      |_
         --> /RD |_|5                   36|_| /WR (*NOTE)
                  _|                      |_
         --> /CS |_|6                   35|_| RES
                  _|                      |_
         -->  A1 |_|8                   33|_| D1
                  _|                      |_
         -->  A0 |_|9                   32|_| D2
                  _|                      |_
             PC7 |_|10                  31|_| D3
                  _|                      |_
             PC6 |_|11                  30|_| D4
                  _|                      |_
             PC5 |_|12                  29|_| D5
                  _|                      |_
             PC4 |_|13                  28|_| D6
                  _|                      |_
             PC0 |_|14                  27|_| D7
                  _|                      |_
             PC1 |_|15                  26|_| VCC
                  _|                      |_
             PC2 |_|16                  25|_| PB7
                  _|                      |_
             PC3 |_|17                  24|_| PB6
                  _|                      |_
             PB0 |_|18                  23|_| PB5
                  _|                      |_
             PB1 |_|19                  22|_| PB4
                  _|                      |_
             PB2 |_|20                  21|_| PB3
                   |______________________|


   For Z80 Use:
   (*note) If you use the CMOS version (82C55) then delay the /WR signal
   so it's active AFTER chipselect, you can use this:

   82C55 |_             ___
   PIN 36|_| ------*---|___|---- /WR from the CPU (Z80)
         |         |    R1
                   |                 Use thise values:
                  ---                -----------------
                  --- C1             CPU  4 MHz  8MHz
                   |                 C1   47p    33p
                   |                 R1   470E   330E
                  GND

  This is something I have found out my self, after looking the timing
  over for the Z80 with the 82C55, and 8255.


-------------------------------------------------------------------------------


   From Paul Oh's website: http://www.cs.columbia.edu/~paul


     -------------------------------------------------------------


                        8255 PPI IBM PC Interface Card
                                       
   Visit my new company: Boondog Automation FREE 8255 PCB Artwork, Code
   and Sections of the 70-page Applications Manual
   
   
   Introduction

   The 8255 Programmable Peripheral Interface (PPI) is a versatile and
   easy to construct circuit card the plugs into an available slot in
   your IBM PC. Such a card allows you to do both digital input and
   output (DIO) to your PC. For example, you may want to have your PC
   turn on a switch, or have a switch electronically activate your PC to
   execute a program. The 8255 has 3 8-bit TTL-compatiable I/O ports.
   Thus technically you could control up to 24 individual devices. For
   example, with the circuit description that follows, you could build a
   home security device, with a digital input detecting if someone rang
   your doorbell, and having a digital output turning on a light switch,
   the other remaining 22 DIOs could then be used to detect for sound
   detection (broken glass say), doors being opened, digitally dial 911,
   detect smoke etc. Hopefully this preamble has excited your curiosity
   and imagination. This article is broken down as follows:

     * Parts List with Potential Vendor Source
     * Theory of Operation
     * Construction
     * QBasic Programming
     * References For this card, Microsoft's QuickBasic will be used to
       do some simple programs.
       

   Parts List and Potential Vendor Source

       Below is a parts I used for my construction. Additionally, I list
       the source from which I bought it from, along with the vendor part
       number and cost (in 1995). I did some shopping around, and found
       these places to offer the best tradeoff between price and
       single-source parts availability - hopefully this saves you time!
       The first table is what is necessary to make a card. The second
       table is an additionally prototyping area circuit that interfaces
       with the card via a 40-pin ribbon cable. The parts in this table
       also include a simple testing circuit which is described later. A
       note about the Digikey parts: I did not find such a part in
       Jameco. I had these lying around in my parts box. Other similar
       sockets could be used. But I recommend that at least one be a
       wirewrap type, since I use both soldering and wirewrapping for the
       8255 Card circuit.
       

   CAPTION: TABLE 1A: 8255 CARD PARTS LIST
   
   PART DESCRIPTION VENDOR PART PRICE (1995) QUANTITY
   8255 PPI 40 PIN IC JAMECO #52732 3.25 1
   40 PIN WIREWRAP SOCKET JAMECO #41179 1.49 1
   74LS138 3-TO-8 DECODER JAMECO #48397 0.35 1
   16-PIN SOLDER SOCKET JAMECO #37372 0.14 1
   0.1 uF CAPACITORS JAMECO #15270 1.10 FOR 10 3
   40 PIN HEADER CONNECTOR DIGIKEY #CHW40G-HD 5.11 2
   40 PIN SOCKET CONNECTOR DIGIKEY #CS-C40T-ND 2.45 2
   2 ROW 8-POSITION JUMPER JAMECO #53575 0.55 1
   SHORTING BLOCKS JAMECO #19140 0.20 2
   PC BUS PROTOTYPING CARD JAMECO #21531 17.95 1
   RIBBON CABLE 40 PIN JAMECO #105726 1.09 3 FT
   WIRE WRAP
       
   CAPTION: TABLE 1B: BREADBOARD INTERFACE PARTS LIST
   
   PART DESCRIPTION VENDOR PART PRICE (1995) QUANTITY
   6 IN. SOLDERLESS BREADBOARD RADIO SHACK #276-174 12.49 2
   74LS04 HEX INVERTOR JAMECO #46316 0.29 1
   LEDS T1-3/4 JAMECO #34745 0.19 8
   220 OHM RESISTORS
   TERMINAL BLOCKS JAMECO #99426 0.59 14
       


   Theory of Operation

       This section is organized as follows:
          + The Base Address
          + The Control Modes
          + The Jumper Settings
       
   The Base Address
       This PC Interface Card plugs into any available 8 or 16-bit slot
       (also known as an AT-slot) on your PC's motherboard, just like a
       sound card or disk drive controller card does. Your CPU (Central
       Processing Unit) communicates with cards by knowing the card's
       address. From IBM's Technical Reference Manuals, one can learn
       that the motherboard allows for several available addresses for
       any cards you wish to plug into a slot. By physically using
       jumpers on the card, we can assign an address to the card. In
       software, we can tell the CPU what this address is (more about
       this in the Programming section).
       
   CAPTION: TABLE 2: EXPANSION SLOT ADDRESSES
   
       HEX ADDRESS (DEC) DESCRIPTION    HEX ADDRESS (DEC) DESCRIPTION
       218H-21FH (536-543) AVAILABLE    390H-39FH (906-927) AVAILABLE
       250H-277H (592-631) AVAILABLE    3AAH-3AFH (938-943) AVAILABLE
       280H-2EFH (640-751) AVAILABLE    3B0H-3BFH (944-959) AVAILABLE
       300H-31FH (768-799) AVAILABLE    3F8H-3FFH COM1:  (DON'T USE!)

       For notation purposes, a number with an H next to it denotes
       hexadecimal notation and plain numbers will denote denote plain
       decimal. For this card, I chose to use 280H (640 Decimal) for the
       address of the card. This is because many other cards tend to use
       the traditional 300H. By choosing 280H the probability of address
       conflict is a bit less. Thus 280H will known as the base address
       of the card. Of course, you can change this, by using the table
       above as a guide, and physically changing the jumper configuration
       on the board, as well as in your software program.
       
   Control Modes
       The 8255 allows for three distinct operating modes (Modes 0, 1 and
       2) as follows:
          + Mode 0: Ports A and B operate as either inputs or outputs and
            Port C is divided into two 4-bit groups either of which can
            be operated as inputs or outputs
          + Mode 1: Same as Mode 0 but Port C is used for handshaking and
            control
          + Mode 2: Port A is bidirectional (both input and output) and
            Port C is used for handshaking. Port B is not used.

       Each port is 8-bit TTL-compatiable. As such, the 8255 can
       conceivable be configured to control 24 devices (1 bit/device).
       The various modes can be set by writing a special value to the
       control port. The control port is Base Address + 3 (hence 640+3 =
       643 Decimal). The table below shows the special values needed to
       configure Ports A, B and C for either input or output:
       
   CAPTION: TABLE 3: 8255 (CONTROL) MODE CONFIGURATION (To Base + 3)
   
   CONTROL WORD (HEX) CONTROL WORD (DECIMAL) PORT A PORT B PORT C
            80                 128            OUT    OUT    OUT
            82                 130            OUT    IN     OUT
            85                 133            OUT    OUT    IN
            87                 135            OUT    IN     IN
            88                 136            IN     OUT    OUT
            8A                 138            IN     IN     OUT
            8C                 140            IN     OUT    IN
            8F                 143            IN     IN     IN

       As mentioned the Control Port is Base Address + 3. Port A is
       always at Base Address; Port B is Base Address + 1; Port C is Base
       Address + 2. Thus in our example Ports A, B and C are at 640, 641
       and 642 (Decimal) respectively. By writing say, 128 to the Control
       port will then configure the 8255 to have all three Ports set for
       output. This can be done using QuickBasic's OUT statement, for
       example:
       
   110 BaseAddress = 640
   120 PortA = BaseAddress
   130 ControlPort = BaseAddress + 3
   140 OUT ControlPort, 128
   150 OUT PortA, 1

       More software coding will be described later in the Programming
       Section.
       

   Jumper Settings, the 74LS138 and IBM Expansion Bus

       The 74LS138 is a 3-to-8 line decoder. It is a 16-pin IC, taking a
       3-bit word on pins 1, 2 and 3. This leads to 8 possible
       combinations, and explains how the jumper can be physically set to
       provide for the 8 possible card address settings mentioned above.
       Examining the schematic in the Construction Section along with the
       explanation that follows will provide more insight on how this
       physically works. If you examine any PC card that plugs into the
       expansion slot on your motherboard, you can count 31 pads
       (typically gold) on each side of the card.
   
       Altogether there are 62 pads on this card. Such cards are also
       known as 8-bit ISA Bus (XT-style) cards. Due to the upward
       compatiability of PC systems, such cards can plug into expansion
       slots on XTs, ATs, 386s, 486s and Pentiums. The following diagram
       shows the pinouts of such expansion slots:

       Getting back to the 74LS138... address lines A8 and A9 on the bus
       drive the control inputs to the 74LS138. Additionally, AEN
       (Address Enable), located at pin A11 is low when the card is
       recognized by the microprocessor. When A8 and A11 are low and A9 is
       high, the 74LS138 will decode bus address lines A5, A6 and A7
       which are the 3-bit inputs to the 74LS138.      o
                                                       |
    ----------------------------------------           |
    74138  (Added by rstevew@armory.com)               |
                                                       |
    1-of-8 inverting decoder/demultiplexer.            |
                                                       |
                             +---+-----+---+---+---+---+
                             |   |     |   |   |   |
                             v   v     v   v   v   v
                             A9  A8   A11  A5  A6  A7
        +----------+       +-------------------------++-------------------+
     S0 |1  +--+ 16| VCC   |EN1|/EN2|/EN3| S2| S1| S0||/Y0|/Y1|/Y2|...|/Y7|
     S1 |2       15| /Y0   |---+----+----+---+---+---++---+---+---+---+---|
     S2 |3       14| /Y1   | 0 | X  |  X | X | X | X || 1 | 1 | 1 | 1 | 1 |
   /EN3 |4   74  13| /Y2   | 1 | 1  |  X | X | X | X || 1 | 1 | 1 | 1 | 1 |
   /EN2 |5  138  12| /Y3   | 1 | 0  |  1 | X | X | X || 1 | 1 | 1 | 1 | 1 |
    EN1 |6       11| /Y4   +---+----+----+---+---+---++---+---+---+---+---+
    /Y7 |7       10| /Y5   | 1 | 0  |  0 | 0 | 0 | 0 || 0 | 1 | 1 | 1 | 1 |
    GND |8        9| /Y6   | 1 | 0  |  0 | 0 | 0 | 1 || 1 | 0 | 1 | 1 | 1 |
        +----------+       | 1 | 0  |  0 | 0 | 1 | 0 || 1 | 1 | 0 | 1 | 1 | 
                           | 1 | 0  |  0 | . | . | . || 1 | 1 | 1 | . | 1 |
                           | 1 | 0  |  0 | 1 | 1 | 1 || 1 | 1 | 1 | 1 | 0 |
   -Steve Walz             +-------------------------++-------------------+
   

       As a result, we can see that the jumper provides for 8 possible
       card address lines listed in the above figure. This in comparision
       with TABLE 2 shows that the only available only jumper position 5
       is fully available, corresponding to 280H ((640).
       

   Card Construction

       This section is organized as follows:
          + General Intro and Schematic
          +Card Construction Hightlights
          +Breadboard Interface Construction
           -- 
          +[snip - see Paul's Web Site]


   QBasic Programming

            Taking care to check all your wiring, now it is possible to
            check if your circuit indeed works. Insert the 8255 card into
            an empty slot in your PC's motherboard (assuming you turned
            off the power first!). Make sure the card is seated properly
            and the wirewrapping socket pins do not come into contact
            with any other cards. Launch QBasic (I have not tried testing
            under Windows) under a DOS environment. Try executing the
            following code:
            
   100 REM 8255 PPI SET PORTS A,B,C TO OUTPUT
   110 BASEADDR = 640: REM 280H/JUMPER AT POSITION 5
   120 PORTA = BASEADDR
   130 CNTRL = BASEADDR + 3
   140 OUT CNTRL, 128
   150 FOR SGNAL = 0 TO 255
   160 OUT PORTA, SGNAL:PRINT "DECIMAL="; SGNAL
   170 FOR DELAY = 1 TO 500: NEXT DELAY
   180 NEXT SGNAL
   999 END
   
            If everything has been assembled correctly and the software
            properly compiled, then one should see the 8 LEDs should
            "count" from 0 to 255 in a binary fashion.

            Congratulations if you have gotten this far! In my experience
            troubleshooting should begin in checking if the card is
            seated nicely in its slot on the motherboard. Also check the
            jumper. Check your wiring.

            Of course the above is a simple circuit, but I leave it to
            your imagination to come up with other possibilities given
            that you have 24 digital inputs and outputs. Things like
            motor speed control, switching on relays, reading
            thermistors, strain gages etc.
            
   References
          o 8255A/8255A-5 Programmable Peripheral Interface, Intel
            Order No. 231308-002
          Build This Experimenter's I/O Card, Radio-Electronics, June
            1990 pp. 73-78

          Email me: paul@cs.columbia.edu

-------------------------------------------------------------------------------


   82c55a.doc

   
   How to Use the 8255 Family of Parallel I/O Interface Adapters

   82C55A Parallel Interface Adapter (Intel)

               8255
               8255A
               82C55A
       +--------\/--------+
    1 -|pa3            pa4|- 40
    2 -|pa2            pa5|- 39
    3 -|pa1            pa6|- 38
    4 -|pa0            pa7|- 37
    5 -|/rd            /wr|- 36
    6 -|/cs          reset|- 35
    7 -|gnd             d0|- 34
    8 -|a1              d1|- 33
    9 -|a0              d2|- 32
   10 -|pc7    82C55A   d3|- 31
   11 -|pc6             d4|- 30
   12 -|pc5             d5|- 29
   13 -|pc4             d6|- 28
   14 -|pc0             d7|- 27
   15 -|pc1            vcc|- 26
   16 -|pc2            pb7|- 25
   17 -|pc3            pb6|- 24
   18 -|pb0            pb5|- 23
   19 -|pb1            pb4|- 22
   20 -|pb2            pb3|- 21
       +------------------+


   8255
   Programmable Peripheral Interface

   Register usage

   0  rw port a
   1  rw port b
      r  bbbbbbbb  read port
       w bbbbbbbb  write port
   2  rw port c
      r  bbbbbbbb  read port
       w 0...nnn0  set bit nnn (0..7)
       w 0...nnn1  reset bit nnn (0..7)
       w 1...bbbb  set 4 least bits according to bbbb
       w .xxx....  don't care

      for port c the use of the bits is as follows:
      m0 m1 m2           cntl
      rw        xxxxxxxx  -  general i/o bits
          w rw  1.......  a  output buffer full
         r  rw  .1......  a  interrupt enable1
      rw r      xx......  -  general i/o bits
         r  rw  ..1.....  a  input buffer full
         r  rw  ...1....  a  interrupt enable2
      rw  w     ..xx....  -  general i/o bits
      rw rw rw  ....1...  a  interrupt
         rw     .....1..  b  interrupt enable
          w     ......1.  b  output buffer full
         r      ......1.  b  input buffer full
         rw     .......1  b  interrupt
            rw  .....xxx  -  general i/o bits

   3  w control
      .......1  port c (b0..b3) is input/output
      ......1.  port b          is input/output
      .....1..  group b mode 1/0
      ....1...  port c (b4..b7) is input/output
      ...1....  port a          is input/output
      .00.....  group a mode 0
      .01.....  group a mode 1
      .x1.....  group a mode 2
      1.......  mode set flag active


-------------------------------------------------------------------------------

   END

   Collected by Richard Steven Walz from the sources cited above:
   They appear free for personal use, but their other rights apply!
   So no commercial use whatsoever.
   -Steve
   --
   -Steve Walz  rstevew@armory.com  ftp://ftp.armory.com:/pub/user/rstevew
   -Electronics Site!! 1000 Files/50 Dirs!! http://www.armory.com/~rstevew
   -Europe(Italy) http://ftp.cised.unina.it/pub/electronics/ftp.armory.com




Top
Download 
Tell a friend
Bookmark and Share



Similar Articles

8237A Programmable DMA Controller
Intel Chipset 8237A Datasheet
(by Intel)

8254 Programmable Interval Timer
Intel Chipset 8254 Datasheet
(by Intel)

8255 Programmable Peripheral Interface
Intel Chipset 8255 Datasheet
(by Intel)

8259A Programmable Interrupt Controller
Intel Chipset 8259 Datasheet
(by Intel)

82C54 Programmable Interval Timer
Intel 82C54 Technical Manual
(by Intel)

82C55A Programmable Peripheral Interface
Intel 82C55A Techical Manual
(by Intel)

How to program the DMA 8237 chip
Basic info and examples of C and Asm programming
(by Night Stalker)

Il Chip 8259: IRQ Controller (NEW)
Un'introduzione sull'8259
(by JES)

Intel 8272 Floppy Disk Controller Chip
Tecnical manual, commands and controls
(by Intel)

Intel 82801AA (ICH), 82801AB (ICH0) I/O Controller
Hub AC '97 Programmer's Reference Manual
(by Intel)

Make sound from the speaker using assembly
8253, 8255, 8284 program example in asm
(by William Cravener)

Programming the Intel 8253
Short howto program Programmable Interval Timer
(by Mark Feldman)

Programming the PC Speaker
A short practical intro on programming 8254
(by Mark Feldman)

Timing on the PC family (rel.3)
Over 290 pages on programming 8253/8254
(by Kris Heidenstrom)

 Tags: 8255, chipset


webmaster jes
writers rguru, tech-g, aiguru, drAx

site optimized for IE/Firefox/Chrome with 1024x768 resolution

Valid HTML 4.01 Transitional


ALL TRADEMARKS ® ARE PROPERTY OF LEGITTIMATE OWNERS.
© ALL RIGHTS RESERVED.

hosting&web - www.accademia3.it

grossocactus
find rguru on
http://www.twitter.com/sicurezza3/
... send an email ...
Your name

Destination email

Message

captcha! Code