인터럽트
- 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내 인터럽트 벡터 매크로
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;
}
'로봇 > 전기전자&메카' 카테고리의 다른 글
하드웨어회로설계 - 1. orcad 개요 (0) | 2020.08.10 |
---|---|
마이크로프로세서 메카트로닉스 제어 - 11 외부 인터럽트 (0) | 2020.05.14 |
마이크로프로세서 메카트로닉스 제어 - 9 LCD 제어 2 (0) | 2020.05.13 |
마이크로프로세서 메카트로닉스 제어 - 8 LCD 제어 1 (0) | 2020.05.13 |
마이크로프로세서 메카트로닉스 제어 - 7 FND (0) | 2020.05.13 |