본문 바로가기
개발

[Arduino] Interrupt 인터럽트

by 마스터누누 2017. 4. 19.
728x90
반응형

아두이노 인터럽트


아두이노는 setup과 loop 함수로 이루어져 있다.

loop함수는 계속 순환하며 내부의 코드들을 실행한다.

그렇다면 이러한 순환구조를 탈출하여 비정기적으로 발생하는 이벤트를 어떻게 처리할까

답은 바로 인터럽트이다.


인터럽트의 사전적 정의는 방해하다/중지시키다 이다.

이와 마찬가지로 아두이노에서의 인터럽트도 실행중인 loop를 중지시키고

서브 프로시저를 실행후 다시 메인으로 복귀하는 구조를 가진다.







즉 위의 그림과 같은 순환 구조를 가지게 되는것이다.

이를 쉽게 설명하자면, 철수가 책을 읽는다고 가정할 때,


철수가 책을 읽는다(메인함수) -> 엄마가 철수를 부른다(인터럽트 발생) -> 책갈피를 꽂는다(복귀주소 저장)


->엄마의 심부름을 한다(이벤트 함수처리) -> 책갈피에 있는 책을 펴고 책을 읽는다(메인함수 복귀)


다음과 같은 구조로 인터럽트 함수를 처리하게 된다.







아두이노 뿐만아니라 AVR MCU같은 경우 인터럽트를 사용할 수 있는 핀이 정해져있다.

우노는 위의 그림에서 보듯이 2번(INT 0), 3번(INT 1)을 사용할 수 있다.

그러므로 추후에 작품설계 시, 인터럽트 핀에 대해 고려해야 한다.






핀배치는 간단한다

앞서 실습한 LED ON/OFF와의 차이점은 스위치의 입력핀이 2번핀으로 옮겨졌다는것 뿐이다.

바로 소스코드를 보도록 하자





 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int led = 7;
int btn = 2;
boolean state = false;
 
void setup() {
  pinMode(led, OUTPUT);
  pinMode(btn, INPUT_PULLUP);
  attachInterrupt(0, isr, CHANGE);
 
  digitalWrite(led, LOW);
}
 
void loop() {
  delay(1000);
}
 
void isr() {
  if (state == false) {
    digitalWrite(led, HIGH);
    state = true;
  } else {
    digitalWrite(led, LOW);
    state = false;
  }
}
 
cs


우선 소스내부에서 짚고 넘어가야 할 함수가 있다.

바로 attachInterrupt 이다.


attachInterrupt(PIN, ISR(Interrupt Service Routine), mode)


1.PIN

2/3번은 각각 0번(INT 0), 1번(INT 1) 인터럽트 핀이다

따라서 자신이 어떤 인터럽트 핀을 사용할 지 정한 후 인자를 명시해 주면 된다.


2. ISR(Interrupt Service Routine)

인터럽트 함수를 등록해야한다.

예제소스에서는 isr이 인터럽트 함수이다.

이때 등록한 함수는 인터럽트 실행시 수행되며, 직접 작성한다.


3. MODE

어떤상황에서 인터럽트를 동작시킬지 선택한다.

모드는 크게 4종류가 있다.

FALLING : 하강 엣지 시 인터럽트 발생

RASING : 상승 엣지시 인터럽트 발생

CHANGE : 상태가 변할때마다 인터럽트 발생

LOW : 신호가 LOW일 때 인터럽트 발생


이 3가지를 모두 입력하여 인터럽트 함수를 등록하면,

소스 업로드 후 이벤트가 발생하였을 때 인터럽트 함수가 정상적으로 동작하는것을 확인 할 수 있다.


반응형

'개발' 카테고리의 다른 글

[NodeJS] Chart JS와 데이터 베이스 연결하기 - 1  (6) 2017.04.19
[Arduino] 시리얼 통신  (0) 2017.04.19
[Arduino] LED ON/OFF 2  (0) 2017.04.19
[Arduino] LED ON/OFF 1  (0) 2017.04.19
[Arduino] Arduino IDE 설치  (0) 2017.04.19

댓글