Mechanic 공방

14. 인터럽트 (Interrupt) 본문

아두이노 (Arduino)

14. 인터럽트 (Interrupt)

H-Mechanic 2020. 7. 31. 23:29
728x90
반응형

이번 포스팅에서는 아두이노에서 제공하는 '인터럽트(Interrupt)'의 개념에 대하여 조금 더 자세히 설명해보고자 한다.

 

인터럽트란 단어 그대로 중간에 방해하는 것을 말한다.

 

코드가 진행 중일 때 특정 신호가 입력되게 되면 메인 코드의 진행을 멈추고 해당 신호와 관련된 작업을 먼저 수행 후 다시 메인 코드 진행으로 넘어가게 된다.

 

아래는 저번 포스팅에서 사용했던 코드이다.

#define Button1 2
#define Button2 3
#define LED1 9
#define LED2 10
#define LED3 11

bool status1 = false;

bool status2 = false;

void setup() {

pinMode(LED1, OUTPUT);

pinMode(LED2, OUTPUT);

pinMode(LED3, OUTPUT);

pinMode(Button1, INPUT_PULLUP);

pinMode(Button2, INPUT_PULLUP);

attachInterrupt(0,LED1Interrupt,CHANGE);

attachInterrupt(1,LED2Interrupt,CHANGE);

}

void loop() {

}

void LED1Interrupt() {

delayMicroseconds(1000);

if (status1 == false) {

digitalWrite(LED1,HIGH);

status1 = true;

} else {

digitalWrite(LED1,LOW);

status1 = false;

}

}

void LED2Interrupt() {

delayMicroseconds(1000);

if (status2 == false) {

digitalWrite(LED2,HIGH);

status2 = true;

} else {

digitalWrite(LED2,LOW);

status2 = false;

}

}

위 코드의 attachInterrupt() 함수에서 3번째 요소에 대하여 추가 설명을 하자면, 일반적인 디지털 신호는 HIGH 값과 LOW 값을 지니고 있다.

 

따라서 신호가 변화하는 시기에 따라 인터럽트 신호를 불러올 시점을 지정해주어야 하는데, 3번째 요소가 바로 그 시점을 지정하는 변수이다.

 

4가지 변수가 있으며 아래의 그림에서와 같이 표현이 가능하다.

따라서 위의 4가지 시점들 중, 인터럽트 함수가 실행되길 원하는 지점을 찾아서 코드에 작성해주면 된다.

 

필자의 경험상 보통 일반적으로 'CHANGE'를 가장 많이 쓰는 것 같다.

 

추가적으로 Interrupt 에는 'Chattering'이라는 현상이 발생할 수 있다.

 

이는 신호가 변할 때 진동하는 현상을 일컫는 말인데, 이로 인해 인터럽트 함수를 불러오는 과정에서 원하지 않는 시점에 함수가 동작할 수 있다.

 

위 코드에서는 이러한 현상을 없애기 위해서 인터럽트 함수 내에서 사용 가능한 delayMicroseconds 함수를 사용하여, 인터럽트 함수 실행 명령을 받은 뒤 일정 시간이 흐른 뒤 해당 함수를 동작시키도록 하였다.

 

결과적으로 인터럽트 기능은 특정 상황에서만 특정 기능을 사용하고 싶을 때 많이 사용하는 기능이다.

 

따라서 본인이 만들고자 하는 메이킹의 목적에 알맞게 사용한다면 굉장히 효율적인 코드를 작성할 수 있을 것이다.

728x90
반응형