본문 바로가기
Embedded System/AVR

[AVR] 인터럽트 (Interrupt) (2)

by goatlab 2022. 6. 9.
728x90
반응형
SMALL

ATmega128 리셋 벡터 / 인터럽트 벡터

 

ATmega128에서는 리셋 벡터를 포함하여서 총 35개의 인터럽트 벡터를 가지고 있다. 그 갯수는 다음과 같다.

 

- 리셋 (1개)

- 외부 인터럽트 (8개)

- 타이머/카운터 관련 인터럽트 (14개)

- 각종 통신 관련 인터럽트 (8개)

- 그 외 ADC, EEPROM, 아날로그 비교기 (4개)

 

위에서부터 우선순위가 가장 높은 순이다.

 

인터럽트 처리 과정

 

마이크로 컨트롤러의 인터럽트 처리 과정의 전체적인 맥락은 비슷하지만 세부적인 구조는 종류에 따라 다르다.

 

1. 인터럽트 요청 신호 검출 : 프로그램을 수행하는 도중에 인터럽트 요청이 발생할 경우 해당 장치의 인터럽트 플래그가 세트된다. 이 인터럽트 플래그는 인터럽트 서비스 루틴이 수행되면 자동으로 클리어된다. ​ 

2. 인터럽트 요청 허용 여부 판단 ​: CPU는 해당 장치의 인터럽트 마스크 레지스터의 비트와 SREG의 전역 인터럽트 비트를 보고 허용 여부를 결정한다. ​또한, 동시에 발생한 인터럽트 (두개 이상)에 대해서 우선 순위를 결정하게 된다. ​ 

3. 인터럽트 벡터 주소로 점프 : AVR은 인터럽트 벡터 주소가 하드웨어적으로 정해져 있어서 그 해당 주소로 점프하게 된다. ​ 

4. 복귀 정보 저장 : CPU는 현재의 동작 중인 프로그램의 위치인 프로그램 카운터 (PC) 값을 메모리 스택(Stack)에 저장한다. 또한, 인터럽트 수행 중에 다른 인터럽트의 허용을 막기 위해서 '일시적으로' 인터럽트 금지 상태로 설정한다. ​ 

5. 인터럽트 서비스 루틴의 수행 : CPU가 인터럽트 서비스 루틴으로 점프하여 해당 프로그램을 수행한다. 만일, 인터럽트 서비스 루틴 수행 중에 다른 인터럽트를 허용하고자 한다면 여기서 '일시적으로' 금지된 인터럽트 상태를 바꿔 주어야 한다. 

6. 주 프로그램으로 복귀 : 인터럽트 수행이 종료되어 RETI 명령어를 만나게 되면 스택에서 프로그램 카운터 값을 찾아와 다시 원래 수행하던 주 프로그램으로 복귀한다. 그리고 전에 '일시적으로' 금지된 인터럽트 상태도 해제된다.

 

외부 인터럽트 관련 레지스터

 

외부 인터럽트와 관련된 레지스터로는 먼저 MCUCR 및 SREG 2개와 퓨즈 비트의 BOOTRET이 있다. ​ MCUCR 및 퓨즈비트 사용은 인터럽트 벡터의 위치를 변경할 때 사용하지만, 보통의 경우에 변경하지 않으므로 MCUCR 및 퓨즈 비트는 잘 사용하지 않는다. 그러나 SREG의 I 비트는 인터럽트를 사용하기 위해 빈번하게 사용하게 된다.

 

ATmega128은 모두 8개의 외부 인터럽트를 지원한다. 외부 인터럽트와 관련된 레지스터는 EICRA, EICRB, EIMSK, EIFR 총 4개가 있다.

 

1) EICRA : 외부 인터럽트 3, 2, 1, 0의 동작을 설정한다.

2) EICRB : 외부 인터럽트 7, 6, 5, 4의 동작을 설정한다.


3) EIMSK : 외부 인터럽트 7~0의 개별 각각을 허용하기 위해 사용한다.


4) EIFR : 외부 인터럽트의 개별 상태를 나타낸다.

 

EICRA (External Interrupt Control Resister A)

 

https://stackoverflow.com/questions/30342113/interrupt-programming-for-avr-atmega48

 

EICRA 레지스터는 외부 인터럽트 3, 2, 1, 0 동작에 관한 설정을 하는 레지스터이다.

 

 BIT 7 - Interrupt Sense Control3 1 - 외부 인터럽트 3의 트리거 방식을 설정

BIT 6 - Interrupt Sense Control3 0 - 외부 인터럽트 3의 트리거 방식을 설정

BIT 5 - Interrupt Sense Control2 1 - 외부 인터럽트 2의 트리거 방식을 설정

BIT 4 - Interrupt Sense Control2 0 - 외부 인터럽트 2의 트리거 방식을 설정

BIT 3 - Interrupt Sense Control1 1 - 외부 인터럽트 1의 트리거 방식을 설정

BIT 2 - Interrupt Sense Control1 0 - 외부 인터럽트 1의 트리거 방식을 설정

BIT 1 - Interrupt Sense Control0 1 - 외부 인터럽트 0의 트리거 방식을 설정

BIT 0 - Interrupt Sense Control0 0 - 외부 인터럽트 0의 트리거 방식을 설정

 

ISC는 인터럽트를 어떤 시점에서 잡을 것인지를 결정한다. 외부 인터럽트의 변화는 HIGH, LOW의 레벨 변화 및 HIGH LOW  또는 LOW HIGH 의 엣지 변화로 입력된다. 이것은 어떤 입력의 변화가 인터럽트를 발생하지를 결정하는 비트이다.

 

 번 ISCn1  ISCn0  설명 
 1  0 INTn 핀의 LOW 레벨 입력이 인터럽트를 트리거
 2  0 1 (reserved) 
 3  1 0 INTn 핀의 Falling Edge가 인터럽트를 비동기적으로 트리거
 4  1 1 INTn 핀의 Rising Edge가 인터럽트를 비동기적으로 트리거

 

예를 들어, ISC21 = 1, ISC20 = 0으로 설정하면 '외부 인터럽트 2의 폴링 엣지시에 인터럽트를 발생'이 되어 EICRA = 0x30; 또는 0b00110000; 과 같이 표현된다.

728x90
반응형
LIST

'Embedded System > AVR' 카테고리의 다른 글

[AVR] 타이머 오버플로우 인터럽트  (0) 2022.06.10
[AVR] 인터럽트 (Interrupt) (3)  (0) 2022.06.09
[AVR] 인터럽트 (Interrupt) (1)  (0) 2022.06.09
[AVR] CTC 비교매치 모드 인터럽트  (0) 2022.06.09
[AVR] JMOD-128-1  (0) 2022.06.09