ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8255A - Programmable Peripheral Interface
    Programming/Embeded 2009. 7. 12. 02:07

    8255A PPI - Programmable Peripheral Interface

     

    8255 칩은 3개의 8-Bit I/O 포트를 갖고 있으므로 병렬 연결용 소자인 8255는 24개의 외부연결용 입/출력 선이 있으며,

    이들을 8비트씩 나누어 A, B, C포트로 구분한다. A포트(PA7~PA0)와 B포트(PB7~PB0)는 8비트 단위의 입력용 또는

    출력용으로 사용할 수 있고, C포트(PC7~PC0)는 상위 4비트와 하위 4비트를 구분하여 사용할 수 있다. 즉,

    A 및 B포트가 8비트 단위로 사용되는 것에 반해서 C포트는 8비트 혹은 4비트 단위로도 사용할 수 있다.

    간단히 말해 24-Bit의 디지털 데이터를 인터페이스 할 수 있다.


    8255A의 특징

    8255A PPI(Programmable Peripheral Interface)는 인텔 계열 마이크로프로세서에서 제공하는 범용 병렬 입출력

    인터페이스 소자로서 다른 회사의 마이크로프로세서를 사용한 시스템에서도 널리 쓰이고 있다.

     

    8255A는 24-Bit의 I/O 핀을 가지고 있는데 이들은 각각 12핀씩의 두 그룹으로 나누어지며, 각 그룹은 다시 8핀과 4핀의

    포트로 구분되어 전체적으로 4개의 입출력 포트로 구성된다. 8255A에는 3개의 동작 모드가 있어서 단순한 병렬 입출력은

    물론 핸드셰이킹(Handshaking)이나 인터럽트를 사용하는 병렬 데이터 입출력 기능을 수행할 수 있다.


    8255A의 특징을 요약하면 다음과 같다.

    ①  24 비트의 I/O 핀(Port A, B, C)을 가지고 있으며, 이것들은 8핀 짜리 2개(Port A, B)와 4핀 짜리

         2개(Port C - Low&High Order) 등 모두 4개의 입출력 포트로 구성된다.

    ②  모드 0, 1, 2 등 3 가지의 동작 모드가 있다. 이 중에서 모드 0은 단순한 입/출력 동작에 사용되고,

         모드 1과 2는 Handshaking 제어 입/출력에 사용된다.

    ③  제어 신호가 단순하여 어떤 마이크로프로세서와도 쉽게 접속될 수 있다. 

    ④  모드 1과 2에서는 Port C의 데이터 선들이 Handshaking이나 인터럽트  등을 수행하는 여러 가지의 제어 신호로

          기능이 바뀐다.

    ⑤  동작 속도에 따라 8255A와 8255A-5의 2 가지 버전이 있다. 

    ⑥  모든 입출력 신호는 TTL과 직접 접속이 가능(TTL Compatible) 

    ⑦  40 핀 DIP 형 패키지로 되어 있다. 


          8255A의 외부 구조

           8255A의 외부 구조는 그림 14.1과 같이 40 핀 DIP형 패키지로 되어 있다. 외부 신호는 CPU(system bus) 측으로 연결되는 데이터 버스, CPU가 8255A를 제어하는데 사용되는 제어 신호등이 있다. 또한 입출력 장치 측에 연결되는 신호에는 Port A, B, C의 24-Bit 데이터 신 호선이 있다.

               

    신호 이름

    I/O

    기    능

    D0-D7

    I/O

    (3-state)

    Data Bus: CPU와 8255A 사이에 코맨드, 상태 워드 또는 데이터를 전송한다

    CS#

    I

    Chip Select: 이 신호가 L 상태일 때는 현재 CPU가 8255A를 액세스하는 것을 의미하며, RD# 및 WR# 신호를 enable 한다.

    A0 - A1

    I

    ADDR Line: 이 신호는 CPU가 8255A를 액세스할 때 3 개의 포트 및 제어 워드를 초기화하기 위한 번지 중에서 1개를 선택하는데 사용된다. 일반적으로 이 신호에는 각각 ADDR Bus의 A0과 A1을 연결한다.

    RD#

    I

    Read: CS#=0인 상태에서 이 신호가 L로 입력되면 현재 CPU가 8255A로부터 데이터 또는 상태워드를 읽어 들이고 있음을 나타낸다.

    WR#

    I

    Write: CS#=0인 상태에서 이 신호가 L로 입력되면 현재 CPU가 8255A로부터 데이터 또는 제어워드를 쓰고 있음을 나타낸다.

    RESET

    I

    Reset: 이 신호는 8255A를 리셋 시킨다. 8255A가 리셋 되면 모든 제어 레지스터가 클리어 되고, Port A, B, C는 모두 입력 모드로 설정된다.

    PA0-PA7

    I/O

    Port A: 주변 장치와의 데이터 입출력 포트이다. 출력 모드에서는 8-Bit 출력 latch/buffer로 동작하고, 입력 모드에서는 8비트 입력 latch로 동작한다.

    PB0-PB7

    I/O

    Port B: 주변 장치와의 데이터 입출력 포트이다. 출력 모드에서는 8-Bit 출력 latch/buffer로 동작하고, 입력 모드에서는 8비트 입력 buffer로 동작한다.

    PC0-PC7

    I/O

    Port C: 주변 장치와의 데이터 입출력 포트이다. 2 개의 독립된 4비트 포트로 동작하여 출력 모드에서는 4비트 출력 latch/buffer로 동작하고, 입력 모드에서는 4비트 입력 buffer로 동작한다. 모드 1, 2에서는 PortA와 B의 입출력 제어를 위한 제어신호 또는 상태 신호선으로 동작한다.

     

    8255A의 외부 구조 중에서 특이한 것은 모드 1과 2에서 Port C의 데이터 선들이 핸드셰이킹이나 인터럽트 등을

    수행하는 여러 가지의 제어 신호로 기능이 바뀐다는 점이다.


     


    표 14.3 8255A의 A0~A1에 의한 내부 주소 지정

    CS#

    RD#

    WR#

    A1

    A0

    동 작

    0

    0

    1

    0

    0

    Read Port A

    0

    0

    1

    0

    1

    Read Port B

    0

    0

    1

    1

    0

    Read Port C or Status

    0

    0

    1

    1

    1

    Not Used

    0

    1

    0

    0

    0

    Write Port A

    0

    1

    0

    0

    1

    Write Port B

    0

    1

    0

    1

    0

    Write Port C

    0

    1

    0

    1

    1

    Write Control Word

           8255A의 외부 단자 중에서 A0과 A1은 각각 해당 어드레스 버스에 연결되어 8255A의 내부를 선택하는데 사용 된다.


    8255A의 내부 구조

     

    8255A의 내부구조는 그림 14.2와 같이 크게 CPU측(System Bus)의 인터페이스에 관련된 부분과 병렬 데이터 입출력

    제어에 관련된 부분으로 나누어진다.

     

    이 중에서 병렬 입출력 제어 부분은 Group A와 Group B로 구성되는데, Group A는 Port A의 8비트와 Port C의 상위

    4비트(upper)를 포함하고, Group B는 Port B의 8비트와 Port C의 하위 4비트(lower)를 포함한다.

     

    ☞ 리셋 후에는 8255A의 Group A, B(Port A - C)가 모두 모드 0으로 되어 각 포트가 입력 모드 상태 즉, 모두 High Impedance 상태에 있게 된다. 따라서, 이때 출력 장치에는 일반적으로 모든 데이터가 H로 전송되므로 Pull-up 저항 또는 Pull-down 저항에 의하여 안전한 초기 값을 확보하여 주지 않으면 치명적인 결과를 초래할 경우가 있으니 주의해야 한다.


     

    8255A의 내부 구조

     

     

     

    8255A의 동작

    8255A의 제어 워드(controlword 또는 command)에는 “모드 제어 워드(Mode Control Word)”와 “비트 셋/리셋 제어

    워드(Bit Set/Reset Control Word)”의 두 개가 있으나 본 서에서는 “모드 제어 워드(Mode Control Word)”만 다루기로 한다.

     8255A의 동작 모드 설정은 다음과 같이 Group A, B의 동작 모드를 결정하고, 각 핀의 입/출력을 지정한다.


    그림 14.3 Control Work Register

     


    MSB

     

     

     

     

     

     

    LSB

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    모드선택

    모드선택

    포트 A

    포트 C(상위)

    모드선택

    포트 B

    포트 C(하위)

    0

    1

    00    01    1×

    0

    1

    0

    1

    0

    1

    0

    1

    0

    1

    비트셋

    /리셋

    모드

    선택

    모드0 모드1 모드2

    출력

    입력

    출력

    입력

    모드0

    모드1

    출력

    입력

    출력

    입력

    Control Word


       

    모드 0의 포트 정의표를 작성하였다.

     

     

    포 트 A

    8bit

    포 트 B

    8bit

    포 트 C

    상위 4bit

    포 트 C

    하위 4bit

    80H(1000 0000)

    출 력

    출 력

    출 력

    출 력

    81H(1000 0001)

    출 력

    출 력

    출 력

    입 력

    82H(1000 0010)

    출 력

    입 력

    출 력

    출 력

    83H(1000 0011)

    출 력

    입 력

    출 력

    입 력

    88H(1000 1000)

    출 력

    출 력

    입 력

    출 력

    89H(1000 1001)

    출 력

    출 력

    입 력

    입 력

    8AH(1000 1010)

    출 력

    입 력

    입 력

    출 력

    8BH(1000 1011)

    출 력

    입 력

    입 력

    입 력

    90H(1001 0000)

    입 력

    출 력

    출 력

    출 력

    91H(1001 0001)

    입 력

    출 력

    출 력

    입 력

    92H(1001 0010)

    입 력

    입 력

    출 력

    출 력

    93H(1001 0011)

    입 력

    입 력

    출 력

    입 력

    98H(1001 1000)

    입 력

    출 력

    입 력

    출 력

    99H(1001 1001)

    입 력

    출 력

    입 력

    입 력

    9AH(1001 1010)

    입 력

    입 력

    입 력

    출 력

    9BH(1001 1011)

    입 력

    입 력

    입 력

    입 력

     
     
     
    맵핑 지정방식이 아닌 I/O 포트 제어 방법으로 제작을 하였다.
     
     
    직접 라이브러리를 만들어 보았다..
    #include <delay.h>
    #include "PPI.H"                           
    void PPI_init(unsigned char set_data)
    {  
        PPI_CTL_SET;   
        PPI_SET_OUPUT;                                     
        PPI_DATA_OUT = set_data; 
        PPI_A0=1;                                          
        PPI_A1=1;   
        PPI_RD=1;      
      
        PPI_CS = 0;
        PPI_WR = 0;                                        
        delay_us(100);
        PPI_WR = 1;                                        
        PPI_CS = 1;   
        PPI_RD=0;                                           
        PPI_A0=0;                                          
        PPI_A1=0;     
     
    void PPI_SELECT_PORT(unsigned char PORT)
    {                   
            switch(PORT)
            {
                case PA: PPI_A1=0; PPI_A0=0; break;
                case PB: PPI_A1=0; PPI_A0=1; break;
                case PC: PPI_A1=1; PPI_A0=0; break;
            }
    }
    unsigned char PPI_read(unsigned char PORT)
    {
        unsigned char buff=0;
           
      PPI_SET_INPUT;   
      PPI_SELECT_PORT(PORT);  
      PPI_CS = 0; 
      PPI_RD = 0;         
      delay_us(1);    
      buff = PPI_DATA_IN;  
      PPI_RD = 1;        
      PPI_CS = 1;         
      return buff;  
    }
     
    void PPI_write(unsigned char PORT,unsigned char DATA)
    {
      PPI_SET_OUPUT; 
      PPI_SELECT_PORT(PORT);
      PPI_DATA_OUT= DATA;         
      delay_us(1);  
      PPI_CS = 0;   
      PPI_WR = 0;         
      delay_us(1);  
      PPI_WR = 1;   
      PPI_CS = 1;   
    }
     
     
    헤더파일 ......
    아래 포트 부분이있다.. PORTC-> PORTA,B,C.. 바꿔주면 쉽게 바뀐다..
    입력 포트도 같이 PINC를 동일한 포트의 이름으로 변경하면 된다..  출력이 PORTA라면 PINC분분은 PINA로 변경한다.
    컨트로 핀은 사용자가 원하는 핀으로 지정을 하면된다.
     
    #ifndef _PPI_INCLUDED_
    #define _PPI_INCLUDED_
     
    #define PPI_DATA_OUT       PORTC  
    #define PPI_DATA_IN        PINC  
    #define PPI_SET_OUPUT   DDRC = 0xFF
    #define PPI_SET_INPUT   DDRC = 0x00
    #define PPI_CTL_SET    DDRA =0x1F

    #define PPI_RD       PORTA.0
    #define PPI_WR       PORTA.1
    #define PPI_A0       PORTA.2
    #define PPI_A1       PORTA.3
    #define PPI_CS       PORTA.4 
    #define MODE0   0x00
    #define MODE1   0x20
    #define MODE2   0x40
     
    //모드0 ->각각의 제어 AO->포트A가 출력이라는 말이다.. CH는 C포트는 4비트씩제어이므로 상위 하위 비트로 나뉜다. 
    #define AO_BO_CHO_CLO 0x80         // 00
    #define AO_BO_CHO_CLI 0x81         // 01
    #define AO_BI_CHO_CLO 0x82         // 02
    #define AO_BI_CHO_CLI 0x83         // 03
    #define AO_BO_CHI_CLO 0x88         // 04
    #define AO_BO_CHI_CLI 0x89         // 05
    #define AO_BI_CHI_CLO 0x8A         // 06
    #define AO_BI_CHI_CLI 0x8B         // 07
    #define AI_BI_CHO_CLO 0x90         // 08
    #define AI_BO_CHO_CLI 0x91         // 09
    #define AI_BO_CHO_CLO 0x92         // 10
    #define AI_BI_CHO_CLI 0x93         // 11
    #define AI_BO_CHI_CLO 0x98         // 12
    #define AI_BO_CHI_CLI 0x99         // 13
    #define AI_BI_CHI_CLO 0x9A         // 14
    #define AI_BI_CHI_CLI 0x9B         // 15
     
    //8255 포트 셀렉트 주소번지.
    #define PA      0x00
    #define PB      0x01
    #define PC      0x02
    #define READ    0
    #define WRITE   1
     
    void PPI_init(unsigned char set_data);
    unsigned char PPI_read(unsigned char PORT);
    void PPI_write(unsigned char PORT,unsigned char DATA);
    #endif
     
     
    메인 프로그램에서의 사용
    #include <mega8535.h>   
    #include "PPI.h"
    void main ()
    {

       //8255 초기화  A포트입력, B포트출력, C포트상위입력, C포트하위출력
       PPI_init(AI_BO_CHI_CLO);  
     
       while(1)
       {
    PORTA=PPI_read(PB);   // 8255 PB에 0x01 읽어드림
    PPI_write(PA,0x01);   // 8255 PA에 0x01 출력을함
     
    PORTA=PPI_read(PC); //요거 사용시 주의 해야 한다.  PC의 상위비트입력 하위 출력이므로..
     
     //다음 해야 정상적이 상위 4비트 값을 읽어 낼수가 있다... 0xF0는 하위비트 마스킹 처리를 한것이다
    PORTA=PPI_read(PC) & 0xF0;
        }
    }
     

    [출처] 8255 관련자료! (AVR 스터디) |작성자 윈디포스



    - 8255A  Datasheet 영문원본

    'Programming > Embeded' 카테고리의 다른 글

    임베디드 강의실 전체MAP1  (0) 2013.08.27
    DK-128  (0) 2012.12.26
    ATmega8535 Datasheet  (0) 2009.07.10
    ATmega8535 - 타이머,카운터 제어 시계 설계  (0) 2009.07.09
    ATmega8535 - 시리얼통신 (UART)  (0) 2009.07.09
Designed by Tistory.