본문 바로가기
💻 Microprocessor/캡스톤 챌린지

[2주차] Capston challenge 1

by GroovyArea 2022. 9. 12.

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

Status Register(SREG)

  • 7번째 Bit - I : Global Interrupt Register Enable
  • Interrupt 발생 시 I 비트를 1로 지정한다. => 0으로 지정시엔 모든 Interrupt 금지.
  • 모든 Interrupt Service를 처리하게 되면 다시 1로 지정된다. 전원 리셋 시 자동 클리어.
  • CLI & SEI 명령을 사용해 0과 1을 Enable 가능.

 

External Interrupt Mask Registers

External Interrupt Mask Registers(EIMSK)

  • 7개의 INT(0~7) 비트들을 개별적으로 허용 또는 금지 시 사용한다. 0과 1로 조작 가능
  • 개별적으로 인터럽트 요청에 필요한 PIN의 edge나 Level Mode를 EICRA 및 EICRB 레지스터로 Set 가능.

 

External Interrupt Flag Registers

External Interrupt Flag Registers(EIFR)

  • 해당 비트 External Interrupt 발생 시 1로 Enable 된다.
  • Flag의 역할을 하는 Register라고 이해하자.

 

External Interrupt Control Register A

External Interrupt Control Register A(EICRA)

  • 각 8개의 Pin으로 mode 세팅 가능
  • INT3~0은 EICRA Register, INT7~4는 EICRB Register Edge 또는 Level Trigger Mode Setting 가능

 

External Interrupt Control Register B

External Interrupt Control Register B(EICRB)

  • AVR 내부 Clock과 동기되어 인터럽트 발생 신호를 인식한다.
  • 최소 1 Cycle동안 신호가 유지되어야 인터러븥로 인식 가능.

 

Interrupt Process

  1. INT0 ~ 7핀의 Level 또는 Edge Trigger 변화가 생겼다. => EICRA 또는 EICRB의 Setting 을 참조해 EI가 발생
  2. EIFR의 해당 비트가 세팅됨. => 인터럽트 요청 > SREG의 I비트가 1로 설정되었고, EIMSK의 해당 인터럽트가 Set 되어 있을 시에는 Priority를 고려하여 인터럽트가 발생한다.
  3. 인터럽트가 발생하면 EIFR의 해당 비트는 Reset (그래야 중간에 못 끼어드니까). 순차적으로 SREG 의 I비트 Reset, EIMSK의 해당 비트 Reset
  4. 개괄적 과정
    1. 기존 실행중이던 프로그램 중단
    2. Program Counter를 Stack에 Push 
    3. Interrupt Vector Table에서 Interrupt Service Routine의 Address 획득해 실행
    4. PC 값을 Stack에서 Pop
    5. SREG의 I비트를 1로 재설정
    6. 기존 프로그램 재실행

 

예제 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 언어를 이용해 설명

EIFR

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 현상을 방지
반응형