외부인터럽트

2019. 10. 22. 22:24avr-atmega128

datasheet p.89내용을 참조

 

크게 EICRA, EICRB, EIMSK

 

INT3:0는

-SREG의 I flag를 set

-EIMSK의 활성화하고자하는 pin에 해당하는 bit를 set

다음 두조건을 만족하면 external interrupt를 사용할 준비가 된다.

 

그리고 EICRA(INT3:0)의 ISCn1, ISCn0의 값에 따라 interrupt가 generate될 시점을 정한다.

-low level, falling edge, rising edge 세가지중 하나를 정할 수 있다. (interrupt발생을 위해서는 최소유지시간이 필요하며 p.90에 적혀있다.)

 

이 조건을 만족하는 edge가 발생하면 SREG값이 clear되고 EIFR의 bit가 set되는데 이때 interrupt vector로 점프하게 된다.

이 bit는 routine을 완료하게 되면 clear된다.

(SW적으로 1을 넣어서 clear시킬수도있다.,  interrupt vector 세부내용은 p.59)

 

INT7:4까지도 과정은 동일하며 EICRA대신 EICRB를 설정해야하는 점이 다르다.

ISCn1/ISCn0 bit를 바꿀수도 있지만 그럴경우 반드시 EIMSK를 먼저 clear시켜줘야한다. 그렇지않으면 두bit를 바꾸는 순간 interrupt가 발생한다.

 

본 예제는 avrstudio 4.0, WINAVR 을 사용하므로 다른 컴파일러를 사용할 경우 다를 수도 있습니다.

 

#include <avr/io.h>
#include <avr/interrupt.h>
#include 
#include <util/delay.h>

ISR(INT2_vect, ISR_BLOCK)
{
PORTA=0xff;
_delay_ms(1000);
}

ISR(INT3_vect,ISR_BLOCK){ //앞의 매개변수는 점프하고자하는 routine, 뒤의 매개변수는 속성
PORTA=0xff;
_delay_ms(1000);
}

int main(void){
DDRA=0xff;
DDRD=0x00; //external interrupt로 이용
cli(); //SREG의 I비트를 해제

EICRA=0xA0; //INT3:0을 falling edge에서 interrupt를 인식하도록 설정
EICRB=0x00; //INT7:4 low level감지
EIMSK=0x0c; //INT2,3을 활성화
sei(); //나중에 넣어주는 이유는 초기에 설정하게 되면 interrupt를 인식해서 설정이 채 되기도 전에 routine으로 뛰어버립니다.
while(1)
{
PORTA=0x00;
}
}

 

 

avrstudio에서 external interrupt 매크로 명령에 대한 설명을 다음과 같다.

 

ISR(vector, attributes)

attributes에서 

1.ISR_BLCOK--->현재 진행중인 interrupt routine이 끝날때까지 도중에 걸린 interrupt는 대기

2.ISR_NOBLOCK--->현재진행중인 interrupt에서 건너뛰어 도중에 걸린 interrupt를 우선처리

 

3.ISR_NAKED--->interrupt routine을 사용자가 정의한다. 위에서 말했다시피 routine이 완료되면 SREG값이 

 

4.ISR_ALIASOF(target_vector)

ex)ISR(INT3_vect,ISR_ALIASOF(INT2_vect))--->다음과 같이 설정하면 INT2의 interrupt routine과 같은 동작을 하게된다.

 

5.ISR_NAKED

--->routine 종료시 기존의 register를 전부 백업해 뒀다가 돌려놓는데 간단한 interrupt routine시에는 이런 동작을 불필요하므로 생략시킬수 있다. 그러나 SREG값이 자동으로 변경되지 않으므로 처리루틴 마지막에는 반드시 reti();를 작성해야 루틴을 종료시킬수 있다.

'avr-atmega128' 카테고리의 다른 글

Analog To Digital Converter  (0) 2019.11.02
16bit Timer/Counter  (0) 2019.10.25
8bit Timer/Counter  (0) 2019.10.25
직렬통신  (0) 2019.10.18
Serial Peripheral Interface  (0) 2019.07.12