http://www.hackerschool.org/Sub_Html/HS_University/HardwareHacking/17.html
[포트(Port)의 이해]

하드웨어 분야에서 있어서 포트(Port)란, 전기적 신호 데이터가 오가는 통로를 의미합니다. 
즉, MCU로부터 외부로 노출 된 핀(Pin)들이 바로 포트가 될 수 있는 것입니다. 

우리가 사용하는 ATmega128에는 총 64개의 핀들이 노출되어 있으며, 
다음 그림과 같이 1번 핀에서부터 64번 핀까지 시계 반대방향으로 순서대로 읽어 나갑니다. 
(이 때, 동그랗게 파인 부분이 왼쪽 위 모서리에 위치하도록 한 후 읽습니다.) 



* 출처 : http://www.atmel.com/Images/doc2467.pdf
* 구글에서 "atmega128"로 검색하면 가장 위에 나타납니다.

ATmega128 DataSheet의 2페이지에서 가져 온 이 그림은 앞으로 AVR 개발을 하면서 
여러번 반복하여 보게 될 것입니다. 

위 회로에 적힌 용어들이 얼핏 보기엔 복잡해 보이지만, 
유심히 잘 보면 어떤 규칙이 있음을 알 수 있습니다. 

우선 51번 핀부터 시계 방향으로 보면, 44번 핀까지 PA라는 이름이 붙어 있습니다. 
즉, PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7 이렇게 총 8개가 PA라는 공통된 이름을 사용하고 있습니다. 

이를 Port A라고 부릅니다. 
다시말해, PA0에서 PA7까지 8개의 핀이 모여서 Port A라는 하나의 포트가 되는 것입니다. 

같은 방식으로 ATmega128엔 총 7개의 포트들이 존재합니다.
 
  - Port A : PA0 ~ PA7
  - Port B : PB0 ~ PB7
  - Port C : PC0 ~ PC7
  - Port D : PD0 ~ PD7
  - Port E : PE0 ~ PE7
  - Port F : PF0 ~ PF7
  - Port G : PG0 ~ PG4 

포트 G는 예외적으로 핀이 다섯 개 밖에 없으며, 고르게 위치하지 못하고 여기저기 
흩어져 있는 것이 특징입니다. 
반면에 나머지 A~F 포트들은 8개의 핀들이 나란히 위치하고 있습니다. 

개발자는 이 7개의 포트들을 자신이 원하는대로 이용할 수 있습니다. 

예를 들어, LED 1개가 있을 때, 이 것을 PA3번에 연결해도 되고, PF0번, 혹은 PE3번에 
개발자 마음대로 연결하여 사용할 수 있습니다. 그리고 각각의 핀에 전기 신호를 출력할지, 
혹은 반대로 전기 신호 입력을 받을지도 직접 결정할 수 있습니다. 

이처럼 개발자 마음대로 사용할 수 있는 포트들을 범용 I/O 포트라고 부릅니다.

그런데 잘 보면, 각각의 핀 이름 옆엔 괄호( )로 무언가 적혀 있습니다. 
예를 들어, PA3 옆엔 (AD3)이라고 적혀 있습니다. 

이 괄호 안에 들어가 있는 용어들은 해당 포트가 "특수 기능"으로 사용될 때의 용도를 나타냅니다. 
각각의 핀들은 모두 범용 기능 외에 특수 기능을 가지고 있기 때문입니다. 

개발자가 특정 레지스터를 사용할 경우, 이 특수 기능의 포트가 자동으로 사용됩니다. 
이 특수 기능에 대한 세부적인 내용은 실습을 진행해 나가면서 설명해 드릴 것이며,
지금은 이처럼 특수 기능으로 사용되는 포트들이 "특수 포트"다라는 것만 알고계시면 되겠습니다. 

다음은  Port의 P자가 붙지 않은 핀들에 대한 설명입니다.

  - VCC : 전원의 +가 입력되는 핀입니다.
  - GND : 전원의 -가 입력되는 핀입니다.
  - XTAL1, XTAL2 : 크리스탈이라는 외부 장치 입력 전용의 핀입니다.
  - AVCC : 아날로그 VCC가 연결되는 핀입니다.
  - AREF : 아날로그 VCC의 기준 전압이 되는 핀입니다.
  - PEN : SPI 통신에 사용되는 핀입니다.
  - RESET : ATmega128 회로를 리셋(일종의 재부팅)시키는 용도의 핀입니다.

위에 나열되지 않은 다른 핀들이 범용핀, 혹은 특수핀으로 사용될 수 있는 것이 반해, 
위의 핀들은 무조건 위처럼 정해진 기능만 할 수 있습니다. 

지금까지 설명드린 모든 핀들은 TQFP 타입으로 구성되어 있기 때문에, 
전선을 연결하거나 납땜하는 방법이 쉽지 않습니다. 



그렇기 때문에, 앞서 설명드린 변환 기판이나 확장 보드 같은 것을 이용하여 
추가 장치를 연결하기 쉬운 상태로 만드는 것이 일반적입니다.

포트는 MCU에만 존재하는 것이 아니라, 외부 메모리와 같은 주변장치에도 마찬가지로 존재합니다. 
즉, 데이터 송수신을 필요로하는 모든 장치는 이와 같은 포트들을 가지고 있습니다. 



예를 들어, 범용 I/O 포트의 FND의 숫자출력 포트를 C포트로 하고 위치포트를 G포트로 한다면(G포트로 하는 이유는 5비트로 구성되어 있으므로 4개의 위치를 결정하기 쉬움)

다음과 같이 프로그래밍 할 수 있다.


잔상효과를 이용하여 fnd에 숫자를 찍는다.

int main(void){
  
  //C 포트는 fnd의 숫자 결정(어떤 숫자를 띄울지)
  //G 포트는 fnd의 위치를 결정(어디에 띄울지)

  DDRC = 0xff; //0x1111 1111 모두 출력상태
  DDRG = 0x0f; //0x0000 1111 4개만 출력상태

  //FND 숫자 원리만 알면 되니까 미리 써놓는다

 unsigned char digit[10] = 
{ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};


  while(1){

    PORTG = 0x01;
    PORTC = 0x3f; 
    _delay_ms(30);

    PORTG = 0x02;//0x00 0010
    PORTC = 0x06;
    _delay_ms(30);

    PORTG = 0x04;//0x00 0100
    PORTC = 0x5b;
    _delay_ms(30);

    PORTG = 0x08;//0x00 1000
    PORTC = 0x4f;
	_delay_ms(30);
  }
  return 0;
}

'프로그램 > 마이크로프로세서 설계(Atmega128)' 카테고리의 다른 글

전화번호 표시하기  (0) 2015.10.30
Port의 이해  (0) 2015.10.30
크로스 컴파일 개발환경 구축  (0) 2015.10.30
블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요