본문 바로가기

하드웨어, 펌웨어/AVR

[Atmega128] 외부 인터럽트 제어 레지스터

 

외부 인터럽트 제어 레지스터가 하는 일?

 

외부 인터럽트를 제어하려면, 5개의 레지스터가 필요해요.

이 레지스터들은 각각 역할이 다 다릅니다.

간단하게 말하자면,

동작 모드 설정, 동작 여부 설정, 발생 여부 설정등을 하는 곳이에요.

 

 

 

 

 

 

 

 

 

외부 인터럽트 제어 레지스터

 

1. EICRA

External Interrupt Control Register A 의 약자에요.

INT 0번 핀부터 INT 3번 핀 까지의 동작을 제어할 수 있는 레지스터에요!

(Atmega328은 INT 0번 핀과 1번 핀밖에 제어하지 못하니, 차이점 꼭 알아두시길 바래요)

0~1번 비트는 INT 0번 핀,

2~3번 비트는 INT 1번 핀,

4~5번 비트는 INT 2번 핀,

6~7번 비트는 INT 3번 핀을 설정하는 비트에요.

(n은 0~3번 사이의 숫자에요)

 

 

 

ISCn1 ISCn0 설명
0 0 INTn이 LOW level일 때 인터럽트 요구
0 1 X
1 0 INTn이 Falling edge일 때 인터럽트 요구(비동기)
1 1 INTn이 Rising edge일 때 인터럽트 요구(비동기)

EICRA에서 edge에 따른 인터럽트를 요구할 때에는,

클럭에 상관없이 비동기적으로 인터럽트를 요구한다는 점 알고 계시면 좋을 거 같아요.

 

 

 

 

2. EICRB

External Interrupt Control Register B 의 약자에요.

이 레지스터는 INT 4번 핀부터 INT 7번 핀까지의 동작을 제어할 수 있는 레지스터에요.

0~1번 비트는 INT 4번 핀,

2~3번 비트는 INT 5번 핀,

4~5번 비트는 INT 6번 핀,

6~7번 비트는 INT 7번 핀을 설정하는 비트에요.

(n은 4~7번 사이의 숫자에요)

 

ISCn1 ISCn0 설명
0 0 INTn이 LOW level일 때 인터럽트 요구
0 1 INTn에서 논리적인 변화가 일어날 때 인터럽트 요구
1 0 INTn이 Falling edge일 때 인터럽트 요구
1 1 INTn이 Rising edge일 때 인터럽트 요구

EICRB에서는 EICRA와는 다르게 edge에 따른 인터럽트를 요구할 때, (보통 edge 트리거라고 불러요)

I/O 클럭이 필요해요.

 

 

 

 

3. EIMSK

External Interrupt Mask Register 의 약자에요.

이 레지스터는 INT 0번 핀부터 INT 7번 핀의 활성화 여부를 설정할 수 있는 레지스터에요.

외부 인터럽트를 활성화 시키고 싶은 핀의 비트를 1로 설정하면 됩니다.

예를 들어, INT 7번 핀과 INT 0번 핀을 외부 인터럽트로 활성화 시키고 싶다면

EIMSK = 0x81;

이렇게 입력하면 원하는 7번, 0번 핀이 외부 인터럽트로 활성화 된거에요.

 

 

 

 

4. EIFR

External Interrupt Flag Register 의 약자에요.

이 레지스터는 어떤 핀이 외부 인터럽트가 일어났는지

플래그 값을 저장하는 레지스터에요.

이 레지스터는 사용자가 설정하는 레지스터가 아니라,

외부 인터럽트가 일어났을 때 컴퓨터에서 알아서 값을 저장하는 레지스터에요.

이 레지스터는 edge에 따라 외부 인터럽트를 발생시키는 설정인

즉, edge 트리거일 때만 동작합니다.

 

외부 인터럽트가 발생하면, 발생한 해당 비트에 1을 넣고

인터럽트 ISR에 들어가는 순간 자동으로 다시 0으로 초기화가 돼요.

 

 

 

 

5. SREG

Status Register 의 약자에요.

7번 비트 I는 모든 인터럽트를 활성화 시키는 비트이므로 중요해요!

모든 인터럽트이므로 외부 인터럽트 뿐만이 아니라

USART, Timer/Counter, ADC 등까지 모두 활성화시킬 수 있는 비트에요.

 

이 전에 알려드렸던 외부 인터럽트 레지스터들에서 모두 세팅을 마친 후,

마지막엔 꼭 이 레지스터의 7번 비트를 활성화 시켜주어야 정상적으로 잘 작동된답니다.

 

만약 EICRA, EICRB 등등에서 외부 인터럽트를 모두 설정했다고 하더라도

SREG 레지스터에서 7번 비트를 1로 설정해주지 않으면 동작이 되지 않아요ㅠㅠ

 

나머지 비트는 지금 크게 신경쓰지 않아도 되는 비트들이니 다음에 설명드리겠습니다!