External Interrupt Process의 대한 이해와 External Interrupt Register를 이용한 설명
- 인터럽트는 총 4가지의 mode가 있다. Low, Rising, Falling, Change
- Atmega2560은 8개의 External Interrupt가 존재하며, 우선 순위(Priority)에 따라 처리 가능하다.
External Interrupt의 사용 조건
- Status Register의 7번째 I비트를 '1'로 Enable한다.
- 해당 External Interrupt Mask Register를 "1"로 Enable한다.
- External Interrupt를 처리하는 방식
- Interrupt Vector를 이용하는 방법
- External Interrupt Flag Register를 이용해 Programming 하는 방법
External Interrupt Register를 이용한 설명
Status Register
- 7번째 Bit - I : Global Interrupt Register Enable
- Interrupt 발생 시 I 비트를 1로 지정한다. => 0으로 지정시엔 모든 Interrupt 금지.
- 모든 Interrupt Service를 처리하게 되면 다시 1로 지정된다. 전원 리셋 시 자동 클리어.
- CLI & SEI 명령을 사용해 0과 1을 Enable 가능.
External Interrupt Mask Registers
- 7개의 INT(0~7) 비트들을 개별적으로 허용 또는 금지 시 사용한다. 0과 1로 조작 가능
- 개별적으로 인터럽트 요청에 필요한 PIN의 edge나 Level Mode를 EICRA 및 EICRB 레지스터로 Set 가능.
External Interrupt Flag Registers
- 해당 비트 External Interrupt 발생 시 1로 Enable 된다.
- Flag의 역할을 하는 Register라고 이해하자.
External Interrupt Control Register A
- 각 8개의 Pin으로 mode 세팅 가능
- INT3~0은 EICRA Register, INT7~4는 EICRB Register Edge 또는 Level Trigger Mode Setting 가능
External Interrupt Control Register B
- AVR 내부 Clock과 동기되어 인터럽트 발생 신호를 인식한다.
- 최소 1 Cycle동안 신호가 유지되어야 인터러븥로 인식 가능.
Interrupt Process
- INT0 ~ 7핀의 Level 또는 Edge Trigger 변화가 생겼다. => EICRA 또는 EICRB의 Setting 을 참조해 EI가 발생
- EIFR의 해당 비트가 세팅됨. => 인터럽트 요청 > SREG의 I비트가 1로 설정되었고, EIMSK의 해당 인터럽트가 Set 되어 있을 시에는 Priority를 고려하여 인터럽트가 발생한다.
- 인터럽트가 발생하면 EIFR의 해당 비트는 Reset (그래야 중간에 못 끼어드니까). 순차적으로 SREG 의 I비트 Reset, EIMSK의 해당 비트 Reset
- 개괄적 과정
- 기존 실행중이던 프로그램 중단
- Program Counter를 Stack에 Push
- Interrupt Vector Table에서 Interrupt Service Routine의 Address 획득해 실행
- PC 값을 Stack에서 Pop
- SREG의 I비트를 1로 재설정
- 기존 프로그램 재실행
예제 1. INT1 External Interrupt에 대한 설명
- INT7에 Level 또는 Edge Trigger의 변화가 감지되었다.
- EICRB 레지스터의 ISC70 또는 ISC71 레지스터의 설정에 따라 인터럽트 요청함
- SREG의 I비트가 1로 세팅되어있다.
- EIMSK의 INT7 비트가 1로 세팅되어있다.
- EIFR의 INTF7 비트가 1이면 INT7 인터럽트 발생
예제 2. EIFR Register를 이용, External Interrupt(INT2)를 처리하는 Program을 AVR 언어를 이용해 설명
int main(void) {
unsigned char interrupt_count=0, flag;
initialize();
DDRD = 0xf0;
do {
flag = EIFR & 0x04;
//INT0 Flag Register(세 번째 비트)가 Set 이 됐는지 판단
if(flag) {
//Flag Register가 Set 되었으면, INT0 Interrupt request
interrupt_count++;
if(interrupt_count>9) {
interrupt_count=0;
}
PORTD = (interrupt_count<<4);
EIFR |= 0x04;
}
} while(1);
}
- flag 전역 변수를 비트 연산을 이용해 INT0의 세 번째 비트가 1로 Set 되었는지 판단한다.
- flag가 1이면 INT2의 Interrupt를 요청한다.
- Interrupt_count 변수를 선언해 카운트를 증가시키다 9를 넘어서는 경우 다시 0으로 Reset 시킨다.
- 마지막으로 INT2의 비트를 강제 클리어 시킨다. => bounce 현상을 방지
반응형
'💻 Microprocessor > 캡스톤 챌린지' 카테고리의 다른 글
[6주차] (Led Matrix) Capston Challenge (0) | 2022.10.13 |
---|---|
[5주차] (Timer Counter Interrupt) Capston Challenge (0) | 2022.10.09 |
[2주차] (External Interrupt) Caston Challenge 4 (2) | 2022.10.05 |