EmbeddedSystem/AVR

[AVR] External Interrupt

TSpoons 2024. 10. 14. 13:06

AVR External Interrupt에 대한 이해

 우리는 무언가 집중하는 작업 중인데 갑자기 전화가 걸려왔다고 상상해 보면, 전화를 받기 위해 하던 작업을 일시 중지한다.

마이크로컨트롤러(MCU)의 세계에서 interrupt도 비슷하게 작동한다.

인터럽트란?

interrupt는 MCU가 하는 일을 멈추고 다른 작업을 즉시 처리하라는 신호입니다. 인터럽트를 처리한 후 MCU는 이전 작업으로 돌아갑니다.

인터럽트의 예:

  1. 전화 알림: 휴대폰이 울려서 업무를 방해하는 것과 마찬가지로 외부 장치가 MCU에 신호를 보내 일시 중지하고 처리할 수 있습니다.
  2. 타이머 인터럽트: MCU는 매 밀리초와 같이 일정한 간격으로 작업을 수행해야 할 수 있습니다. 타이머 인터럽트를 사용하면 작업이 제때 처리됩니다.
  3. 마우스 또는 키보드 입력: 키를 누르거나 마우스를 움직이면 컴퓨터가 인터럽트로 인해 즉시 응답합니다.

ISR(Interrupt Service Routine)

인터럽트가 발생하면 MCU는 단순히 멈추지 않고 특정 인터럽트를 처리하도록 설계된 특수 기능으로 이동합니다. 이 기능을 ISR(인터럽트 서비스 루틴)이라고 합니다.

- interrupt를 처리하기 위한 함수, interrupt handler라고 부름

- ISR은 직접 호출하는 것이 아니라 인터럽트가 발생하면 자동으로 호출된다.

- 일반적인 함수와 달리 ISR은 인수를 수신할 수 없다.

인터럽트 우선순위

모든 인터럽트가 똑같이 중요한 것이 아니라 일부 작업은 다른 작업보다 더 긴급하며, 여기에서 interrupt priority가 작동한다.

 

- 높은 우선순위, 낮은 숫자: 일반적으로 인터럽트 번호가 낮을수록 우선순위가 높다. 가장 중요한 작업이 먼저 처리됩니다.

ex) Reset는 가장 우선순위가 높은 인터럽트로, MCU를 완전히 재시작

- 동시에 인터럽트 발생: 두 개의 인터럽트가 정확히 동시에 발생하면 MCU는 우선순위가 높은 인터럽트(숫자가 낮은) 인터럽트를 먼저 처리

- 인터럽트 중복  : 다른 ISR이 실행되는 동안 인터럽트가 발생하면 MCU는 우선순위에 따라 현재 ISR을 일시 중지하여 더 긴급한 인터럽트를 처리

Interrupt Registers

Interrupt Control Registers

- 사용할 interrupt 조건을 설정하기 위한 레지스터

조건 예) 상승엣지, 하강엣지, 상태가 변할 때 등

Interrupt Enable Registers

- 각 bit는 특정 interrupt와 대응되어 있음

- 어떤 bit가 set(1)로 설정하면 그 bit에 대응되는 interrupt가 활성화됨

Interrupt Flag Registers

- 각 bit는 특정 interrupt와 연관되어 있다.

- Interrupt control register에서 설정한 조건이 충족되면 해당 bit가 자동으로 1로 set됨

Global Interrupt Enable Flag

- 이 bit가 1로 되어야 CPU가 하드웨어적으로 interrupt를 인식함

- flag: 의미있는 정보가 담겨있는 단위(AVR: 1bit)

 

인터럽트 설정 방법

  1. ISR 함수의 내용을 작성한다. 
  2. Global interrupt Enable Flag를 1로 만든다.
  3. Interrupt flag Registers가 1이 되는 조건(Control Register)을 설정하면 조건에 맞게 되면 자동으로 set(1) 된다.
  4. Interrupt Enable Registers를 1로 활성화한다.

 

인터럽트 사용 주의점

- 인터럽트가 실행되면 flag registers의 값은 자동으로 0으로 바뀐다.

- 인터럽트가 실행되지 않고, flag register의 값이 1로 바뀐 상태이면 0으로 초기화해주어야 한다.
-- 초기화는 해당 bit에 1을 직접 기록한다.(마스킹 x)

- 인터럽트 핸들러의 내용을 작성하지 않으면, CPU가 메모리에서 Instruction을 가져왔는데 명령어가 없어서 reset이 일어난다.

 

 

 


External Interrupts in atmega1281

 

EMISK - External Interrupt Mask Register

- INTn bit가 1이면 해당 인터럽트가 enable

 

EICRA - External Interrupt Control Register A / EICRB - External Interrupt Control Register B

- 인터럽트 발생 조건 설정 : 2 bit 씩 일정 조건에  따라 결정됨

 

EIFR - External Interrupt Flag Register

- EICRA or EICRB 레지스터 설정 조건이 만족되면 해당 bit 자동으로 1

- (global interrupt enable flag = 1)ISR이 호출되면 해당 bit는 자동으로 0

- interrupt 사용이 안되도 상태 변화 파악용으로 쓸수 있고, 직접 1을 대입하여 clear 시켜줌.

 

SREG - Status Register

- 가장 최근에 실행한 산술 연산 또는 논리 연산의 결과가 반영되어 있는 레지스터

- 어셈블리어로 코딩할 때 많이 이용

- 이 중 7번 bit(I)가 Global Interrupt Enable Flag 이다.

- sei(), cli() 명령으로 set/clear 시킨다.

 

 

 

 

 

Interrupt Nesting on AVR 

- AVR MCU에서는 기본적으로  interrupt 중첩이 안되지만,

1. ISR 안쪽 맨 앞에 sei() 명령을 두어 global interrupt enable flag를 1로 바꾸거나

2. ISR 선언 시 ISR(INT7_vect, ISR_NOBLOCK)처럼  ISR_NOBLOCK를추가 해주면 된다, 

 

 

ex)

 

ISR2(INT7_vect, NO_BLOCK){
	// fnd_write_numbers(100);
}

ISR3(INT5_vect, No_BLOCK){
	//
}

ISR4(INT4_vect){

}