[아두이노] [강좌] 23. Interrupt(인터럽트) (3) - 인터럽트 함수 알아보기
지난 시간에 스위치를 누를 때마다 LED가 켜고 꺼지는 예제를 인터럽트를 이용한 소스로 구현해 봤었다. 그리고 처음 나온 attachInterrupt()라는 함수가 있었지.
attachInterrup() 함수에 대해서는 소스 설명 때 잠깐 언급했었지만, 이번 시간에 더 자세히 알아보도록 하자. 물론 인터럽트에 관련된 다른 함수들도 같이.
attachInterrup(intNo, ISR, mode)
이 함수는 인터럽트가 발생했을 때 실행될 ISR(Interrupt Service Routine, 인터럽트 처리 함수)을 지정하는 함수이다. 물론 인터럽트 기능을 활성화 시키는 역할을 한다. 듀에(Due)의 경우에는 매개 변수가 다르므로 아래 설명과 다르다. 듀에에 관해서는 아래 "*참고2"를 참조.
매개 변수
intNo : 인터럽트 번호. ISR : 인터럽트 발생 시 호출될 함수 이름. mode : 인터럽트 모드 선택. FALLING, RISING, CHANGE, LOW 중 선택해야 한다.
|
인터럽트 번호란, 앞 강좌에서 잠시 설명했었지만 핀 번호랑은 다른 의미이다. 우노(Uno)의 경우 0, 1번 인터럽트 번호를 사용하며, 메가(Mega 2560/ADK)의 경우 0~5번까지의 번호를 사용한다. 각 번호마다 사용되는 핀이 정해져 있으며, 핀 번호와 인터럽트 번호가 반드시 매치되어야 한다.
다음은 각 인터럽트 번호에 매치되는 핀 번호를 표로 나타낸 것이다. 메가는 6개, 우노는 2개라는 것.
인터럽트 번호 | 0 | 1 | 2 | 3 | 4 | 5 |
메가(Mega 2560/ADK) | 2 | 3 | 21 | 20 | 19 | 18 |
우노(Uno) | 2 | 3 |
|
|
|
|
즉, 0번 인터럽트를 사용하려면 메가든 우노든 입력 핀이 무조건 2번에 꽂혀야 한다는 말. 입력 핀을 3번에 꽂는다면 인터럽트 번호에는 1이 들어가야겠지. 헷갈리지 말자!
ISR 함수 이름에는 본인이 원하는 아무 이름이나 들어가도 상관 없지만, 반드시 정의되어 있는 함수여야 한다. 정의된 함수 명이 아닐 경우 컴파일 에러 발생. 여러 개의 함수를 등록할 수 없으며, 만일 attachInterrupt() 함수를 여러 번 호출하여 각각 다른 함수를 등록할 경우 맨 마지막에 등록된 함수만 호출된다.
인터럽트 모드는 인터럽트 첫 강좌, "인터럽트란 무엇인가"에서 설명했던 인터럽트의 종류가 들어간다. 4가지 모드에 대해 다시 한 번 설명하면,
① FALLING – 신호가 HIGH에서 LOW로 바뀔 때 인터럽트 발생
② RISING – 신호가 LOW에서 HIGH로 바뀔 때 인터럽트 발생
③ CHANGE – 신호가 바뀔 때 인터럽트 발생 (FALLING + RISING)
④ LOW – 신호가 LOW일 때 인터럽트 발생, LOW인 동안 반복 호출 됨.
매개 변수 intNo : 인터럽트 번호. 핀 번호가 아니라는 것에 유의. |
noInterrupts()
반환 값 엄슴. 매개 변수 엄슴.
현재 설정된 모든 인터럽트를 비활성화 시킨다. 외부 인터럽트 뿐만 아니라 타이머와 시리얼 통신까지 비활성화 시키므로, 인터럽트로 방해 받고 싶지 않은 아주 크리티컬한 부분 외에는 사용하지 않도록 주의.
interrupts()
역시 반환 값, 매개 변수 엄슴.
비활성화 된 인터럽트를 모두 활성화 시킨다. noInterrupts() 함수로 인터럽트를 비활성화 시킨 후 크리티컬 영역이 끝난 후에 이 함수를 사용하여 반드시 활성화 시키도록. 안그러면 delay()나 millis(), 시리얼 통신 등등 인터럽트 사용하는 기능은 다 못써요.
attachInterrupt()로 설정한 외부 인터럽트만 다시 활성화 된다는 것은 설명 안해도 알겠지.
인터럽트 끝! 바바이.