[Interrupt]
인터럽트란?
CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치에
예외상황이 발생하여 처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것
우선적으로 처리해야할 일이 발생하였을 때 그것을 처리하고 원래 동작으로 돌아옴
크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 나눔
1. H/W Interrrupt
일반적인 인터럽트를 이르는 말
CPU외부로부터의 인터럽트 요구 신호에 의해 발생되는 인터럽트
Maskable interrupt, Non-maskable interrupt 가 있다.
(Interrunpt Mask가 가능)
① Maskable interrupt
- Interrupt Mask(인터럽트가 발생하였을 때 요구를 받아들일지 말지 지정하는 것)가 가능
- 인텔CPU 에서 INTR pin으로 신호가 들어옴
② Non Maskable interrupt
- Interrupt Mask가 불가능
- 거부, 무시할 수 없음 (매우 중요함)
- 정전, 하드웨어 고장 등 어쩔수없는 오류
- 인텔 CPU에서 NMI pin으로 신호가 들어옴
H/W Interrrupt 종류
- 입출력 인터럽트 (I/O interrupt)
: 입출력 작업의 종료나 입출력 오류에 의해 CPU의 기능이 요청됨
- 정전,전원 이상 인터럽트(Power fail interrupt)
: 전원 공급의 이상
- 기계 착오 인터럽트(Machine check interrupt)
: CPU의 기능적인 오류
- 외부 신호 인터럽트(External interrupt)
: I/O 장치가 아닌 오퍼레이터나 타이머에 의해 의도적으로 프로그램이 중단된 경우
2. 소프트웨어 인터럽트
CPU내부에서 자신이 실행한 명령이나 CPU의 명령 실행에 관련된 모듈이 변화하는 경우 발생
trap 또는 exception 이라고도 함
프로그램의 오류에 의해 생기는 인터럽트
소프트웨어 인터럽트 종류
- 프로그램 검사 인터럽트 (Program check interrupt)
- 0으로 나누는 경우
- OverFlow/UnderFlow
- 페이지 부재
- 부당한 기억장소의 참조
- SVC(Supervisor Call: 감시프로그램 호출)인터럽트
- 사용자가 프로그램을 실행시키거나 supervisior을 호출하는 동작을 수행하는 경우
- 프로그래머에 의해 코드로 짜인 감시 프로그램을 호출하는 방식
인터럽트 서비스 순위
외부 인터럽트
※ 외부 인터럽트를 발생시키기 위해서는,
먼저 SREG 와 EIMSK 레지스터를 먼저 활성화시켜야 한다.
sei() : 인터럽트 발생을 전역적으로 허용하는 것
cli() : 인터럽트의 발생을 전역적으로 허용치 않도록 설정
1. EIRCA
- 00, 10, 01 : 각각의 조건(level, edge)이 만족될 때, 인터럽트를 발생시킨다.
- Reserved : 제조사에서 특수한 기능을 사용하기 위해 reserve시켜놓은 것으로, 임의로 사용 불가
2. EIRCB
- Any logical : rising edge, falling edge 둘 다 사용 가능(=both edge)(low level은 해당 안 됨)
∴ EIRCA, EIRCB : 어떤 핀에서 어떤 조건일 때 인터럽트를 발생시킬지 결정하는 레지스터
ex) EIRCB |= (1<<ISC51) | (0<<ISC50);
→ INT5 를 falling edge일 때 인터럽트 실행되도록 설정
3. EIMSK
- Interrupt mask
: 인터럽트가 발생하였을 때, 그 인터럽트를 실행할 지 말 지 결정하는 것
- 기능
: INT [7:0]를 각각 interrupt mask할 수 있는 기능을 제공하며,
1이 세팅되었을 때 활성화된다.
ex) EIMSK |= (1<<INT4);
→ INT4 의 인터럽트 활성화
4. EIFR
- 인터럽트 루틴이 발생하면, 플래그가 생성되고
이미 작성되어 있다면 새로운 플래그를 만들어 덮어쓴다.
[Timer/Counter]
평소에 우리가 써왔던 _delay_ms() 명령어는 Interrupt의 한 종류이다.
(해당 명령어가 사용되는 동안 CPU는 연산을 멈춘다.)
간단한 코딩에서는 상관이 없는데, ㎱단위를 다루는 Microchip에서는 딜레이 명령어로 인한 손실이 클 수 밖에 없다.
따라서 우리는 async(비동기)로 작동하는 타이머/카운터를 활용하여 딜레이 명령을 내려야 할 필요가 있다.
실제로는 정확한 시간과 측정을 위해 사용한다.
clock vs counter
1. Clock
: 일정한 시간 간격으로 0이나 1의 값이 주어진다.
클럭을 통하여 주어진 일을 정확한 시간에 처리하기 위해 사용된다.
2. Counter
: clock을 세는 기능
Timer vs Counter
1. Timer
- MCU 내부 clock을 세는 장치
- Synchronous(동기)
- 내부 clock을 세어 일정 시간동안 펄스를 만들어 내거나 일정 시간 뒤에 인터럽트 발생시킴
- 빠르다.
- 분주 가능 : 범위 내에서 clock 선택 가능(AVR은 분주비 고정)
2. Counter
- MCU 외부에서 입력되는 clock을 세는 장치
- Asynchronous(비동기)
- 외부 핀(TOSC1, TOSC2, T1, T2, T3)을 통하여 인가되는 펄스를 계수하여 동작
- 느리다
- 분주 불가능 : 외부 clock을 그대로 사용한다.
3. 동작
- Timer의 동작
: 내부 clock ▶ Prescaler(분주) ▶ Control Logic ▶ OVF
0x00 ~ 0xff 로 카운트 후 overflow되면 interrupt 발생
- Counter 동작
: 외부 clock ▶ Control Logic ▶ COMP
OCR의 값과 비교하여 매치가 되면 interrupt 발생
Prescaler
우리가 쓰는 보드의 주파수는 16MHz이므로 1초에 16,000,000번 튄다.
이렇게 고속의 clock을 사용하는 타이머를 동작시킬 때 발생하는 문제를 방지하기 위해
clock을 분주하여 더 느린 타이머를 구성한다.
- TCNTx : 0~255의 범위를 가지고 카운트하는 레지스터(8bit일 때)
- 16MHz : 0.000000625sec(625ns)에 한 번씩 뛴다
1) 128 분주
: 0.000000625 × 128 × 256 = 0.002048 = 2.048ms
∴ 0~255까지 카운트하는데 2.048ms 걸린다.
2) 256 분주
: 0.000000625 × 256 ×256 = 0.004096
3) 256 분주 + TCNT 초기값 변경
: 0.000000625 × 256 × (256-131) = 2ms
→ count 시작을 130부터
4) 64 분주
: 0.000000625 × 64 × 256 = 1.024ms
ATmega128의 Timer/Counter
Timer0~Timer3 까지 총 4개의 Timer/Counter를 가진다.
보드를 보면, 은색 깡통이 두 개 달려 있는데 이 것이 바로 크리스탈(오실레이터)
1) 8bit Timer
- Timer0, Timer2 : 짝수 번호의 타이머
- 내부 크리스탈에 접속하여 사용 가능하기 때문에
RTC(Real Time Clock) 기능을 가진다.
- 인터럽트 기능 보유
(오버플로우 intr, 출력비교 intr)
- 10bit prescaler 구성
- Timer0 : 1, 8, 32, 64, 128, 256, 1024 의 분주비
Timer2 : 1, 8, 64, 256, 1024 의 분주비
2) 16bit Timer
- Timer1, Timer3 : 홀수 번호의 타이머
- 인터럽트 기능 보유
(오버플로우 intr, 출력비교 intr, 입력캡쳐 intr)
- PWM(Pulse Width Modulation) 출력 가능
※ Timer/Counter 관련 레지스터
1. TCCRn
: 타이머 카운터를 제어하는 레지스터 동작 모듈을 결정
1) Bit 7
: FOC0 (Force Output Compare)
해당 bit가 1로 set되면, 출력 비교 인터럽트 실행(OC핀 작동)
2) Bit 6, 3
: WGM00~01 (Waveform Generation Mode)
타이머/카운터의 동작모드 설정
카운터의 카운팅 방향, 최대카운터값, 파형 생성 방식 등을 결정한다/
아래 표와 같이 해당하는 mode에 따라 파형 발생
보통 Fast PWM Mode를 많이 사용한다.
3) Bit 5, 4
: COM00~01 (Compare Match Output Mode)
- 비교 매치 출력 모드
Non-PWM mode | ||
COM n1 | COM n0 | 내용 |
0 | 0 | 범용 입출력 포트 OC0 출력 차단 |
0 | 1 | 비교 매치 → OC0 = Toggle 출력 |
1 | 0 | 비교 매치 → OC0 = 0 출력 |
1 | 1 | 비교 매치 → OC0 = 1 출력 |
Fast PWM mode | ||
COM n1 | COM n0 | 내용 |
0 | 0 | 범용 입출력 포트 OC0 출력 차단 |
0 | 1 | Reserved |
1 | 0 | 비교 매치 → OC0 = 0 출력 오버플로우 → OC0 = 1 출력 |
1 | 1 | 비교 매치 → OC0 = 1 출력 오버플로우 → OC0 = 0 출력 |
Phase Correct PWM mode | ||
COM n1 | COM n0 | 내용 |
0 | 0 | 범용 입출력 포트 OC0 출력 차단 |
0 | 1 | Reserved |
1 | 0 | 상향 카운터 비교 매치 → OC0 = 0 출력 하향 카운터 비교 매치 → OC0 = 1 출력 |
1 | 1 | 상향 카운터 비교 매치 → OC0 = 1 출력 하향 카운터 비교 매치 → OC0 = 0 출력 |
2. TCNTn
- Timer/Counter n 의 8bit 카운터 값을 저장하고 있는 레지스터
- 0~255까지의 범위를 가지고 카운팅할 수 있다.
3. OCR0
- Timer/Counter의 카운터값인 TCNT와 비교하여 OC0 단자에 출력 신호를 발생하기 위한 8bit값 저장
- 사용자가 지정할 수 있다.
4. TIMSK
- Timer/Counter에 대한 개별적인 인터럽트를 허용하는 레지스터
- Bit 1, 7 (OCIE0, OCIE2)
: Timer/Counter 0과 2의 출력 비교 인터럽트 활성화
- Bit 0, 6 (TOIE0, TOIE2)
: Timer/Counter 0과 2의 Overflow 인터럽트 활성화
[Timer/Counter의 동작]
1. Normal mode
- 일반적인 Timer Overflow Interrupt 필요 시, 사용
- 상향 Counter
- 0x00~0xff 반복
- count 도중 clear 없음
- OVF(Overflow Interrupt) : Max = 0xff일 때 발생
- COMP(Compare Match Interrupt) : 파형을 예상하기 어렵다.
2. CTC mode
(Clear Timer on Compare Match mode)
- 주파수 분주 기능으로 주로 사용
- 상향 Counter
- 0x00 ~ OCR0 동작 반복
- OCR0값과 TCNT값이 같으면, count 중간에 clear
- OVF : Mac = OCR0일때 발생
Normal 모드에서는 TCNT0이 overflow되었을 때 interrupt가 발생하는 반면,
CTC mode에서는 OCRn의 레지스터에 원하는 값을 넣게 되면,
TCNT0이 OCRn의 값만큼 증가된 뒤, Compare match interrupt가 발생하게 된다.
즉, 유저가 원하는 값으로 Interrupt를 발생시킬 수 있는 장점이 있다.
CTC에서는 TCNT0 == OCRn 이 되었을 때,
TCNT0 = 0 이 되므로 ISR 초기화가 필요없어 Compare match interrupt를 이용하여 구현된다.
3. Fast PWM
- 높은 주파수의 PWM 파형 발생이 필요할 때 사용
- 상향 counter single -slope operation
- 0x00 ~0xff 반복
- TCNT0과 OCR0의 compare match되면 OC0에 low 출력(COM0 1:0 = 2)
- 0xff → 0x00 오버플로우되면 OC0에 low 출력(COM0 1:0 = 2)
4. Phase Correct PWM
- 고해상도의 PWM 출력 파형을 발생하는데 사용
- 상향 카운터 : 0x00 ~ 0xff
- 하향 카운터 : 0xff ~ 0x00
- 0x00 ~0xff ~ 0x00 동작 반복
- 상향 카운터 비교 매치 → OC0 = 0 출력(COM 1:0 = 2)
- 하향 카운터 비교 매치 → OC0 = 1 출력(COM 1:0 = 2)
'# Semiconductor > - Semicon Academy' 카테고리의 다른 글
[Harman 세미콘 아카데미] 19일차 - C언어(C표준함수, Buffer, malloc, Memory Dump) (0) | 2023.07.13 |
---|---|
[Harman 세미콘 아카데미] 18일차 - Timer/Counter, Interrupt 실습 (2) | 2023.07.12 |
[Harman 세미콘 아카데미] 17일차 - ATmege128 실습(LED shift, Tactile switch 활용), FSM의 개념 (0) | 2023.07.11 |
[Harman 세미콘 아카데미] 16일차 - ATmege128 setting & 실습(LED-on/off, shift, structure) (0) | 2023.07.10 |
[Harman 세미콘 아카데미] 16일차 - ATmege128의 개요 (0) | 2023.07.10 |