728x90

인터럽트

- HW 인터럽트, SW인터럽트

 

소프트웨어 SW 인터럽트

- 소프트웨어 요청으로 발생되는 인터럽트

- 마이크로 프로세서 내부에서 발생

- ex) 타이머/카운터

 

하드웨어 인터럽트

- 하드웨어 요청으로 발생

- 마이크로 프로세서 외부에서 발생

- ex) 스위치, 센서류

 

인터럽트 처리 순서

1. 일반 작업 실행

2. 인터럽트 발생(요청)

3. 수행작업 정지(복귀 주소 저장)

- 인터럽트 벡터 테이블 -> ISR(Interupt Service Routine) 주소로 점프

4. 인터럽트 서비스 루틴 실행

5. ISR 종료후 복귀

6. 멈췃던 작업 실행

인터럽트 처리 순서

 

인터럽트의 종류

- ATmega128은 35개의 인터럽트로 구성

- 인터럽트 우선 순위는 하드웨어적으로 설정됨

인터럽트 벡터 테이블

 

 

폴링 Polling

- 명령어로 특정 레지스터 값을 계속 읽어 레지스터 값이나 핀 값 변화를 체크하는 방식

- 작업 중에 계속 변화가 있는지 확임함

 

폴링 예시

- while문으로 !(UCSRA & (1<<RXC))가 1인지 계속 확인함

- 1이 아니면(0이면) 계속 루프에 머무름

- 1이 된 상태에서 루프를 넘어감

unsigned char USART_Receive(void)
{
	while ( !(UCSRA & (1<<RXC)) )
    
    return UDR;
}

 

인터럽트 inturrupt

- 하드웨어적으로 변화를 체크하여 변화시에만 동작함

 

인터럽트 벡터 매크로

- 벡터 테이블에서 외부 인터럽트 4개를 사용한다고 하는 경우. 인터럽트 서비스 루틴을 쓸때 매크로를 선언을 해주어야함

 ex) vector no.2 ~ 5

- iom 128 헤더파일에서 벡터테이블에 해당되는 인터럽트 벡터 매크로 확인 가능

#define INT0_vector		_VECTOR(1)
#define SIG_INTERRUPT0	_VECTOR(1)

#define INT1_vector		_VECTOR(2)
#define SIG_INTERRUPT1	_VECTOR(2)

#define INT2_vector		_VECTOR(3)
#define SIG_INTERRUPT2	_VECTOR(3)

#define INT3_vector		_VECTOR(4)
#define SIG_INTERRUPT3	_VECTOR(5)

 

iom128 헤더 파일 열어봐야하는 이유

- 외부 인터럽트 마스크인 EMSK 레지스터의 비트 값들이 숫자로 정의됨

* EMSK레지스터 : External Interrupt Mask register

- 비트코딩 사용하기 위함

 EIMSK = (1<<INT0) | (1<<INT2);

-> EIMSK = (1<<0) | (1<<2);

 

iom128 헤더파일내 EIMSK 레지스터

 

iom128내 인터럽트 벡터 매크로

 

 

iom128내 외부 인터럽트 마스크 레지스터

 

 

인터럽트 서비스 루틴

1. 인터럽트 서비스 루틴은 함수가 아님

 * 인터럽트 호출이 발생 뒤 실행되는 구간이라 특정 메모리 주소로 지정됨.

 * 인터럽트 서비스 루틴 작성 규칙에 따라 구현해야함

2. 인터럽트 서비스 루틴 선언 방식

- SIGNAL(벡터) 형식 : 일부 통합 개발환경에서 지원 x

- ISR(뻭터, 속성)

#include <avr/interrupt.h>

ISR (벡터, 속성)
{
	//인터럽트 서비스 루틴 코드 삽입
}

3. AVR GCC 인터럽트 서비스 루틴 속성

- GCC Manual에서 설명

- EMPTY_INTERRUPT(벡터) : 빈 인터럽트 처리

- ISR_ALIASOF(벡터) : 동일한 ISR 수행

- BADISR_vect : 선언되지 않은 인터럽트 처리

- ISR_NOBLOCK : 중첩 인터럽트 처리. sei()

 * 8비트 마이크로 컨트롤러에서는 중첩을 쓸 일은 없음

- ISR_NAKED : ISR 루틴 직접 작성시, reti() 반드시 호출

 

 

벡터 매크로

- no 1 : 리셋

- 35가지가 있으며 아래의 벡터 매크로를 참고해서 인터럽트 사용시 해당 벡터 매크로 선언해야함

 

 

인터럽트 서비스 루틴과 벡터 매크로 작성예 1

#include <avr/interrupt.h>

ISR (INT0_vect)// INT0 인터럽트가 발생시 이 인터럽트 서비스 루틴 동작함
{
	//routine
}

/*
지원하지 않는 경우 존쟈
SIGNAL (SIG_INTERRUPT0)
{
	//routine
}
*/

 

인터럽트 서비스 루틴과 벡터 매크로 작성예 2

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

volatile unsigned int flag;

//외부 인터럽트 0번 발생시 동작
ISR (INT0_vect)
{
	PORTC = 0xFF;
    _delay_ms(50);
    PORTC = 0x00;
    _dela_ms(50);
}

//외부 인터럽트 2번 발생시 동작
ISR (INT2_vect)
{
	flag = run;
}
300x250

+ Recent posts