이번 포스팅에서는 마이크로 컨트롤러의 외부인터럽트에 대해서 다뤄보자.
인터럽트
인터럽트란 프로그램이 진행될때 특별한 신호를 받으면 해당 신호를 먼저 처리하는 과정을 얘기한다.
위와같이 4번째 프로그램이 실행되다가 인터럽트(특별한 신호)가 발생하면 특정 과정이 진행되는데 이를 인터럽트 서비스루틴(ISR)이라고 한다.
즉, 우선순위는 진행되는 프로그램보다 인터럽트가 더 먼저 된다는 뜻이다.
인터럽트의 예는 TV리모컨과같이 우리가 어떤 채널을 보든 리모컨은 TV화면에서 나오는 영상보다 우선시 되기 때문에 이때 ISR은 리모컨 신호라고 할 수 있다.
AVR입장에서 보면 인터럽트는 크게 2종류가 있다.
1. 외부 인터럽트
2. 타이머 인터럽트(타이머/카운터)
외부 인터럽트는 말 그대로 외부의 신호를 받아서 프로그램을 처리하는 과정을 얘기하며
타이머 인터럽트는 MCU내부에 타이머를 설정해서 일정한 시간이 지날때마다 ISR을 진행하는 동작을 의미한다.
이번 글에서는 외부 인터럽트를 다뤄보자.
외부 인터럽트
이제 AVR코딩을 하기위해서 어김없이 데이터시트를 봐야한다.
Atmega328P(아두이노 우노)로 진행하기 때문에 해당 데이터시트를 참고하자.
가장 먼저 인터럽트가 발생할때 진행될 동작을 작성해야하는데 이를 ISR함수라고 하며 매개변수로 해당 인터럽트 벡터를 작성해준다.
인터럽트를 발생시키기 위해 가장 먼저 사용하는 레지스터는 EIMSK 이다.
EIMSK - 외부인터럽트 마스크 레지스터
EIMSK 레지스터를 통해서 몇번 인터럽트 번호를 허용할지 설정해야 한다.
INT0를 허용하면 코드는 ( EIMSK |= (1<<INT0) )와 같이 작성하면 된다.
포트설정할때 DDRB = 0x01과 비슷한 작업이라고 생각하면 된다.
그러나 해당 레지스터는 몇번인터럽트를 사용할지만 설정 할 뿐 언제 발생하는지에 대한 시점은 EICRA 레지스터에서 관리한다. 이어서 EICRA레지스터를 보자.
EICRA - 외부 인터럽트 제어 레지스터
위에서 INT0를 허용시켰기 때문에 ISC01, ISC00을 제어해주면 된다.
하강엣지에서 인터럽트를 발생시키면 위와같이 설정해 주면 된다.
sei() - 전체 인터럽트 허용
sei()는 함수이며 전체인터럽트를 허용한다는 뜻이다.
SREG레지스터에 7번비트를 1로 설정하는것과 같은 작업을 한다.
이제외부 인터럽트를 설정하는데 필요한 레지스터는 살펴보았으므로 코드를 작성해보자.
이번 코드는 버튼을 누르면 LED가 토글되는 동작을 하도록 작성했다.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile int state = 0;
ISR(INT0_vect){
state = !state; //상태 토글
}
void INIT_PORT(void){
DDRB = 0x01; //pb0핀 출력
PORTB = 0x00; //led 꺼진상태
DDRD = 0x00; //pd0핀 입력
PORTD = 0x04; //pd0 풀업저항 사용
}
void INIT_INT0(void){
EIMSK |= (1<<INT0); //인터럽트0 허용
EICRA |= (1<<ISC01); //하강엣지일때 인터럽트 발생
sei();
}
int main(){
INIT_PORT();
INIT_INT0();
while(1){
if(state == 1){
PORTB = 0x01; //LED ON
}
else{
PORTB = 0x00; //LED OFF
}
}
return 0;
}
아두이노IDE 에서 코딩하면 단 4줄이면 끝날것을 C언어로 하면 이렇게까지 해야하다니......어셈블리어로 코딩하면 또 얼마나 길어질지.....엔지니어는 대단하다......
'AVR(Microchip Studio)' 카테고리의 다른 글
[AVR] Atmega8 테스트보드 만들기(납땜 & 테스트장비) (0) | 2022.01.08 |
---|---|
[AVR] Atmega328P UART통신 & 헤더파일 나누기(putty) (0) | 2021.12.29 |
[AVR] 아두이노를 이용한 AVR코딩 & 버튼 채터링(Microchip Studio) (0) | 2021.12.25 |
[AVR] Atmel Studio7 레지스터 제어, Simulator 디버깅 (0) | 2021.12.23 |
[µ-Processor] 내부구조(ALU) (1) | 2021.07.20 |