[아두이노] [강좌] 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
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

임베디드 보드

번호 제목 글쓴이 날짜 조회수
78 마이크로비트 아날로그 홀 센서 활용 (아두이노 센서 활용) icon HellMaker 08-08 21,381
77 마이크로비트 마이크로비트로 가위바위보 게임 일산메이커 08-01 20,744
76 마이크로비트 마이크로 비트로 led 문자 출력하기 2 #microbit #마이크로비트 #led Wavy 07-31 20,112
75 마이크로비트 마이크로비트 - led로 문자출력하기 #마이크로비트 #led #문자 #microbit +1 Wavy 07-30 19,819
74 마이크로비트 마이크로 비트로 간단하게 led켜기 (microbit easy led) #microbit #LED #led Wavy 07-24 20,567
73 마이크로비트 마이크로비트 교육자료 - 반응속도 게임 +1 일산메이커 07-19 22,227
72 아두이노 C 언어 비교문에서 == 사용 방법 icon 양재동메이커 04-12 23,278
71 아두이노 [아두이노 실습] 푸쉬버튼 long press, short press 판단하기 icon 양재동메이커 03-27 23,327
70 아두이노 [아두이노 실습] Push button 스위치로 FND 카운트 증가/감소 icon 양재동메이커 03-27 28,001
69 아두이노 Blynk를 사용해 아두이노에서 IoT 맛보기 icon 양재동메이커 03-27 24,842
68 아두이노 아두이노에서 u8glib로 0.96" OLED 사용하기 icon 양재동메이커 03-27 24,387
67 아두이노 아두이노에서 여러개의 스위치를 1개의 analog input핀으로 검사하기 icon 양재동메이커 03-27 22,971
66 아두이노 아두이노에서 RTOS 사용하기 (FreeRTOS in Arduino) icon 양재동메이커 03-27 27,430
65 아두이노 아두이노에서의 delay() 함수 icon 양재동메이커 03-27 21,716
64 아두이노 아두이노의 pinMode()에서 INPUT과 INPUT_PULLUP의 차이 icon 양재동메이커 03-27 24,012
63 아두이노 아두이노등의 임베디드 시스템의 변수 값 오버플로우 문제 icon 양재동메이커 03-27 21,717
62 아두이노 아두이노에서 외부 라이브러리 설치하기 (Install library in arduino) icon 양재동메이커 03-27 23,809
61 아두이노 WS2812 color LED 사용하기 icon 양재동메이커 03-27 22,246
60 아두이노 WS2812와 APA102의 차이 비교 (Comparison between WS2812 and APA102) icon 양재동메이커 03-27 25,415
59 아두이노 [강좌] 51. 와이파이 통신 (5) - WebServer 예제 (2) icon 양재동메이커 03-21 21,656