아두이노에서 인터럽트를 사용하는 방법과 그 예제에 대해서 알아본다. '스케치로 시작하는 아두이노 프로그래밍' 이라는 서적에서 발췌한 내용이다.

인터럽트

큰 프로그램을 작성하던 프로그래머들은 아두이노가 한 번에 하나의 작업만 수행 할 수 있다는 점 때문에 실망하기도 한다. 프로그램에서 여러 개의 쓰레드를 동시에 실행하고 싶은 프로그래머라면 아쉬움이 클 것이다. 몇몇 개발자가 여러 쓰레드를 동시에 실행할 수 있는 프로젝트를 개발하기는 했지만 아두이노를 사용하는 일반적인 상황에서는 이 기능이 필요하지 않은 경우가 대부분이다.
아두이노에서는 이 기능과 가장 유사한 대안으로 인터럽트를 사용할 수 있다.

아두이노 보드의 핀 중에서 D2 핀과 D3 핀에는 인터럽트 기능을 설정할 수 있다. 다시 말해서, 이 핀들을 입력 핀으로 설정한 후 이 핀들을 통해 지정된 인터럽트 신호가 수신되면, 아두이노 프로세서가 수행 중이던 작업을 멈추고 해당 인터럽트에 연결된 함수를 실행하게 된다.

그대로 따라하기

아래 예제는 LED 를 점멸시키다가 인터럽트가 수신되면 점멸 간격을 변경한다. D2 핀과 GND 를 점퍼선으로 연결한 후 내장 풀업 저항을 통해 대부분의 시간 동안 인터럽트를 HIGH 상태로 유지하여 인터럽트를 시뮬레이션할 수 있다.

int interruptPin = 2;
int ledPin = 13;
int period = 500;
 
void setup()
{
 pinMode(ledPin, OUTPUT);
 pinMode(interruptPin, INPUT);
 digitalWrite(interruptPin, HIGH);    // 풀업
 attachInterrupt(0, goFast, FALLING);
}
 
void loop()
{
 digitalWrite(ledPin, HIGH);
 delay(period);
 digitalWrite(ledPin, LOW);
 delay(period);
}
 
void goFast()
{
 period = 100;
}

다음은 위 소스코드에서 setup 함수에서 가장 핵심이 되는 구문이다.

'attachInterrupt(0, goFast, FALLING);'

첫번째 인수는 두 개의 인터럽트 중 사용할 인터럽트를 지정한다. 조금 혼란스럽겠지만, 여기서 0은 핀 2를 사용 중이라는 의미이고, 1은 핀 3을 사용 중이라는 의미이다.
두번째 인수는 인터럽트가 발생했을 때 호출할 함수의 이름이며, 마지막 인수는 'CHANGE, RISING 및 FALLING' 이라는 세 가지 상수 중 하나이다. 아래 그림에서 이 옵션들에 해당하는 인터럽트 모드를 그래프로 볼 수 있다.

인터럽트 모드가 CHANGE 이면, 0 에서 1 로 변경되는 RISING 이나 1 에서 0 으로 변경되는 FALLING 을 사용하여 인터럽트를 발생시킬 수 있다.

인터럽트를 사용하지 않으려면 noInterrupts 함수를 사용한다. 이 함수는 두 인터럽트 채널의 모든 인터럽트를 중지시킨다. 나중에 interrupts 함수를 호출하면 인터럽트를 다시 사용할 수 있다.

  • computer/embedded/아두이노_그대로_따라하기_-_12.인터럽트_사용하기.txt
  • Last modified: 4 years ago
  • by likewind