728x90
반응형
아두이노 우노의 2,3번 핀은 attachInterrupt 함수를 통해 외부 인터럽트를 받을 수 있는 반면, 2번과 3번 핀을 제외한 나머지 핀들의 경우에는 외부 인터럽트를 받을 수 없고 나머지 핀들의 경우 신호 변화 인터럽트를 받을 수 있다.
외부 인터럽트의 경우에는 핀 신호가 LOW에서 HIGH로, HIGH에서 LOW로 변할 때도 인터럽트를 받을 수 있고, 핀 신호가 LOW로 유지할 때도 인터럽트를 받을 수 있다.
그러나 핀 신호 변화 인터럽트는 핀 신호가 LOW에서 HIGH로, HIGH에서 LOW로 변할 때만 인터럽트를 받을 수 있다는 차이점이 있다.
하지만 일반적으로 인터럽트는 주로 신호가 변화할 때 사용하므로 외부 인터럽트 핀을 다 사용했다면 핀 신호 변화 인터럽트를 사용하면된다.
외부 인터럽트 | LOW에서 HIGH HIGH에서 LOW 핀 신호가 LOW로 유지 |
핀 신호 변화 인터럽트 | LOW에서 HIGH HIGH에서 LOW |
attachPCINT
attachPCINT란 특정한 핀에 특정한 조건에 맞는 핀 신호 인터럽트가 발생한 경우 수행할 함수를 등록하는 함수이다.
attachInterrupt(digitalPinToPCINT(pin),ISR,mode);
pin | 핀 번호. 아두이노의 경우 2,3 |
ISR | 인터럽트가 발행하면 하드웨어적으로 호출되는 인터럽트 처리함수. 일반적으로 사용자가 정의하는 함수이다. |
mode | 인터럽트 발생 조건 |
핀 신호 변화 인터럽트 라이브러리 설치하기
외부 인터럽트의 경우에는 아두이노 소프트웨어에서 기본적으로 제공되나 핀 신호 변화 인터럽트는 그렇지 않다. 핀 신호 변화 인터럽트를 사용하기 위해서는 먼저 attachPCINT 라이브러리 설치가 필요하다.
핀 신호 변화 인터럽트 라이브러리 사용하기
# include "PinChangeInterrupt.h"
const int BUTTON = 4;
const int LED = 13;
int LED_STATE = LOW;
bool LED_STATE_CHANGE = false;
void bp(){
LED_STATE =(LED_STATE ==LOW)?HIGH:LOW;
LED_STATE_CHANGE = true;
}
void setup() {
pinMode(LED,OUTPUT);
pinMode(BUTTON,INPUT);
attachPCINT(digitalPinToPCINT(BUTTON),bp,RISING);
}
void loop() {
if(LED_STATE_CHANGE){
LED_STATE_CHANGE = false;
digitalWrite(LED,LED_STATE);
}
}
코드 설명
# include "PinChangeInterrupt.h"
- 핀 신호 변화 인터럽트를 사용하기 위해 PinChangeInterrupt.h 파일을 포함한다.
const int BUTTON = 4;
const int LED = 13;
int LED_STATE = LOW;
bool LED_STATE_CHANGE = false;
- 버튼과 LED에 각각 4번 핀과 13번 핀을 할당한다. 이때 13번핀은 아두이노 내의 LED를 일컷는다.
- LED의 상태를 LOW(끔)으로 설정하고 LED의 상태 변화 여부를 false로 설정한다.
attachPCINT(digitalPinToPCINT(BUTTON),bp,RISING);
- attachPCINT를 정의한다.
void loop() {
if(LED_STATE_CHANGE){
LED_STATE_CHANGE = false;
digitalWrite(LED,LED_STATE);
}
}
- LED의 상태 변화값이 1이면(LED의 변화 여부가 가능하면) LED의 상태 변화 여부를 false로 설정하고 LED의 상태에 맞게 LED를 제어한다.
728x90
반응형
'Arduino > [3] Arduino Cording' 카테고리의 다른 글
[Arduino Cording] #5. Timer1 (0) | 2022.03.06 |
---|---|
[Arduino Cording] #4. 토글(toggle) (0) | 2022.03.05 |
[Arduino Cording] #2. attachInterrupt(복합주기 설정 1) (0) | 2022.03.05 |
[Arduino Cording] #1. millis 함수 (0) | 2022.03.05 |