Interrupt란? 마이크로컨트롤러가 즉시 특정 작업을 처리하도록 요구하는 비정상적인 사건을 지칭하는 것.
Interrupt가 발생하면 마이크로컨트롤러는 현재 진행중인 작업을 멈추고 인터럽트가 요청한 작업을 수행하기 위해 인터럽트 처리 루틴(ISR: Interrupt Service Routine)으로 이동한다. ISR이 종료되면 마이크로컨트롤러는 수행을 멈춘 곳으로 되돌아가 중지했던 작업을 계속한다.
※ AVR에선 외부 인터럽트, 차단 가능 인터럽트(INT), 벡터(vect) 를 지원한다. AVR에서는 내부 인터럽트 지원 X, 따라서 모든 인터럽트는 외부인터럽트이다~
※ AVR은 인터럽트 차단 가능, 다시 허용 가능.
차단과 허용은 EI(Enable interrupt), DI(disable interrupt)라는 명령을 사용하여 구분한다. C언어에서는 EI = sei() , DI = cli() 로 사용!
sei()를 사용하면 전역적으로 Interrupt를 사용한다는 의미!
- Atmega128의 interrupt Vector Table
- 벡터 2번부터 9번까지 해당하는 외부 인터럽트는 입출력 핀에 가해지는 데이터 상태나 변화에 의해 발생합니다. 아래 예제는 버튼을 사용해 외부 interrupt를 발생시킵니다. 버튼을 누르면 VCC에서 GND로 핀에 가해지는 전압이 바뀌고 interrupt가 발생합니다. interrupt가 발생하면 해당 interrupt를 처리할 ISR주소를 찾고 해당 주소에 작성된 함수, 명령어들이 동작합니다.
Interrupt 처리
- interrupt가 발생하면 해당 ISR을 호출하는데 이를 위해 3가지 조건이 충족되어야합니다.
1. 전역적인 interrupt 활성화 비트가 세트 되어야 합니다.
- interrupt별로 존재하는 개별 interrupt 활성화 비트가 세트되어 있어야 합니다.
- interrupt 발생 조건을 충족해야 합니다.
- SREG
- 첫번째 조건인 전역 interrupt 활성화 비트는
SREG의 7번째 비트로, 상태레지스터는 가장 최근에 산술 논리 연산장치에서 수행한 연산의 결과를 반영합니다.SREG의 7번째 비트인I비트를 세트 or 클리어 하기위해서sei() = 전역적으로 인터럽트 허용,cli() = 전역적으로 인터럽트 금지함수를 사용합니다.
인터럽트 벡터의 처리 우선순위는 다음과 같다.
1.리셋 (1개)
2.외부 인터럽트 (8개)
3.타이머/카운터 관련 인터럽트 (14개)
4.각종 통신 관련 인터럽트 (8개)
5.그 외 ADC, EEPROM, 아날로그 비교기 (4개)
interrupt : interrupt 처리 루틴을 실행하는 동안에는 다른 interrupt가 발생하지 않는다. 이를 위해 ATmega128은 ISR을 실행하기 이전에 전역 interrupt 활성 비트를 자동으로 클리어하여 interrupt발생을 금지하고, ISR에서 반환하기 이전에 전역 interrupt활성 비트를 자동으로 세트하여 다시 interrupt 발생을 허용합니다. ISR로 분기하기 전에 마이크로컨트롤러는 현재 실행 상태를 스택에 저장해(push) 놓고, ISR에서 반환하면 스택에서 데이터를 복구해서(pop) ISR 실행 이전 상태로 되돌린다. 따라서 interrupt 실행 도중 또 다른 interrupt가 발생하면 스택에 저장해야할 데이터가 증가하게 되고, 메모리가 한정된 마이크로컨트롤러는 곧 스택이 넘치는 상황을 맞이하게 된다.
Interrupt관련 레지스터는 4종류이다.
- EICRA
- EICRB
- EIMSK
- EIFR
EICRA
외부 interrupt 0 ~ 3 동작에 관한 설정을 하는 레지스터이다. ISCn0, ISCn1 (n = 0 ~ 3)까지 총 8개의 bit가 존재한다. 이는 ISCn1 과 ISCn0 두개로 INTn 핀이 Low level, falling edge, rising edge를 판단한다.
단! ISCn1,ISCn0가 0 ,1일때는 제외한다!EICRB
EICRA와 같다 하지만 외부 interrupt 4 ~7의 동작에 설정을 하는 레지스터이다.EIMSK
INT7~ 0 을 개별적으로 허용하는 레지스터이다.
레지스터의 비트순서대로 0~7까지 INT0 ~ 7까지 인터럽트를 허용, 금지한다.
ex) EIMSK = 0x01이면 0000 0001이므로 INT0의 인터럽트를 허용한다는 의미이다.EIFR
INT0 ~ 7 핀에 인터럽드 신호가 입력되어 해당 핀에 인터럽트가 발생했음을 표시해준다.

ISC01, ISC11를 사용해서 Falling Edge에서 Interrupt가 발생하도록 설정하였고 EIMSk로 ISR INT0,INT1을 허용했다.