본문 바로가기
# Semiconductor/- Semicon Academy

[Harman 세미콘 아카데미] 18일차 - Interrupt, Timer/Counter 이론

by Graffitio 2023. 7. 12.
[Harman 세미콘 아카데미] 18일차 - Interrupt, Timer/Counter 이론
728x90
반응형
[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을 호출하는 동작을 수행하는 경우

    - 프로그래머에 의해 코드로 짜인 감시 프로그램을 호출하는 방식

 

인터럽트 발생 과정

 


 

인터럽트 서비스 순위

 

 


 

외부 인터럽트

 

INT PIN 위치
External interrupt(외부 인터럽트)는 INT [7:0] 핀에 의해 트리거된다.

※ 외부 인터럽트를 발생시키기 위해서는,

    먼저 SREGEIMSK 레지스터를 먼저 활성화시켜야 한다.

 

전역 인터럽트 활성화 레지스터(SEI 또는 CLI 명령어를 사용하여 설정)

sei() : 인터럽트 발생을 전역적으로 허용하는 것

cli() : 인터럽트의 발생을 전역적으로 허용치 않도록 설정

 

1. EIRCA

왼쪽부터 2bit씩 INT[3:0]을 핸들링한다.
.

  • 00, 10, 01 : 각각의 조건(level, edge)이 만족될 때, 인터럽트를 발생시킨다. 
  • Reserved : 제조사에서 특수한 기능을 사용하기 위해 reserve시켜놓은 것으로, 임의로 사용 불가

trigger 방식

2. EIRCB

왼쪽부터 2bit씩 INT[7:4]을 핸들링한다.
.

  • 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 출력

CS0n : 분주된 clock을 select

 

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)

728x90
반응형