[Atmega128] 2. 외부 인터럽트 External Interrupts Register

2019. 8. 2. 15:57개발 관련 학습정리/AVR(atmega128) Register 분석

반응형

외부 인터럽트는 센서의 값 등 외부에서 신호를 입력받아 인터럽트를 발생시킨다.

입력받아야 할 때 자주 쓰이며 초기에 설정해야 하는 게 있다.

atmega128 기준으로 외부 인터럽트가 두개 있으며, A와 B로 표기한다.

 

 

 

 

 

순서

1. 인터럽트 포트를 input모드로 설정해준다.

2. EICRA or EICRB 레지스터를 설정해준다.

3. EIMSK 레지스터를 설정해준다.

 

 

 

 

1번의 인터럽트 포트를 input모드로 설정하는 것은 전 포스팅에서 다루었으니 2번과 3번을 알아보자.

 

 

 

 

 

1. EICRA..B - External Interrupt Control Register A.. B

 

ISC의 용도는 모드설정이다.
EICRB도 있다.

 

 

EICRA에서는 interrupt 0.. 3을, EICRB에서는 4... 7을 설정하게 되어있다.

이 레지스터의 용도는 인터럽트 모드를 조정하고, 사용할 인터럽트 번호를 설정하는 용도이다.

 

 

ISC0.. 7까지 사용하여 인터럽트 8개를 조정할 수 있고, 모드도 설정할 수 있다.

위의 표는 ISCn1과 ISCn0을 이용하여 인터럽트 발생하는 조건을 사용할 수 있는데,

00일 때는 low신호에서 발생,

10일 때는 falling edge에서 발생,

11일 때는 rising edge에서 발생한다.

여기서 falling edge는 1에서 0 될 때를 뜻하고, rising은 그 반대로 0에서 1 될 때를 뜻한다.

 

이렇게 N 번째 Interrupt의 모드를 정할 수 있다.

 

 

 

 

 

 

 

 

 

 

2. EIMSK - External Interrupt Mask Register

INT0.. 7 : External Interrupt Request 7.. 0 Enable

 

말 그대로 interrupt0.. 7까지를 enable 시키는 레지스터 비트이다.

 

 

 

 

 

 

 

 

 

 

 

3. EIFR - External Interrupt Flag Register

 

외부 인터럽트가 에지 트리거에 의해 요청된 경우 허용 여부에 상관없이 1로 세트 된다.

만약 인터럽트가 허용된 경우 자동적으로 0으로 클리어 된다.

이 플래그 값을 읽고 쓰는 것도 가능하다.

 

 

 

 

 

 

 

예제 코드 -> 외부 인터럽트가 들어올 때마다 led를 끄고 키는 코드

 

bool flag;
void setup()
{
    DDRB = 0x01
    DDRD = 0x00; // 외부에서 인터럽트를 받기위해 input으로 설정

    EICRA = 0x02; // 인터럽트 0번 falling edge 모드 사용

    EIMSK = 0x01; // 인터럽트 0번 enable
}

SIGNAL(INT0_vect) //인터럽트 0번에서 받을때 마다 호출되는 메서드이다.
{
    //간단한 플래그 예제
    if(flag)
    {
        flag = false;
        PORTB = 0x01;
    }
    else 
    {
        flag = true;
        PORTB = 0x00;
    }
}

 

 

참고로 io파트를 잠깐 설명하자면, PORT설정에서 1비트 수정할 때 PORTX.n을 사용해도 되지만,

PORTX |=을 사용해서 그 비트만 추가,

PORTX ~&=을 사용해서 그 비트만 제거시킬 수 있다.

 

 

 

 

 

 

 

 

 

[복두출판사]AVR ATmega128 프로그래밍 응용실습:ED-4513 마이크로프로세서 콤보 IT를 이용한, 복두출판사
반응형