##인터럽트

AVR에서 인터럽트를 제어하려면 네가지 선언과 한가지 include, 한가지 함수만 사용할 수 있으면 된다.


1. 4가지 선언

 1) 포트개방

 2) EICRA/B

 3) EIMSK

 4) SREG


1) 포트개방

ATMega 128에서는 D0~3번 포트 그리고 E4~7번 포트로만 인터럽트 신호를 받을 수 있다. 따라서 이에 해당하는 포트를 개방시켜주어야 한다.

DDR로 포트개방시 1은 출력 0은 입력을 뜻하므로, DDRD = 0x00; 등으로 선언해 주면 D포트에서 입력을 받겠다는 명령이 된다.

2) EICRA/B (External Interrupt Control Register A/B, 외부 인터럽트 제어 레지스터)

EICR 레지스터는 8비트로 2개 비트씩 한 쌍을 이룬다. 예를 들어, PD0에 대하여 01 00의 두개 비트를 가진다. 그리고 두개의 비트의 조합에 따라

EICRA

00 Low Level

01 예약

10 INT 하강에지

11 INT 상승에지

EICRB

00 Low Level

01 논리변화

10 INT 하강에지

11 INT 상승에지

와 같은 동작을 수행한다.


구조는 다음과 같다.                                      1bit 2bit 3bit 4bit 5bit 6bit 7bit 8bit

EICRA(외부인터럽트 0~3 트리거 설정 [PD0~3]) : | 31 | 30 | 21 | 20 | 11 | 10 | 01 | 00 |

EICRB(외부인터럽트 4~7 트리거 설정 [PE4~7]) : | 71 | 70 | 61 | 60 | 51 | 50 | 41 | 40 |


예를 들어, PD0에 대해서 상승에지에 인터럽트를 감지하고 싶다면

EICRA = 0b00000011; 이라고 선언해주면 된다.

3) EIMSK(External Interrupt MaSK, 외부 인터럽트 마스크 레지스터)

8비트이며 각 포트에서 발생한 인터럽트를 Enable할 것인지(수용할 것인지), Disable할 것인지(무시할 것인지) 판단하는 레지스터이다.

구조는 EIMSK : | INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 | 이다.

예를 들어, PD0에서 발생하는 인터럽트를 수용할 것이라면

EIMSK = 0b00000001;로 선언해주면 된다.

4) SREG(Status REGister, 상태 레지스터)

8비트이며 각 비트는 현재 CPU의 상태를 나타내준다.

최상위 I 비트가 1이 아닌 경우 인터럽트를 받지 않기 때문에, 1로 강제로 세팅해준다.

구조는 SREG : | I | T | H | S | V | N | Z | C |

I 글로벌인터럽트

T storage

H half carry

S sign

V overflow

N negative

Z zero

C carry

즉, SREG |= 0b10000000; 이며, 다른 레지스터와 다르게 원래 SREG와 or 연산을 시키는 이유는 SREG자체가 상태레지스터로 현재 프로그램이외에 다른 상태를 나타낼 수 있기 때문이다.


*) EIFR(Interrupt Flag Register)라는 것도 있는데, EIMSK와 비슷하게 각 자리가 Interrupt 포트와 매치된다. 이 레지스터는 각 포트에서 인터럽트가 발생하였는지 표시하는 레지스터이다.


2. 한가지 인클루드

#include<avr/interrupt.h>

인터럽트를 사용하려면 이 헤더파일을 인클루드 시켜주어야 한다.


3. 한가지 함수

ISR(INT4_vect)

이 함수는 INT4 포트에서 입력되는 인터럽트 신호가 있으면 작동되는 함수이다.

+ Recent posts