##인터럽트
AVR에서 인터럽트를 제어하려면 네가지 선언과 한가지 include, 한가지 함수만 사용할 수 있으면 된다.
1. 4가지 선언
1) 포트개방
2) EICRA/B
3) EIMSK
4) SREG
1) 포트개방
ATMega 128에서는 D0~3번 포트 그리고 E4~7번 포트로만 인터럽트 신호를 받을 수 있다. 따라서 이에 해당하는 포트를 개방시켜주어야 한다.
DDR로 포트개방시 1은 출력 0은 입력을 뜻하므로, DDRD = 0x00; 등으로 선언해 주면 D포트에서 입력을 받겠다는 명령이 된다.
2) EICRA/B (External Interrupt Control Register A/B, 외부 인터럽트 제어 레지스터)
EICR 레지스터는 8비트로 2개 비트씩 한 쌍을 이룬다. 예를 들어, PD0에 대하여 01 00의 두개 비트를 가진다. 그리고 두개의 비트의 조합에 따라
EICRA
00 Low Level
01 예약
10 INT 하강에지
11 INT 상승에지
EICRB
00 Low Level
01 논리변화
10 INT 하강에지
11 INT 상승에지
와 같은 동작을 수행한다.
구조는 다음과 같다. 1bit 2bit 3bit 4bit 5bit 6bit 7bit 8bit
EICRA(외부인터럽트 0~3 트리거 설정 [PD0~3]) : | 31 | 30 | 21 | 20 | 11 | 10 | 01 | 00 |
EICRB(외부인터럽트 4~7 트리거 설정 [PE4~7]) : | 71 | 70 | 61 | 60 | 51 | 50 | 41 | 40 |
예를 들어, PD0에 대해서 상승에지에 인터럽트를 감지하고 싶다면
EICRA = 0b00000011; 이라고 선언해주면 된다.
3) EIMSK(External Interrupt MaSK, 외부 인터럽트 마스크 레지스터)
8비트이며 각 포트에서 발생한 인터럽트를 Enable할 것인지(수용할 것인지), Disable할 것인지(무시할 것인지) 판단하는 레지스터이다.
구조는 EIMSK : | INT7 | INT6 | INT5 | INT4 | INT3 | INT2 | INT1 | INT0 | 이다.
예를 들어, PD0에서 발생하는 인터럽트를 수용할 것이라면
EIMSK = 0b00000001;로 선언해주면 된다.
4) SREG(Status REGister, 상태 레지스터)
8비트이며 각 비트는 현재 CPU의 상태를 나타내준다.
최상위 I 비트가 1이 아닌 경우 인터럽트를 받지 않기 때문에, 1로 강제로 세팅해준다.
구조는 SREG : | I | T | H | S | V | N | Z | C |
I 글로벌인터럽트
T storage
H half carry
S sign
V overflow
N negative
Z zero
C carry
즉, SREG |= 0b10000000; 이며, 다른 레지스터와 다르게 원래 SREG와 or 연산을 시키는 이유는 SREG자체가 상태레지스터로 현재 프로그램이외에 다른 상태를 나타낼 수 있기 때문이다.
*) EIFR(Interrupt Flag Register)라는 것도 있는데, EIMSK와 비슷하게 각 자리가 Interrupt 포트와 매치된다. 이 레지스터는 각 포트에서 인터럽트가 발생하였는지 표시하는 레지스터이다.
2. 한가지 인클루드
#include<avr/interrupt.h>
인터럽트를 사용하려면 이 헤더파일을 인클루드 시켜주어야 한다.
3. 한가지 함수
ISR(INT4_vect)
이 함수는 INT4 포트에서 입력되는 인터럽트 신호가 있으면 작동되는 함수이다.
'ETC > AVR' 카테고리의 다른 글
AVR(ATMega 128) 타이머(클록) 제어 쉽게 하기! (0) | 2018.10.31 |
---|---|
[AVR][ATmega 128 작품] ATmega128로 FND 만들고 활용하기! -추가실험- (0) | 2018.10.12 |
[AVR][ATmega 128 작품] ATmega128로 FND 만들고 활용하기! (0) | 2018.10.10 |
[AVR][ATmega 128 작품] ATmega128로 연속 LED 시퀀스 만들기! (0) | 2018.10.08 |
[AVR][ATmega 128 작품] ATmega128로 7-segment LED 조작하기! (0) | 2018.10.08 |