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

임베디드 보드

번호 제목 글쓴이 날짜 조회수
118 아두이노 ESP32 Analog Inputs (ADC) +4 icon 양재동메이커 02-12 18,022
117 아두이노 TIP : Serial의 Port가 Open 시점 확인 icon 양재동메이커 01-21 14,601
116 아두이노 ESP32 Boot Mode icon 양재동메이커 12-28 14,599
115 아두이노 아두이노 에러 리스트(Arduino Error list) icon 양재동메이커 11-24 19,793
114 아두이노 ESP32 main.cpp +1 icon 양재동메이커 11-19 14,818
113 아두이노 ESP32 EEPROM 와 IR Remote icon 양재동메이커 08-06 14,711
112 아두이노 Learn ESP32 icon 양재동메이커 06-25 14,475
111 라즈베리 파이 라즈베리 파이 (Raspberry Pi) 기초 icon 양재동메이커 06-19 15,861
110 라즈베리 파이 (동영상 강의) 라즈베리 파이 강좌 Link icon 양재동메이커 06-17 14,899
109 STM32 / MBED [MED] Switch debouncing icon HellMaker 12-30 17,037
108 기타 [타이젠] 아두이노의 16x2 LCD Display라이브러리 LiquidCrystal_I2C의 타이젠 포팅 icon 양재동메이커 09-15 16,780
107 기타 [타이젠] GPIO의 디지탈 출력과 입력 인터럽트의 C++ Class 제작 icon 양재동메이커 09-12 16,097
106 마이크로비트 서보 모터 icon HellMaker 09-03 15,837
105 마이크로비트 아날로그 온도센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 16,443
104 마이크로비트 터치센서 (마이크로 비트 센서 활용) icon HellMaker 09-01 15,317
103 마이크로비트 디지털 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 14,592
102 마이크로비트 리니어 홀 센서 (마이크로 비트 센서 활용) icon HellMaker 08-29 13,961
101 마이크로비트 불꽃 감지 센서 (마이크로 비트 센서 활용) icon HellMaker 08-26 14,354
100 마이크로비트 로터리 엔코더 (마이크로 비트 센서 활용) icon HellMaker 08-25 14,581
99 마이크로비트 2컬러 LED(3mm) (센서 활용) icon HellMaker 08-22 14,494

A PHP Error was encountered

Severity: Core Warning

Message: PHP Startup: Unable to load dynamic library 'C:\Program Files\PHP\v7.1\ext\php_mysql.dll' - The specified module could not be found.

Filename: Unknown

Line Number: 0

Backtrace: