본문 바로가기

AVR/AVR 연습, Tutorial

AVR 외부 인터럽트 (AVR External interrupt) 제어 레지스터 - AVR 이론


인터럽트가 무엇일까요?



인터럽트란 Main()에서 기존에 프로그램 처리중에 외부의 신호나 변화에 의해서 인터럽트가 발생되면 그 인터럽트에 대응하는 프로그램을 먼저 처리하고 다시 Main()으로 복귀하여 주 프로그램을 처리하는 과정입니다.


인터럽트는 흔히 게임하는 아들에게 부모님이 심부름을 시켜 아들이 시킨일을 다하고 면 원래하던 게임으로 돌아오는 과정으로 표현하곤합니다.


AVR에서는 타이머/카운터0번, 타이머/카운터1번, 외부인터럽트(INT)등 다양한 인터럽트가 있으며 각각 처리방식에 따라서 또 여러가지로 세분화 됩니다.

여기서는 간단한 AVR실험에 자주 사용하게 될 외부인터럽트에 대해서 다루도록 하겠습니다.


외부 인터럽트?


외부인터럽트는 여러가지가 있겠지만 스위치입력에 인터럽트라는 속성을 부여했다고 생각하면 되겠습니다.

앞에서 스위치입력으로 LED를 제어해 보았는데 처음에 1번 스위치를 눌렀다면 다른 스위치를 누른다고 해도 1번 스위치를 눌렀을 때 프로그램이 다 끝날때까지 다른스위치를 눌러도 해당 프로그램이 동작하지 않았습니다.

하지만 1번 스위치의 프로그램을 메인프로그램에 짜고, 다른 스위치에 인터럽트를 걸어둔다면 다른스위치를 눌렀을 때 메인프로그램을 잠시 멈추고 다른스위치를 눌렀을 때 프로그램을 먼저 동작시키겠죠!

외부인터럽틀를 사용하는데 사용하는 레지스터는 3가지가 있습니다. GIMSK, MCUCR, EIFR



EIFR (External Interrupt Flag Resister)


EIFR레지스터는 외부인터럽트 상태 레지스터인데 TINY2313의 경우 외부인터럽트핀이 INT1, INT0 두개뿐이기 때문에 INTF1과 INTF0 두개밖에 없습니다.

해당 레지스터는 인터럽트가 발생되면 발생된 비트가 1로 설정됩니다.

1로 설정된 후에 새로 인터럽트 신호를 받을려면 1로 설정된 비트를 0으로 클리어 시켜야 다시 인터럽트를 받을 수 있는 상태가 됩니다.

클리어는 해당비트에 1을 써주면 비트가 클리어 됩니다.



GIMSK (Genaral Interrupt Mask Register)


GIMSK의 경우 AVR에서 각각 인터럽트시 인터럽트를 사용하라고 허용하라고 설정하는 레지스터들이 있는데 GIMSK는 외부 인터럽트사용시에 외부인터럽트를 사용하라고 허락하는 레지스터입니다

각각 해당 레지스터 7번, 6번비트가 각각 INT1, INT0번핀의 인터럽트를 허용하는 비트이고,

외부인터럽트를 사용하고자 할때는 해당 비트에 1을 써주어야 합니다.

GIMSK레지스터는 AVR시리즈에 따라 다르지만 EIMSK(External Interrupt Mask Register)로 되어있는 시리즈도 있습니다.


MCUCR (MCU Control Register)


MCUCR레지스터는 다양한 기능이 있으나 외부 인터럽트 사용시에는 3~0번 비트만 사용됩니다.

설정값을 표로보면 1~0번 비트의 설정에 따라 인터럽트 핀 INT0번의 동작옵션을 설정 할 수 있고 3~2번 비트의 설정에 따라 INT1번의 동작옵션을 설정 할 수 있습니다.

 ISC01

 ISC00

상태 

0

0

Low 레벨 인터럽트 사용 

0

1

기능없음

1

0

하강 에지 인터럽트 사용 (Rising Edge)

1

1

상승 에지 인터럽트 사용 (Falling Edge)



 ISC11

 ISC10

 상태

0

0

Low 레벨 인터럽트 사용 

0

1

기능없음 

1

0

하강 에지 인터럽트 사용 (Rising Edge)

1

1

상승 에지 인터럽트 사용 (Falling Edge)