마이크로컨트롤러 포트

위키백과, 우리 모두의 백과사전.

마이크로컨트롤러에서 포트(port)는 디지털아날로그 입출력 핀과 관련 하드웨어이다. 마이크로컨트롤러는 많은 경우 기계어 코드를 내부의 플래시나 롬에 저장하므로 외부의 메모리를 장착하지 않아도 된다. 따라서 칩의 핀을 디지털 입출력이나 아날로그 입출력으로 사용하는 것이 일반적이다.[1][2]

마이크로컨트롤러에서 디지털 출력을 위해 플립플럽을 사용하여 한번 레지스터에 쓰기하면 그 상태로 유지된다. 이 출력 상태를 특정 핀으로 연결하면, 외부의 하드웨어에 따라 설정된 기능을 한다. 스위치의 경우, 스위치 하드웨어를 구성하여 디지털 포트의 입력에 연결하면 스위치 상태를 소프트웨어로 처리하여 인지하고 해당 기능을 처리할 수 있다.

8비트 마이크로컨트롤러는 8비트를 한 묶음으로 구성하여 한번에 8비트를 동시에 액세스 할 수 있고, 경우에 따라 비트 단위로 입출력을 할 수 있다.

센서 등에서 출력되는 전압 신호를 아날로그 포트에 연결하고, 내부에서 아날로그-디지털 변환회로(ADC) 모듈과 연결되어 디지털화 한다.

주로 디지털 입출력을 많이 사용하고, 아날로그 신호의 경우는 센서 등의 입력에 많이 사용한다.

마이크로컨트롤러에서 포트 예[편집]

8051 포트[편집]

인텔 8051 포트 구성

8051는 4개의 포트로 구성된다.

  • PORT 0
  • PORT 1
  • PORT 2
  • PORT 3

외부에 메모리를 추가할 경우 PORT0와 PORT2을 시용하므로 디지털 입출력으로 사용할 수 없다.

ATmega[편집]

아트메가의 경우, 기능에 따라 다양한 구성의 제품이 출시되어 있어 포트 구성이 다르다. 디지털 입출력과 아날로그 입력이 존재한다.

ATmega328[편집]

패킷지 종류에 따라 포트의 구성은 다르다.[3]

PDIP 패킷지 :

  • 디지털 포트 : Port B (PB7:0), Port C (PC5:0), Port D (PD7:0)
  • 아날로그 포트 : 6채널 10비트 ADC 입력

만약 포트 D의 비트 PORTD7를 스위치 입력으로 PORTD6을 LED가 하드웨어적으로 구성되어 있다면:

void main()
{
     DDRD = 0x7C;    // 01111100;  // 비트 7을 입력, 비트 6~2, 비트1,0는 시리얼 TX,RX로 설정.
     PORTD = 0xFF;  // 모두 1 출력

     while (1) {
         if (! (PIND & 0x80)) {  // 비트 7이 0 상태이면 키 눌림이 되도록 하드웨어 구성 됨.
             PORTD = 0xFF;      // 출력을 모두 1로 출력. 논리 1이면 LED가 켜지도록 구성된 경우.
         } else {
             PORTD = 0xBF;     // 비트 6의 LED을 끈다. 논리 0이면 LED가 꺼지도록 구성된 경우.
         }
      }
}

포트 활용 예[편집]

릴레이 구동[편집]

릴레이는 코일의 전류에 의해 자장을 이용한 스위치이다. 따라서 코일에 전류를 흘리는냐 그렇지 아는냐에 따라 기계적 스위치가 동작이 결정된다. 이런경우 하드웨어가 디지털 신호에 의해 작동하도록 구성하고, 회로에 따라 프로그램으로 논리 HIGH 또는 LOW을 출력하여 동작 시킨다.

아두이노 릴레이 제어 프로그래밍 코드 예 :

릴레이 구동회로
#define LV_SENS_H  512

const int pinRelay = 3;  // 릴레이 제어용 디지털 출력 포트
const int pinSens  = A0; // 센서 - 아날로그 입력 포트

void setup() {
   pinMode(pinRelay, OUTPUT);
   Serial.begin(9600);
}

int sensValue;

void loop() {
   int value;
   char cnt;

   value= 0;
   for (cnt = 0;cnt < 10; cnt++) {
      value += analogRead(pinSens);
      delay(20);
   }
   sensValue = value / 10;

   Serial.print("센서 입력값 = ");
   Serial.println(sensValue, DEC);

   if (sensValue > LV_SENS_H) {
       digitalWrite(pinRelay, HIGH); // 릴레이 켜기
   } else {
       digitalWrite(pinRelay, LOW);  // 릴레이 끄기
   }

   delay(100);
}

같이 보기[편집]

각주[편집]

  1. “ATmega PORT” (PDF). 2015년 7월 24일에 원본 문서 (PDF)에서 보존된 문서. 2015년 6월 17일에 확인함. 
  2. “8051 PORT” (PDF). 2015년 6월 18일에 원본 문서 (PDF)에서 보존된 문서. 2015년 6월 17일에 확인함. 
  3. AVR8 포트

외부 링크[편집]