ATmega8A의 외부 인터럽트를 받아들이는 핀은 [그림 1]에 표시된 바와 같이 두 개가 있다. ‘외부 인터럽트를 받아들인다’는 것은 쉽게 설명하면 이 핀에 걸리는 전압의 변화를 감지하여 그 시점에서 특정한 일을 수행토록 할 수 있다는 의미이다. 예를 들어 INT0핀(4번핀)의 전압이 5V에서 0V로 떨어지는 순간 ISR함수를 호출한다든가 혹은 0V에서 5V로 올라가는 순간 ISR 함수를 실행토록 할 수 있다는 말이다. 이러한 외부 인터럽트 핀을 이용하여 버튼이 눌려지는 것을 감지한다든가 혹은 센서의 측정값이 변하는 것을 감지한다든가 하는 응용을 할 수 있다.


[그림 1] ATmega8(A)의 외부 인터럽트핀


일반적으로 PD2:3핀을 외부인터럽트로 사용하려면 외부 소자에서 신호를 읽어들여야 하기 때문에 방향을 입력(DDRD2='0', DDRD3='0')으로 설정한다. 하지만 방향을 출력으로 설정해 놓아도 인터럽트를 발생시킬 수 있는데 이 경우는 PORTD2 비트나 PORTD3 비트를 조작하여 (즉, 외부 요인이 아니라 내부 프로그램에 의해서) 그 신호 변화에 따라서 내부적으로 인터럽트를 발생시킬 수 있다. 이러한 방식을 ‘소프트웨어 인터럽트’라고 한다.


 관련된 레지스터들로서 일단 MCUCR(MCU Control Register)이 있다.

[그림 2] MCUCR

[그림 2]에서 외부 인터럽트와 관련된 비트는 0번부터 3번까지 4비트이다. ISC01:0 두 비트로 INT0의 동작을 설정하며 ISC11:0 두 비트로 INT1의 동작을 설정한다.


[표 1] 인터럽트 0/1의 발생 제어

ISCn1

ISCn0

동작

0

0

INTn의 low level에서 인터럽트 발생

0

1

INTn의 신호가 변하면 인터럽트 발생

1

0

INTn의 ‘falling edge’에서 인터럽트 발생

1

1

INTn의 ‘rising edge’에서 인터럽트 발생


ISCn1:0='00'이면 INTn핀이 '0'값이면 인터럽트가 무조건 발생한다. 즉, INTn핀이 ‘0’이 되면 ISR(INTn_vect)함수를 호출하고 이 함수가 끝나고 나서도 또 ‘0’이라면 다시 인터럽트가 발생해서 ISR(INTn_vect)함수를 다시 호출하게 된다. ISCn1:0='10'이면 하강 엣지(edge) 에서 인터럽트가 발생하게 되는데 ’1‘에서 ’0‘으로 변하는 순간을 하강 엣지라고 한다. 반대로 ISCn1:0='11'이면 상승 엣지에서 인터럽트가 발생하게 되는데 ’0‘에서 ’1‘로 변하는 순간을 상승 엣지라고 한다. ISCn1:0='01'로 설정하면 하강 엣지와 상승 엣지 두 경우 모두에서 인터럽트가 발생하게 된다. 다음 <그림 6.3.2>에 이들 각각의 경우를 도시하였다. 이 그림에서 하단의 위쪽으로 향하는 화살표는 인터럽트 요구를 표시한다.


[그림 3] 외부 인터럽트 동작 모드


GICR 레지스터의 구조는 다음과 같다.


[그림 4] GICR 레지스터


INT0비트가 세트(‘1’)되고 SREG의 I비트가 세트(‘1’)되었다면 외부 인터럽트 0번은 활성화된다. 마찬가지로 INT1비트가 세트(‘1’)되고 SREG의 I비트가 세트(‘1’)되었다면 외부 인터럽트 1번은 활성화된다.


 외부 인터럽트를 활성화시키기 위한 SFR의 설정을 다음과 같이 요약할 수 있다.

       ( 필요하다면 PD2(PD3)핀에 내부 풀업 저항을 연결한다.)

       ① 인터럽트 0번(1번)의 동작을 MCUCR을 설정하여 정한다.

       ② GICR레지스터의 INT0(INT1)비트를 세트시킨다.

       ③ SREG레지스터의 I비트를 세트시킨다.

이렇게 설정이 완료된 시점 이후부터는 INT0(INT1)핀에서 전기적인 신호가 변하면 인터럽트가 발생하게 된다.



Posted by 살레시오
,