[아두이노] [강좌] 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인 동안 반복 호출 됨.



각 모드에 따라 인터럽트가 발생하는 시점은 다음 그림과 같다.

a0e912d9e70915522ff9df82571a49b2.png

detachInterrupt(intNo)

지정한 번호의 인터럽트 발생을 취소시킨다. 이후로는 핀의 입력 상태가 변경되어도 인터럽트 함수가 호출되지 않는다. 


 

 매개 변수


 intNo : 인터럽트 번호. 핀 번호가 아니라는 것에 유의.


 





noInterrupts()

 

반환 값 엄슴매개 변수 엄슴.

 

현재 설정된 모든 인터럽트를 비활성화 시킨다. 외부 인터럽트 뿐만 아니라 타이머와 시리얼 통신까지 비활성화 시키므로인터럽트로 방해 받고 싶지 않은 아주 크리티컬한 부분 외에는 사용하지 않도록 주의.



 

interrupts()

 

역시 반환 값매개 변수 엄슴.

 

비활성화 된 인터럽트를 모두 활성화 시킨다. noInterrupts() 함수로 인터럽트를 비활성화 시킨 후 크리티컬 영역이 끝난 후에 이 함수를 사용하여 반드시 활성화 시키도록안그러면 delay() millis(), 시리얼 통신 등등 인터럽트 사용하는 기능은 다 못써요.


attachInterrupt()로 설정한 외부 인터럽트만 다시 활성화 된다는 것은 설명 안해도 알겠지.



moon_and_james-34


인터럽트 끝바바이.

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
38 아두이노 [강좌] 30. I2C 통신 (2) - Wire 함수 알아보기 icon 양재동메이커 03-20 22,227
37 아두이노 [강좌] 29. I2C 통신 (1) - I2C 통신이란 무엇인가 icon 양재동메이커 03-20 26,639
36 아두이노 [강좌] 28. 시간 관련 함수 (3) - MsTimer2 라이브러리 icon 양재동메이커 03-20 18,261
35 아두이노 [강좌] 27. 시간 관련 함수 (2) - BlinkWithoutDelay 예제 icon 양재동메이커 03-20 12,936
34 아두이노 [강좌] 26. 시간 관련 함수 (1) - delay() / millis() icon 양재동메이커 03-20 18,544
33 아두이노 [강좌] 25. tone()/noTone() 함수 (2) - 부저 실습 icon 양재동메이커 03-20 13,036
32 아두이노 [강좌] 24. tone()/noTone() 함수 (1) - 함수 설명 icon 양재동메이커 03-20 14,585
31 아두이노 [강좌] 23. Interrupt(인터럽트) (3) - 인터럽트 함수 알아보기 icon 양재동메이커 03-20 13,735
30 아두이노 [아두이노 강좌] 22. Interrupt(인터럽트) (2) - 스위치로 LED 켜고 끄기 예제 icon 양재동메이커 03-20 20,949
29 아두이노 [강좌] 21. Interrupt(인터럽트) (1) - 인터럽트란 무엇인가 icon 양재동메이커 03-16 13,288
28 아두이노 [아두이노 강좌] 20. String (3) - 유용한 함수들 icon 양재동메이커 03-16 20,986
27 아두이노 [강좌] 19. String (2) - String() 생성자와 + 연산 icon 양재동메이커 03-16 11,334
26 아두이노 [강좌] 18. String (1) - 문자형(char) 배열과 String icon 양재동메이커 03-16 21,209
25 아두이노 [강좌] 17. Serial 통신(3) - 유용한 기능들 icon 양재동메이커 03-15 15,340
24 아두이노 [강좌] 16. Serial 통신(2) - 시리얼 통신 함수 알아보기 icon 양재동메이커 03-15 19,683
23 아두이노 [강좌] 15. Serial 통신(1) - 시리얼 통신이란 무엇인가 icon 양재동메이커 03-15 18,013
22 아두이노 [강좌] 14. analogRead()/analogWrite() 실습 - 조도 센서 + LED icon 양재동메이커 03-15 11,534
21 아두이노 [강좌] 13. analogWrite() 실습 - LED 밝기 조절하기(Fade 예제) icon 양재동메이커 03-15 11,810
20 아두이노 [강좌] 12. 아날로그 기능(2) - analogWrite() 함수 icon 양재동메이커 03-14 13,193
19 아두이노 [강좌] 11. analogRead() 함수 실습 - 습도 센서 icon 양재동메이커 03-14 11,303