마이크로컨트롤러에서 가장 많이 쓰이는 기능은 Interrupt, counter, Timer라고 한다.
오늘은 Interrupt에 대해 공부를 했다.
Interrupt란?
Interrupt는 마이크로컨트롤러의 내 외부로부터 오는 신호로 기존에 실행하고 있던 작업을 멈추고 요청된 작업(interrupt Service Routine)을 모두 실행한 뒤에 다시 중지되었던 기존의 작업으로 돌아가는 것을 말한다.
이를 실생활과 비교해보면 다음과 같이 나타낼 수 있다.
실생활 | 인터럽트 |
시험 공부를 한고 있다. | 메인 프로그램 실행 중 |
엄마가 심부름을 시킨다. | 인터럽트 발생 |
책갈피를 꽂아둔다. | 복귀 주소 저장 |
심부름을 다녀온다. | 인터럽트 처리 |
책갈피가 꽂힌 부분을 편다. | 복귀 주소 로드 |
다시 시험 공부를 한다. | 메인 프로그램 계속 실행 |
ATmeaga128에는 35개의 인터럽트가 있다. 그리고 각 인터럽트에 부여된 번호를 인터럽트 벡터라고 하며 인터럽트 벡터 번호가 낮을수록 우선순위가 높다. 동시에 인터럽트 요청이 있을 때 우선순위가 가장 높은 하나의 인터럽트만 실행된다.
인터럽트는 ATmega128에서 자세히 알 수 있다.
http://www.kjit.bme.hu/images/stories/targyak/jarmufedelzeti_rendszerek/atmel_atmega128_manual.pdf
외부 인터럽트
ATmega128은 8개의 외부 인터럽트 INT0 ~ INT7을 지원한다. 외부 인터럽트는 INT0 ~ INT7핀의 트리거 동작으로 인터럽트가 발생된다. 이 말은 INT0 ~ INT7핀으로 지정된 핀으로 스위치 입력 등의 입력을 주면 미리 설정된 트리거 동작(Falling edge, Rising edge, Low Level)에 따라 인터럽트가 발생된다는 뜻이다.
ATmeaga128의 외부 인터럽트 핀 번호는 PD0 {INT0}, PD1 {INT1}, PD2 {INT2}, PD3 {INT3}, PE4 {INT4}, PE5 {INT5}, PE6 {INT6}, PE7 {INT7}이다.
아래 그림을 보면 쉽게 찾을 수 있다.
외부 인터럽트 관련 레지스터
EICRA(External Interrupt Control Register A)
외부 인터럽트 INT0 ~ INT3과 관련된 레지스터로 외부 인터럽트 INT4 ~ INT7은 EICRB에서 설정을 한다.
EICRA는 외부 인터럽트의 감지 방법을 결정할 수 있다.
외부 인터럽트의 감지 신호는 다음 그림과 같이 3가지가 있다.
위의 3가지 신호에 따라 인터럽트 발동 조건을 설정할 수 있다.
EICRA의 비트 별 역할은 다음과 같다.
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EICRA | ISC31 | ISC30 | ISC21 | ISC20 | ISC11 | ISC10 | ISC01 | ISC00 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
초기값 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
INTn 인터럽트(n = 0,1,2,3)의 감지 방법을 ISCn1과 ISCn0 (n = 3,2,1,0)의 두 비트로 정할 수 있다.
인터럽트 감지 제어를 위한 비트 설정은 다음 표에 따라야 한다.
ISCn1 | ISCn0 | 설명 |
0 | 0 | INTn 핀의 Low Level 신호가 인터럽트 요구 |
0 | 1 | 예약 |
1 | 0 | Falling edge에서 인터럽트 비동기적 발생 |
1 | 1 | Rising edge에서 인터럽트 비동기적 발생 |
EICRB(External Interrupt Control Register B)
기본적인 내용은 EICRA와 같고 INT4 ~ INT7의 인터럽트를 설정할 수 있다.
EIMSK(External Interrupt Mask Register)
INT0 ~ INT7 외부 인터럽트를 개별적으로 허용하는 데 사용된다. 사용할 외부 인터럽트 비트를 1로 설정하면 외부 인터럽트가 허용되고 0으로 설정하면 인터럽트가 허용되지 않는다. 단 SREG(Status Register)의 I 비트가 1로 set 된 상태여야 한다.
EICRA(External Interrupt Control Register A)
비트 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
EIMSK | INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
초기값 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
SREG(Status Register)
ATMeaga128의 상태 및 연산 명령 실행에 대한 결과를 포함하는 레지스터로 모든 ALU 연산 수행 후 자동으로 갱신된다. 외부 인터럽트나 ATmega128의 35개의 인터럽트를 허용할 때에는 SREG 레지스터의 최상위 비트인 I 비트만 1이나 0으로 쓰면 된다.
EIFR(External Interrupt Flag Register)
외부 인터럽트가 요청되면 해당 플래그 비트가 set 된다. 해당 플래그 비트는 인터럽트 서비스 루틴이 수행하면 자동으로 clear 된다.