본문 바로가기

Arduino/[3] Arduino Cording

[Arduino Cording] #3. attachPCINT(복합주기 설정 2)

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 라이브러리 설치가 필요하다.

 

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
반응형
댓글