인터럽트 발생 조건
인터럽트 발생 조건
ATmega 128 인터럽트 3요소 중 제 1은 앞에서 언급한 인터럽트 소스입니다. 그러나 인터럽트 소스로 부터 인터럽트 요청이 있기만 하면 바로 인터럽트가 발생되느냐 하면 그렇지는 않습니다. 인터럽트가 개별적으로 허용(enable)되어 있어야 하고, 전체적으로도 허용 되어 있어야 합니다. 문제는 어떻게 해야 해당 인터럽트가 개별적으로 허용되고, 전체적으로 허용되느냐에 있습니다. 전제적으로 허용되는 것은 SEI라는 명령으로 SREG 레지스터의 비트7(I비트)을 1로 하면 되지만, 개별적으로 허용되는 것은 그렇게 쉽지 않습니다. 그 방법을 알기 위해서는 인터럽트 관련 레지스터를 알아야 합니다.
외부 인터럽트 및 관련 레지스터
ATmegal28 외부 인터럽트는 핀 INT7:0에 의해서 트리거됩니다. 외부 인터럽트가 허용(enable)되면 설사 INT7:0(PE7:4, PD3:0)가 출력으로 설정되어 있어도 인터럽트는 트리거됩니다. 외부 인터럽트는 하강에지에서도, 상승에지에서도, 저레벨에서도 트리거될 수 있습니다. 이것은 레지스터 EICRA(INT3:0) 및 EICRB(INT7:4)에서 지정됩니다. 저레벨(low level)로 되어 있는 경우에는 핀이 저레벨로 될 때 인터럽트는 트리거됩니다. INT7:4의 상승에지 및 하강에지 인터럽트를 인정하기 위해서는 I/O클록이 필요하고, INT3:0에 대한 저레벨 인터럽트와 에지 인터럽트는 비동기적으로 검출됩니다. 이들 인터럽트는 idle 모드 외의 sleep 모드로부터 프로세서를 깨우는 데도 사용됩니다. I/O 클록은 idel 모드를 제외한 모든 sleep 모드에서 정지됩니다. 상태 레벨 트리거의 인터럽트가 전력절약 모드에서 MCU를 깨우는 데 사용될 때에는 바꿔진 레벨이 얼마동안 지속되어야 합니다. MCU가 잡음에 강하도록 하기 위함입니다. 인터럽트를 전체적으로 허용하기 위해서 ATmega128은 SREG를 준비하고 있고, 개별적으로 허용하기 위해서, 즉 원하는 인터럽트만 남기고 나머지는 마스크하기 위해서 ATmega128 은 몇개의 마스크 제어 레지스터를 준비하고 있습니다. EIMSK(External Interrupt Mask register), TIMSK(Timer/counter Interrupt Mask register), UCSROB(USARTO and Status egister B) UCSR1B, ADCSRA(ADC Control and Status Register A) 등입니다. 이곳에서는 그 중 EIMSK 만을 다루겠습니다. ATmega128은 또 인터럽트 발생여부를 나타내기 위해서 몇 개의 플래그 레지스터를 준비하고 있습니다. EIFR(External Interrupt Flag Register), TIFR(Timer/counter Interrupt Flag Register), UCSROA(USARTO Control and Status Register A), UCSR1A, ADCSRA(ADC Control and Status Register A) 등입니다.