중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

인터럽트(Interrupt)

2016-07-04 14:08:07

개요

 

아두이노의 인터럽트(Interrupt)기능을 사용하기 전에 인터럽트가 무엇인지 알아야합니다.

 

소프트웨어가 아닌 일반적으로 사용되는 인터럽트의 용어에 대해 생각해보면 가로채다, 방해하다라는 의미가 있습니다.

내가 무슨 일을 하고 있는데 다른 누가 불쑥 다른 일을 시키거나 방해할 경우 "인터럽트 걸렸다"라고 하거나 "인터럽트 걸지마!"라고 하죠.

 

<농구에서의 공을 가로채는 동작을 인터셉트라고 하는데 인터럽트도 이와 비슷한 의미를 가진다>

 

 

 

 

그렇다면 소프트웨어에서의 인터럽트의 의미는 무엇일까요?

 

소프트웨어에서의 인터럽트는 주변에서 쓰는 인터럽트의 의미와 크게 다르지 않습니다. 다만 그 의미가 소프트웨어에서 구현되있을 뿐이죠.

 

<네이버 사전에 등록된 인터럽트 용어 정의>

 

 

 

현재 어떤 프로그램이 실행중인 상태에서 인터럽트의 조건을 만족하는 어떤 변화가 감지되었을 경우, 현재 실행되는 프로그램을 중단시키고 인터럽트 처리 프로그램을 실행하는 것을 인터럽트라고 합니다.

 

인터럽트를 볼 수 있는 가장 쉬운 예를 들자면 컴퓨터를 사용하다가 갑자기 뜨는 블루스크린을 들 수 있습니다.

블루스크린이 뜨게되면 어떠한 상황이든간에 사용자의 가슴을 철렁하게 만들죠.

블루스크린이 뜨는 이유는 정확하게 모르지만 OS가 실행되는 영역인 커널모드에서 치명적인 오류가 발생했을 경우 인터럽트를 발생시켜 현재 프로그램을 중지시키고 블루스크린을 띄워 오류를 알려주게 됩니다.

 

 

 

 

위의 예를 보고 인터럽트를 이해하셨나요? 그렇다면 아두이노에서의 인터럽트는 어떻게 적용될까요?

 

아두이노에서는 loop()안의 코드들이 현재 실행되는 프로그램이 됩니다. 

인터럽트는 지정된 핀의 현재 상태가 어떻게 변하느냐에 따라 결정되고, 인터럽트가 발생됐다면 loop()안의 코드 실행이 중단되고 인터럽트로 지정된 함수가 실행되게 됩니다.

 

아두이노에서 핀에 의한 인터럽트(외부 인터럽트)는 하드웨어적으로 구현되어 있기 때문에 지정된 핀이 있습니다. 그렇기 때문에 인터럽트를 사용하기 위해서는 보드 별로 지정된 핀을 사용해야 합니다.

 

아두이노에 지정된 인터럽트 핀은 Arduino.cc에서 확인이 가능합니다.

오렌지 보드, 아두이노 Uno의 경우에는 아래와 같이 2번핀과 3번핀을 인터럽트 핀으로 사용할 수 있습니다.

Mega의 경우에는 2번, 3번, 21번, 20번, 19번, 18번 총 6개의 인터럽트 핀을 사용할 수 있네요.

 

 

 

 

그럼 이 쯤에서 인터럽트 사용에 관한 기본적인 설명을 마치고 아래에서는 아두이노에서 인터럽트를 사용하는 방법에 대해 알아 보겠습니다.

 

 

 

 

필요한 부품 목록

 

 

No 부품명 수량 상세 설명
1 오렌지 보드 1 아두이노 UNO 호환 보드
2 LED 1  
3 택트 스위치 1  
4 브레드 보드 1  
5 점퍼 케이블 5  

 

오렌지 보드 LED 택트 스위치 브레드 보드 점퍼 케이블


 

 

하드웨어 making

 

브레드 보드

 

 

 

 

전자 회로도

 

 

 

 

소프트웨어 coding

const byte ledPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

 

 

 

 

 

 

위에 작성된 인터럽트 예제코드(https://www.arduino.cc/en/Reference/AttachInterrupt)에 대해 알아보겠습니다.

 

먼저 소스를 위에서 쭉 보다보면 못보던 단어가 보입니다. volatile이라는 단어입니다.

 

volatile byte state = LOW;

 

 

volatile은 '휘발성의'라는 뜻을 가지고 있는 단어로 인터럽트를 사용할 때, 인터럽트 함수 안에서 변경되는 전역변수앞에 붙여주어야 합니다.

위 코드에서는 state라는 전역변수는 인터럽트 함수안에서 LOW와 HIGH로 계속적으로 반복하게 됩니다. 그렇기 때문에 변수 앞에 volatile로 선언해 주어야 합니다.

 

attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);

 

 

attachInterrupt라는 함수는 인터럽트를 등록하겠다라는 함수입니다. 이 함수의 경우에는 매개변수가 3개가 있습니다.

첫 번째 값에는 인터럽트의 번호를 입력합니다. 아두이노 Uno에서 2번핀을 인터럽트로 지정할 경우 0이 들어가겠죠. 이 번호의 경우에는 개요 부분의 표에 나와 있습니다.

두 번째 값에는 인터럽트가 발생할 경우 실행할 함수를 입력합니다. 위 코드에서는 인터럽트가 발생할 경우 loop()가 멈추고 blink라는 함수가 실행됩니다.

세 번째 값에는 인터럽트가 발생될 조건을 입력합니다.

 

※ 인터럽트의 발생 조건에는 4가지가 있습니다.

- FALLING : 핀의 상태가 HIGH에서 LOW로 바뀔 경우

- RISING : 핀의 상태가 LOW에서 HIGH로 바뀔 경우

- CHANGE : 핀의 상태가 바뀔 경우(LOW->HIGH, HIGH->LOW 둘 다 포함)

- LOW : 핀의 상태가 LOW일 경우

 

종합해서 위 코드의 인터럽트를 정리하면, 디지털2번핀에 신호가 바뀌었을 경우 blink함수를 실행하게 됩니다.

 

void blink() {
  state = !state;
}

 

 

blink코드는 state의 상태를 반대로 변경합니다. HIGH일 때는 LOW로 변경하고, LOW일 때는 HIGH로 변경합니다.

위 코드를 실제로 실행하면 LED의 상태가 버튼을 누르고 땔 때마다 켜지고 꺼지는 것을 확인할 수 있습니다.

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

인터럽트, 아두이노, 오랜지보드