아두이노

아두이노 외부인터럽트란?

원원 2019. 11. 3. 14:14

안녕하세요 오늘은 아두이노 외부인터럽트에 대해 알아보겠습니다

일단 아두이노에서 Loop()에서 코드가 무한히 반복되고있습니다

이러한 반복되는 도중에 인터럽트핀에 입력을 받으면 어떠한 함수가 실행되는 것을 외부인터럽트라고 합니다

예를들어

Loop() 반복중 -> 외부인터럽트걸림 -> 외부인터럽트함수실행(이때 Loop은 동작안합니다) -> Loop 반복

 

 

 

이러한 입력을 받을수 있는 외부인터럽트핀은 어떤것을 사용하라고 보드마다 정해져 있습니다

 

보드 인터럽트에 쓸 수 있는 디지털 핀
우노, 나노, 미니 기타 328-기반 2, 3
메가, 메가2560, 메가ADK 2, 3, 18, 19, 20, 21
Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7
제로 all digital pins, except 4
MKR Family boards 0, 1, 4, 5, 6, 7, 8, 9, A1, A2
두에 all digital pins
101 all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE)

문법

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); 

mode: 인터럽트가 언제 트리거 되야하는지 정의함. 4개 상수는 타당한 값으로 미리 정의 됨:

  • LOW  : 핀이 LOW일때
  • CHANGE : LOW->HIGH or HIGH->LOW로 변할 때
  • RISING : LOW ->HIGH일때
  • FALLING : HIGH -> LOW일때
  • HIGH : 핀이 HIGH일때

예제로는 mode가 LOW일때를 사용해 테스트 해보겠습니다

int Testnum;

void setup() {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2), Exint, LOW);
  Serial.begin(9600);
  Testnum = 0;
}

void loop() {
  Testnum++;
  Serial.print("Testnum:");
  Serial.println(Testnum);
  delay(100);
}

void Exint() {
  Serial.println("Interruput ON");
}

위의 동영상을 보면 loop문을 돌다가 (TestNum이 증가하는 것을 보고 알수있음) 

외부인터럽트가 걸리니(2번핀,GND에 버튼을 연결)

외부인터럽트함수가 실행되고 (Interruput ON출력)

버튼을 때니 다시 TestNum이 증가하는 것을 볼 수 있습니다.

 

여기서 버튼을 안눌렀을때는 2번핀이 1이여서 인터럽트가 안걸리고 버튼을 누르면 0으로 변해서 인터럽트가 걸린 모습입니다