본문 바로가기
대한상공회의소 스마트팩토리 교육/IoT 디바이스 개발

[IoT 디바이스 개발] 아두이노«수업-5» : 인터럽트(Interrupt) / 외부(External) 인터럽트 / 타이머(Timer) 인터럽트

by 나는영하 2022. 1. 29.

※ 주의사항 

본 블로그는 수업 내용을 바탕으로 제가 이해한 부분을 정리한 블로그입니다.
본 내용을 참고로만 보시고, 틀린 부분이 있다면 지적 부탁드립니다!

감사합니다😁

 

안녕하세요!!

오늘은 아래와 같은 내용을 확인해보겠습니다.

 

인터럽트(Interrupt)

외부(External) 인터럽트

타이머(Timer) 인터럽트


1. 인터럽트(Interrupt) 개념

아두이노 기준에서 인터럽트는 아두이노 전원 ON후 setup 함수부를 1번 수행하고 loop 함수부를 무한정 동작하는 동안 긴급히 처리해야하는 프로그램이 생겼을시 loop 함수부에 있는 동작을 잠시 멈추고 긴급히 처리해야하는 과정을 우선 수행하는 과정을 인터럽트라고 합니다.

 

즉, 인터럽트 처리 과정

1) 메인 프로그램(loop 함수) 수행중 인터럽트 발생 →

2) 스택에 복귀할 주소 저장

3) 인터럽트 처리 루틴 수행

4) 스택에서 복귀 주소 로드

5) 메인 프로그램 이어서 수행

으로 이어집니다.

 

- Atmega2560은 인터럽트의 갯수가 약 57개가 있습니다.(Atmega Manual 기준, 구체적으로 확인 필요)

- 외부 신호에 의해 발생하는 외부 인터럽트는 8개가 있습니다. (INT0 ~ INT7)

※ 아두이노 사이트 기준에는 Mega2560의 인터럽트 디지털 핀은 6개 (2,3,18,19,20,21)라고 적혀있습니다. 

인터럽트 디지털 핀과 외부 인터럽트가 다른 점이 무엇인지는 한 번 확인해볼 필요가 있을것 같습니다.

Atmega 2560 Menual Interrupt 부분

인터럽트에 대한 개념은 이미 인터넷상에 많이 공유되어있으니 자세한 설명은 생략하겠습니다.

 


 

2. 외부(External) 인터럽트

외부 인터럽트 실습 사진(좌) / 실습용 코드(우)

 

2-1. attachInterrupt(digitalPinToInterrupt(pin), ISR, mde) 함수 설명

attachInterrupt 함수의 형태는 크게 3가지 방식이 있습니다.

- attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
- attachInterrupt(interrupt, ISR, mode)
- attachInterrupt(pin, ISR, mode) 

하지만 첫번째만 아두이노에서 권장을 하고 나머지는 권장하지 않습니다.

그래서 첫번째 기준으로만 실습을 진행하였습니다.

 

1) digitalPinToInterrupt(pin) : 실제 디지털 핀을 특정 인터럽트 번호로 변환한다.

디지털 핀 번호와 인터럽트 번호가 달라서 맵핑시켜주기 위해 다음과 같은 문법을 사용합니다.

 

2) ISR : 인터럽트가 발생할때 호출할 함수, 인터럽트 서비스 루틴

(이 함수는 매개변수를 취하지 않고 아무것도 반환하지 않아야 합니다!!)

 

3) mode : 인터럽트가 트리거 되는 시기, 즉 디지털핀의 입력 상태(상황)에 따라 인터럽트가 트리거 되는 시기가 달라집니다. (4가지로 나뉩니다)

 - LOW : 핀의 입력값이 낮을때 마다 인터럽트 루틴 함수를 호출합니다.

 - CHANGE : 핀이 값을 변경할때 마다 인터럽트 루틴 함수를 호출합니다.

 - RISING : 핀의 값이 로우에서 하이로 가는 순간 함수를 호출합니다. (많이사용)

 - FALLING : 핀의 값이 하이에서 로우로 가는 순간 함수를 호출합니다. (많이사용)

※ RISING 이나 FALLING은 PLC 프로그래밍에서 배운 펄스신호와 같은 개념을 가지고 있습니다.

※ 입력핀이 푸시버튼을 사용할 경우 풀-다운 저항 스위치인지, 풀-업 저항 스위치인지에 따라 같은 RISING이라도 신호를 보내는 위치가 달라집니다. (ex. 풀-다운 저항의 경우 스위치를 눌렀을때 RISING이 되고, 풀-업 저항의 경우 스위치를 눌렀다 땠을때 RISING이 됩니다.)

 

2-2. 코드 설명

Line 1 : 외부 인터럽트 신호를 보낼 입력 디지털 핀을 지정합니다 (2번, 3번, 10번, 11번)

Line 11 ~ 14 : Line1에서 정한 디지털 핀의 스위치가 함수의 3번째 파라메타(mode)에 따라 정해진 신호를 보낼때 blinkLED() 함수를 호출합니다.

Line 23 ~ 24 : 인터럽트가 발생할때 수행할 루틴 함수입니다. LED에 출력할 값을 반전시킵니다.

 


 

3. 타이머(Timer) 인터럽트

3-1. MsTimer2:: 함수 

 MsTimer2 함수를 사용하기 위해서는 #include <MsTimer2.h> 헤더 파일 추가가 필요하며 라이브러리 설치 또한 필요하다.

 1) MsTimer2::set(x,y) : x시간(ms 단위) 후에 인터럽트 서비스 루틴(y)이 수행된다.

 2) MsTimer2::start(); : 타이머 인터럽트를 수행하기 위한 함수 (없으면 수행이 안됨)

 3) MsTimer2::stop(); : stop 함수가 나올때 까지 타이머 인터럽트는 무한정으로 수행된다.

댓글