각 MCU마다 interrupt의 종류 및 우선순위가 다름.
'Interrupt Vector Table' 참고.
Atmega328의 경우 총 26개의 interrupt 제공.
- Vector No. 가 작을수록 우선순위.
- 전체 잠금 설정(Global Interrupt Enable) : MCU의 interrupt 허용 여부
sei() 함수 : Set Global Interrupt, 모든 인터럽트 허용
cli() 함수 : Clear Enalbe Interrupt, 모든 인터럽트 잠금
- 개별 잠금 설정 : 개별 interrput 허용 여부
ex) 개별 interrupt를 사용하려고 했지만 개별 잠금 설정이 '잠금'상태이라면 사용 X
인터럽트를 사용을 허용할 때는 반드시 모든 초기화가 끝나고 설정 변경
각 MCU마다 인터럽트 발생 논리 변화가 다름.
(Falling Edge, Rising Edge)
- EIMSK(External Interrupt Mask Register) : external interrupts 개별 허용 여부, '1' 허용
- EICRA(External Interrupt Control Register A) : external interrupts 발생 조건
-ISCNn(Interrupt n Sense Control) : N(인터럽트 번호), n(비트)
컴파일러마다 인터럽트 함수 구현 방식 다름.
ISR(Interrupt Service Routine) : 인터럽트 이름
WINAVR/AVR Studio
ex) ISR(인터럽트 이름){인터럽트 내용}
- volatile unsigned char state = 0;
상태 변수는 전역으로 지정.
아두이노 우노 보드에서 PD2가 INT0번에 해당하기 때문에 0V 상태였다가 버튼을 누를 때 5V를 흘려보내고 손을 뗄 때의 falling edge에 인터럽트를 발생시키는 동작을 함.