2019. 10. 22. 22:24ㆍavr-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 |