만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-xvi. 함수 - 인터럽트 함수

hanjinee 2021. 1. 5. 13:21

안녕하세요 제타지니입니다. 이번 포스트에서는 인터럽트 함수를 보겠습니다. 

인터럽트를 설명하자고 하면 두 가지 종류가 필요합니다.

1. 인터럽트 함수

2. 외부 인터럽트 함수

 

 

자 보시죠.

1. 인터럽트 함수

 *interrupts()

매개변수, 반환값 모두 없는 함수입니다.

noInterrupts 함수에 의해 금지된 인터럽트의 발생을 허용합니다.

인터럽트를 허용하게 되면, 작업의 순서와 시간에 변화가 있을 수 있습니다.

#define interrupts() sei()

입니다. sei() 함수는 전역적으로 인터럽트 발생을 허용해 주기 위해 사용하는 AVR 마이크로 컨트롤러 함수 입니다. 

 

*noInterrupts()

매개변수, 반환값이 모두 없습니다. 

인터럽트 발생을 금지시킵니다. 이후 interrupts() 함수를 이용해서 인터럽트 발생을 다시 허용할 수 있습니다.

#define noInterrupts() cli() 입니다.

cli()함수는 전역적으로 인터럽트 발생을 금지하기 위해 사용하는 AVR 마이크로 컨트롤러 함수입니다. 

 

 

2. 외부 인터럽트 함수

*attachInterrupt

void attachInterrupt(uint8_t interrupt, void (*function)(void), int mode);

void attachInterrupt(uint8_t pin, void (*function)(void), int mode);

interrupt: 인터럽트 번호

pin: 핀 번호 (아두이노 두에에서만 사용 가능)

function: ISR, 인터럽트 서비스 루틴 - ISR을 모르셔도, 예시로 본다면 이해가 가능합니다.

mode: 인터럽트가 발생하는 시점 - 예시로 보면 쉽습니다.

반환값은 없습니다.

 

예시를 보시죠!!

 

이 밑에 나온 표는 인터럽트 발생 지점 설정을 위한 상수입니다. 즉, 함수의 [mode]에 들어가는 값이죠! 

 

예시문을 보시면 이해하시기 훨 씬 편할 것입니다. 아두이노 내의 코드입니다. 이 코드는 아두이노 13번 핀에 내장된 LED를 인터럽트에 의해 켰다 껐다하는 함수입니다. 

이 반대의 함수도 있어야 겠죠???

 

*detachInterrupt

void detachInterrupt(uint8_t interrupt)

void detachInterrupt(uint8_t pin)

interrupt: 인터럽트 핀 번호

pin: 핀 번호(아두이노 두에에서만 사용 가능)

반환값은 없고, 인터럽트 처리 루틴을 제거하는 함수입니다. 

 

 

728x90