이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

atmega2560-timer

ATmega2560 timer
  ATmega2560 timer


  • ATmega2560 Timer/Counter의 구성과 중요 기능
    • ATmega2560 Timer/Counter의 개요
      • 6개의 범용 타이머/카운트로 구성되어있다.
        • Timer/Counter0(8비트)
        • Timer/Counter2(8비트)
        • Timer/Counter1(16비트)
        • Timer/Counter3(16비트)
        • Timer/Counter4(16비트)
        • Timer/Counter5(16비트)
      • Timer
        • Clock(내부 또는 외부)를 이용 하여 일정한 시간 주기 또는 일정 시간 후에 Event(Interrupt)를 발생 시킨다.
      • Counter
        • 외부 핀(Tn)을 통해서 들어오는 Event를 Count(Edge Detector) 한다.
    • ATmega2560 Timer/Counter의 중요 기능
      • Timer 기능
        • 일정 주기의 Clock 신호를 Counting
        • 일정한 시간 주기를 갖는 펄스의 발생
        • Timer interrupt를 이용한 주기적인 프로그램(Task) 실행
        • 펄스 폭 제어
      • Counter 기능
        • Event Counter : 외부 핀을 통해서 들어오는 Event를 Count(Edge Detector) 한다.
      • Input Capture (Timer1,3,4,5) 기능
        • 시간 측정(펄스 폭 측정) : Input Capture Pin 신호의 제어에 따라 Timer/Counter Register의 값을 Capture 하여 시간(펄스 폭) 등을 측정 한다.
        • 펄스폭 측정 예: Timer/Counter에 일정 주기 신호를 가하고, Input Capture Pin에 피 측정 신호를 가 한다.
    • ATmega2560 Timer/Counter 구성
      • Timer/Counter Register
        • Timer 0,2는 8 Bit Timer/Counter Register를 갖고 있다.
        • Timer 1,3,4,5는 16 Timer/Counter Bit Register를 갖고 있다.
        • Timer/Counter Register는 일정한 주기의 Clock를 Counting 하여 Timer Rg 값이 시간에 비례한 값을 갖도록 하는 Timer로서의 기능과
        • External Event(Pin의로 부터 Event 신호가 입력됨)를 Counting 하는 Counter 기능(Timer 0,1,3,4,5)을 갖고 있다.
      • Output Compare Register
        • CPU로 부터 새로운 값(상수)를 Load 할 수 있다.
        • Output Compare Register의 값은 Timer/Counter Register와 비교기 회로를 이용 하여 비교되고, 그 결과는
        • Output Compare Match Interrupt를 발생 시키고, Timer/Counter Register(Clear Timer on Compare Match (Auto Reload))의 Clear, 일정한 주기의 Pulse 발생, PWM(Pulse Width Modulation) 등에 이용 된다.
      • Input/Output Pin
      • Timer/Counter의 I/O Pin은 I/O Port와 Pin을 공통으로 사용 하기 때문에 설정에 따라 동일한 Pin을 Timer/Counter 또는 I/O Port 가 사용 하게 된다.

        • Input Pin
          • External Event Input Pin(Tn): 외부 Event 신호를 입력 받는 Pin 이다. 이 Pin은 Timer/Counter 0,1,3,4,5에 있다.
          • Input Capture Pin(ICPx): Input Capture Register에 Timer/Counter Rg의 값을 Capture 하는 Trigger 신호 입력 Pin으로 사용 된다. 이 Pin은 Timer/Counter 1,3,4,5에 있다.
          • 내부 발진 회로에 필요한 외부 소자(크리스탈, C)를 연결 하는 Pin(TOSC1, TOSC2): Timer 2 는 내부에 발진 회로와 외부 소자를 접속하는 TOSC1 및 TOSC2 단자를 가지고 있어서 Real Time Clock(RTC)의 기능을 갖도록 할 수 있다.
        • Output Pin
          • OCn Pin: Output Compare Match에 의하여 Generation된 신호를 외부로 출력 하는 Pin 이다.
      • Control Register
      • 각 Timer/Counter는 각각 별도의 Control Rg을 갖고 있다. 자세한 기능은 정확한 코딩을 위하여 ATmega-2560_datasheet.pdf에서 해당 Timer의 Control Rg 부분 자료를 확인 하기 바람.

        • Timer/Counter의 기능을 Programable 하게 설정하는데 필요한 Rg로 Timer/Counter는 각각 아래와 같은 Control Rg를 갖고 있다.
        • Timer/Counter0: TCCR0A, TCCR0B, TCNT0, OCR0A, OCR0B, TIMSK0, TIFR0
        • Timer/Counter2: TCCR2A, TCCR2B, TCNT2, OCR2A, OCR2B, ASSR, TIMSK2, TIFR2, GTCCR
        • Timer/Counter1,3,4,5(n): TCCRnA, TCCRnB, TCCRnC, TCNTn, OCRnA, OCRnB, OCRnC, ICRn, TIMSKn, TIFRn,
    • ATmega2560 Timer/Counter 의 중요 응용 분야
      • Timer와 Counter로서 이용 됨.
      • Frequency Generator에 이용 됨.
      • Pulse width Modulator(PWM): DC Motor, 전력제어 등에 이용 됨.
      • Interrupt Source: Overflow, Output Compare Match Interrupt를 이용 하여 다양한 제어와 신호 발생을 할 수 있다.
      • External Event Counter로 이용 할 수 있다.(Timer0,1,3,4,5)
      • Input Capture(Timer1,3,4,5) 기능은 다양한 측정(Pulse 폭 측정, 주기 측정 등)에 이용 된다.
      • Timer/Counter2 : 외부 32.768kHz(2**15 = 32,768) 크리스탈을 접속하는 TOSC1 및 TOSC2 단자를 가지고 있어서 RTC의 기능을 갖도록 할 수 있다.
    • 8-Bit Timer/Counter0 Block Diagram
      • Timer/Counter0는 내부 Clock(clk) 신호를 Downscale 한 신호를 Prescaler로 부터 받을 수 있다.
      • 2개의 독립적인 Output Compare Units를 갖고 있다.
      • Timer/Counter0는 External Event Input Pin(Tn)을 갖고 있다.
    • 8_Bit Timer/Counter2 Block Diagram
      • Timer/Counter2는 내부 Clock(clk) 신호를 Downscale 한 신호를 Prescaler로 부터 받을 수 있다.
      • 2개의 독립적인 Output Compare Units를 갖고 있다.
      • Timer/Counter2는 외부 32.768kHz(2**15 = 32,768) 크리스탈을 접속하는 TOSC1 및 TOSC2 단자를 가지고 있어서 RTC의 기능을 갖도록 할 수 있다.
      • ASSRn: Control Rg 참고 요.
    • 16-Bit Timer/Counter1,3,4,5 Block Diagram
      • Timer/Counter1,3,4,5는 내부 Clock(clk) 신호를 Downscale 한 신호를 Prescaler로 부터 받을 수 있다.
      • 3개의 독립적인 Output Compare Units를 갖고 있다.
      • 1개의 Input Capture Unit를 갖고 있다.
      • External Event Input Pin(Tn)을 갖고 있다.
    • Timer/Counter0 Counter Unit Block Diagram
      • Timer/Counter0는 내부 Clock(clk) 신호를 Downscale 한 신호를 Prescaler로 부터 받을 수 있다. 또한
      • External Event Input Pin(Tn)으로 부터 외부 Event 신호를 받을 수 있다.
    • Timer/Counter2 Counter Unit Block Diagram
      • Timer/Counter2는 내부 Clock(clk) 신호를 Downscale 한 신호를 Prescaler로 부터 받을 수 있다. 또한
      • Timer/Counter2의 Counter(TCNT2)는 내부 Clock(clk)과 외부 32.768kHz(2**15 = 32,768) 회로를 접속하는 TOSC1 및 TOSC2 단자에 연결된 외부 회로(크리스탈과 C)와 T/C Oscillator 회로에 의한 발진 펄스(크리스탈의 고유 진동 수로 발진 함)를 입력으로 선택 할 수 있다.
      • 외부 크리스탈과 발진회로에 의하여 발진된 펄스는 주파수가 매우 안정적 이기 때문에 Real Time Clock(RTC)를 구현 하는데 이용 된다.
      • 32.768kHz 크리스탈을 사용 하는 경우 이 주파수를 Prescaler에서 1/32,768(2**15)로 Downscale 하여 1 Sec 신호를 얻을 수 있다.
    • Timer/Counter1,3,4,5 Counter Unit Block Diagram
      • Timer/Counter1,3,4,5는 내부 Clock(clk) 신호를 Downscale 한 신호를 Prescaler로 부터 받을 수 있다. 또한
      • External Event Input Pin(Tn)으로 부터 외부 Event 신호를 받을 수 있다.
      • Timer/Counter1,3,4,5의 Counter(TCNTn)는 16 bit 이다.
    • Timer/Counter0,2 Output Compare Unit, Block Diagram
      • Timer/Counter Rg(TCNTn)과 Output Compare Rg(OCRnx)의 값이 비교기(Comparator)에 의하여 비교되어 두 Rg의 값이 같을 때 OCFnx(Int.Req) 신호가 발생 한다.
      • Waveform Generator는 설정된 동작 모드(WGMn, COMn 등의 설정에 따라)에 따라 다양한 모드의 출력 신호를 Generation 하여 OCnx Pin에 출력 한다.
    • Timer/Counter1,3,4,5 Output Compare Unit, Block Diagram
      • Timer/Counter Rg(TCNTn)와 Output Compare Rg(OCRnx)의 값이 비교기(Comparator)에 의하여 비교되어 두 Rg의 값이 같을 때 OCFnx(Int.Req) 신호가 발생 한다.
      • Waveform Generator는 설정된 동작 모드(WGMn, COMn 등의 설정에 따라)에 따라 다양한 모드의 출력 신호를 Generation 하여 OCnx Pin에 출력 한다.
    • Timer/Counter0,2 Timer/Counter Compare Match Output Unit
      • Waveform Generator에서 발생된 OCnx 신호는 COMn0 또는 COMn1 이 1 이고 해당 Port 가 Output Port로 설정(DDR Rg의 Q가 1인 경우)된 경우 OCnx Pin에 출력 된다.
      • OCnx 신호가 OCnx Pin에 출력 되지 않는 경우에도 OCFn(Output Compare Interrupt Req.) 신호를 Interrupt Request 신호로 이용 할 수 있다.
    • Timer/Counter1,3,4,5 Timer/Counter Compare Match Output Unit
      • Waveform Generator에서 발생된 OCnx 신호는 COMn0 또는 COMn1 이 1 이고 해당 Port 가 Output Port로 설정(DDR Rg의 Q가 1인 경우)된 경우 OCnx Pin에 출력 된다.
      • OCnx 신호가 OCnx Pin에 출력 되지 않는 경우에도 OCFnx(Output Compare Interrupt Req.) 신호를 Interrupt Request 신호로 이용 할 수 있다.
    • Input Capture Unit
      • Input Capture Unit은 ICPn 신호에 의하여 Timer/Counter의 값을 Capture 한다.
      • Capture Rg에 Capture 된 값은 ICPn에 인가된 신호의 특성을 측정(펄스 폭, 주파수 등) 하는데 이용 할 수 있다.
  • Timer/Counter의 Operation Mode
    • 여기서는 Timer/Counter0를 예로 성명 한다.

      Timer/Counter 1,2,3,4,5 Operation Mode도 Timer/Counter 0의 Mode와 유사하나 정확한 코딩을 위하여 ATmega-2560_datasheet.pdf에서 해당 Timer의 자료를 확인 하기 바람.

    • Normal Mode
      • 항상 Up Counter로 동작 한다.
      • 0x00~0xff(16 Bit Timer인 경우 0xffff) 구간을 반복 Counting 한다.
        • TCNT의 값을 임의의 값으로 다시 설정 할 수 있다.
        • TCNT의 값의 설정에 따라 Overflow Interrupt 발생 시간을 조절 할 수 있다.

      • MAX = 0xff(16 Bit Timer인 경우 0xffff) 일 때 Overflow Interrupt 이 발생 한다.
      • TCNT와 OCR Rg가 Match 되면 Out Compare Match Interrupt 이 발생 한다.
        • 일정한 시간 지연 후에 Interrupt 발생이 필요 한 경우 이 Interrupt 가 유용 하다. Timer1,3,4,5에서는 하나의 Timer로 3개의 서로 다른 Interrupt 주기를 발생 시킬 수 있다.
        • 그러나 주기적인 Pulse 발생에 이 모드를 사용 하는 것은 Interrupt가 발생 할 때 마다 Interrupt 처리 Routine이 실행 되어야 하기 때문에 CPU 사용 측면에서 비 효율적 이다.
    • CTC Mode(Clear Timer on Compare Match Mode)
      • 일정한 주기 또는 주파수를 발생 하고자 할 때 사용 한다.
      • 항상 Up Counter로 동작 한다.
      • 0x00~OCR0 구간을 반복 Counting 한다.
      • OCR0값과 TCNT0값이 같으면 카운트 도중 Clear 된다.
      • TCNT0 = OCR0 일 때 Output Compare Match Interrupt가 발생 한다.
      • 오버프로우(OVF) 인터럽트(MAX = OCR0 일때)도 발생 하지만, Output Compare Match Interrupt 인터럽트와 동일하게 발생 되기 때문에 Output Compare Match Interrupt 인터럽트를 사용 하는 것이 좋다.
      • 이 모드는 Software 실행 없이 일정한 주기의 Pulse를 연속적으로 발생 할 수 있다.
      • Timer/Counter 0,2 CTC Mode, Timing Diagram
      • Timer/Counter 1,3,4,5 CTC Mode, Timing Diagram
    • FAST PWM Mode
      • 높은 주파수의 PWM 파형발생이 필요할 때 사용 한다.
      • 상향카운터 (Single-Slope Operation)로 동작 한다.
      • 0x00 ~ Top 구간을 반복 Counting 한다.
      • TCNT0과 OCR0의 Compare Match되면 OC0에 LOW(COMn 1:0 = 2 인 경우)가 출력 된다.
      • Top → 0x00 : Overflow 발생 시 OC0에 HIGH(COMn 1:0 = 2 인 경우)가 출력 된다.
      • Timer/Counter 0,2 Fast PWM Mode, Timing Diagram
      • Timer/Counter 1,3,4,5 Fast PWM Mode, Timing Diagram
    • Phase Correct PWM Mode
      • 높은 분해능의 PWM출력 파형을 발생하는데 사용
      • 상향카운터 0x00 → Top, 하향카운터 Top → 0x00
      • 0x00 ~ Top ~ 0x00 구간을 반복 하여 Counting 한다.
      • Compare Output Mode가 COM1:0=2로 설정된 경우 상향 Counting 도중 Compare Match 가 발생 하면 OC0 Pin에 0가 출력 된다.
      • Compare Output Mode가 COM1:0=2로 설정된 경우 하향 Counting 도중 Compare Match 가 발생 하면 OC0 Pin에 1이 출력 된다.
      • Timer/Counter 0,2 Phase Correct PWM Mode, Timing Diagram
      • Timer/Counter 1,3,4,5 Phase Correct PWM Mode, Timing Diagram
    • Phase and Frequency Correct PWM Mode
      • 높은 분해능의 PWM출력 파형을 발생하는데 사용
      • 상향카운터 0x00 → Top, 하향카운터 Top → 0x00
      • 0x00 ~ Top ~ 0x00 구간을 반복 하여 Counting 한다.
      • Compare Output Mode가 COM1:0=2로 설정된 경우 상향 Counting 도중 Compare Match 가 발생 하면 OC0 Pin에 0가 출력 된다.
      • Compare Output Mode가 COM1:0=2로 설정된 경우 하향 Counting 도중 Compare Match 가 발생 하면 OC0 Pin에 1이 출력 된다.
      • Phase correct mode와 Phase and frequency correct PWM mode의 차이는 OCRnx Register 가 OCRnx Buffer Register에 의하여 Update 되는 시간이 다른 것 이다.
      • Timer/Counter 1,3,4,5 Phase and Frequency Correct PWM Mode, Timing Diagram

  • Prescaler for Timer/Counter
    • Timer/Counter 0, 1, 3, 4, and 5 Prescaler
      • Timer/Counter0,1,3,4,5의 Clock source는 System clock(clkI/O)에 기본으로 연결 되어 있다.
      • CSn0 - CSn2의 설정에 따라 clk_IO Clock를 clk_IO/1, clk_IO/8, clk_IO/64, clk_IO/256, clk_IO/1024 비율로 prescale한 신호 또는 External clock source를 Timer/Counter0,1,3,4,5의 Clock source로 사용 할 수 있다.
      • CSn0 - CSn2를 0,0,0로 설정 하면 Clock 신호가 0(stop)가 되어 Timer/Counter 동작을 정지 할 수 있다. Timer/Counter를 시용 하지 않는 경우 전력 소비를 줄이기 위하여 CSn0 - CSn2를 0,0,0로 설정 하여야 한다.
      • GTCCR Rg의 PSRSYNC bit를 1로 Set하면 Prescaler가 Reset 된다. 이 기능은 Timer의 Clock source를 정확히 제어 하기 위하여 사용 된다.
    • Timer/Counter 2 Prescaler
      • Timer/Counter2의 Clock source는 System clock(clkI/O)에 기본으로 연결 되어 있다.
      • CS20 - CS22의 설정에 따라 clk_I/O Clock를 clkT0S/1, clkT0S/8, clkT0S/32, clkT0S/64, clkT0S/128, clkT0S/256, clkT0S/1024 비율로 prescale한 신호를 Timer/Counter0의 Clock source로 사용 할 수 있다.
      • CS20 - CS22를 0,0,0로 설정 하면 Clock 신호가 0(stop)가 되어 Timer/Counter 동작을 정지 할 수 있다. Timer/Counter를 시용 하지 않는 경우 전력 소비를 줄이기 위하여 CS00 - CS02를 0,0,0로 설정 하여야 한다.
      • ASSR Rg의 AS2 bit 1로 Set 하면 Clock source는 TOSC1 Pin 신호에 연결 되어 Timer/Counter0를 Real Time Counter(RTC)로 사용 할 수 있게 한다.
      • 32.768 kHz Crystal과 적당한 C를 Pin TOSC1과 TOSC2에 연결 하여 Real Time Counter(RTC)로 사용 할 수 있다.
      • GTCCR Rg의 PSRASY bit를 1로 Set하면 Prescaler가 Reset 된다. 이 기능은 Timer의 Clock source를 정확히 제어 하기 위하여 사용 된다.
  • Timer/Counter0와 Timer/Counter2의 Register
    • Timer/Counter(0,1,2,3,4,5 모두 6개)의 Timer/Counter Rg는 자료의 양이 많기 때문에 이곳에서는 요약된 자료만을 제공 한다. 정확한 코딩을 위하여 ATmega-2560_datasheet.pdf에서 해당 Timer의 자료를 확인 하는 것이 좋다.

      Timer/Counter2의 Control Rg는 대부분 Timer/Counter0의 Control Register와 기능이 동일 하다.

      Control Bit의 기능이 동일 하고 Timer/Counter 번호만 다른 경우Timer/Counter2의 설명은 생략 한다. 이 경우 Timer/Counter2의 Control Bit 이름은 Timer/Counter1의 Control Bit 이름에서 Timer 번호만 2로 변경 하면 돤다. 예: Timer0의 WGM01은 Timer2에서는 WGM21 이 된다.

    • Timer/Counter0,2 Control Register
      • TCCR0A - Timer/Counter0 Control Register A
      • TCCR2A - Timer/Counter2 Control Register A는 TCCR0A와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        • Bits 7:6 – COM0A1:0: Compare Match Output A Mode
          • WGM02:0과 COM0A1:0에 따라 Output Compare pin(OC0A)의 동작 Mode 가 결정 된다.
          • COM0A1:0 Bits 중 한 Bit 이상이 1 이고(Normal port operation 이 아닐 때), 이 Bit의 DDR Bit 가 Set 되었으면 OC0A 신호가 Pin에 출력(이 경우 이 Pin은 일반 I/O Port로 사용 할 수 없다) 된다.
          • 아래 Table은 non-PWM Mode(WGM02:0에 의 하여 결정 됨) 일때 COM0A1:0에 따른 OC0A Pin의 동작 Mode 이다.

          Compare Output Mode, non-PWM Mode(WGM02:0에 의 하여 결정 됨)

          Compare Output Mode, Fast PWM Mode(WGM02:0에 의 하여 결정 됨)

          Compare Output Mode, Phase Correct PWM Mode(WGM02:0에 의 하여 결정 됨)

        • Bits 5:4 – COM0B1:0: Compare Match Output B Mode
          • WGM02:0과 COM0B1:0에 따라 Output Compare pin(OC0B)의 동작 Mode 가 결정 된다.
          • COM0B1:0 Bits 중 한 Bit 이상이 1 이고(Normal port operation 이 아닐 때), 이 Bit의 DDR Bit 가 Set 되었으면 OC0B 신호가 Pin에 출력(이 경우 이 Pin은 일반 I/O Port로 사용 할 수 없다) 된다.
          • 아래 Table은 non-PWM Mode(WGM02:0에 의 하여 결정 됨) 일때 COM0B1:0에 따른 OC0B Pin의 동작 Mode 이다.

          Compare Output Mode, non-PWM Mode(WGM02:0에 의 하여 결정 됨)

          Compare Output Mode, Fast PWM Mode(WGM02:0에 의 하여 결정 됨)

          Compare Output Mode, Phase Correct PWM Mode(WGM02:0에 의 하여 결정 됨)

        • Bits 3, 2 – Res: Reserved Bits
        • Bits 1:0 – WGM01:0: Waveform Generation Mode
          • WGM02:0(WGM02은 TCCR0B Rg에 있음)는 Timer/Counter의 동작 Mode를 결정 한다.
          • Timer/Counter의 동작 Mode에 따라 아래 Table과 같이 다른 Waveform이 발생 된다.
          • Timer/Counter0,2는 Normal mode (counter), Clear Timer on Compare Match (CTC) mode와 2 종류의 Pulse Width Modulation(PWM) mode를 지원 한다.
      • TCCR0B - Timer/Counter Control Register B
      • TCCR2B - Timer/Counter2 Control Register B는 TCCR0B와 Clock Select 만 다르고 다른 기능은 동일 하고 번호만 다르다.

        • Bit 7 – FOC0A: Force Output Compare A
          • FOC0A bit는 non-PWM mode(WGM02:0에 의 하여 설정 됨)에서만 동작 한다.
          • non-PWM mode에서 이 Bit에 1을 Write 하면 Compare Match 가 발생 한 것과 같은 신호를 Waveform Generation unit에 가 하게 된다. 그 결과 OC0A Pin에는 COM0A1:0 bit의 설정에 따른 신로가 출력 된다.
          • FOC0A 신호는 Interrupt 신호를 발생 하지 않는다.
          • 이 Bit는 TCCR0에서 PWM mode로 설정된 경우 zero로 Clear 하여야 한다.
          • FOC0A bit는 쓰기만 할 수 있기 때문에 이 Bit를 읽으면 항상 zero가 된다.
        • Bit 6 – FOC0B: Force Output Compare B
          • FOC0B bit는 non-PWM mode(WGM02:0에 의 하여 설정 됨)에서만 동작 한다.
          • non-PWM mode에서 이 Bit에 1을 Write 하면 Compare Match 가 발생 한 것과 같은 신호를 Waveform Generation unit에 가 하게 된다. 그 결과 OC0B Pin에는 COM0B1:0 bit의 설정에 따른 신로가 출력 된다.
          • FOC0B 신호는 Interrupt 신호를 발생 하지 않는다.
          • 이 Bit는 TCCR0에서 PWM mode로 설정된 경우 zero로 Clear 하여야 한다.
          • FOC0B bit는 쓰기만 할 수 있기 때문에 이 Bit를 읽으면 항상 zero가 된다.
        • Bits 5:4 – Res: Reserved Bits
        • Bit 3 – WGM02: Waveform Generation Mode
          • 이 Bit는 TCCR0A Rg 내의 WGM01:0 와 같이 Waveform Generation Mode를 결정 한다.
        • Timer/Counter0 Clock Select Bits 2:0 – CS02:0 Clock Select
          • 이 Bits는 아래 Table과 같이 Timer/Counter0에 입력되는 Clock를 선택 하는 Clock Select bits 이다.

          Timer/Counter0 Clock Select Bit Description

        • Timer/Counter2 Clock Select Bits 2:0 – CS22:0
          • Timer/Counter2 Clock Select Bits는 아래 Table과 같다.

          Timer/Counter2 Clock Select Bit Description

    • TCNT0 - Timer/Counter Register
      • Timer/Counter2의 Timer/Counter Register는 Rg의 이름이 TCNT2 이다.

        TCNT2 - Timer/Counter2의 Timer/Counter Register는 TCNT0와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

      • Timer/Counter Register는 Count(Clock 또는 Event를 Counting) 값을 저장하는 8비트 Register 이다.
      • Timer/Counter Register는 직접 Read/Write 가 가능 하다.
      • Timer/Counter Register 가 동작 하는 중에 Counter 값을 변경 하는 것은 TCNT0 와 OCR0 Register의 Compare match를 missing 할 위험이 있다.
    • OCR0A, OCR0B - Output Compare Register
      • Timer/Counter 0의 8비트 Counter TCNT0과 비교하여 OC0A, OC0B 단자에 출력신호를 발생하기 위한 8비트 값을 저장하는 Register 이다.
      • Match(Counter 값과 Output Compare Register 값이 일치 하는 경우) 신호는 Output Compare interrupt과 OC0A pin 에 대응하는 신호를 발생 하는데 이용 된다.
      • Timer/Counter 0는 2개의 Output Compare Register(OCR0A, OCR0B) 가 있다.
      • OCR0A – Output Compare Register A

        OCR0B – Output Compare Register B

        Timer/Counter2의 Output Compare Register(OCR2A, OCR2B)는 Timer/Counter1의 Output Compare Register 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

    • Timer/Counter2의 ASSR - Asynchronous Status Register(이 Rg는 Timer/Counter2에만 있다.)
      • Bit 6 – EXCLK: Enable External Clock Input
        • EXCLK Bit 가 Set 되고, Asynchronous clock이 선택 되면 External clock input buffer 가 Enabled 되고 Timer Oscillator 1 (TOSC1) pin에 인가된 External clock이 선택 된다.
        • Crystal Oscillator는 이 Bit 가 zero 일 경우에만 동작 한다.
      • Bit 5 – AS2: Asynchronous Timer/Counter2
        • AS2 = 0 : 내부클럭 (clkI/O) 동기모드, Timer/Counter2에는 I/O clock(clkI/O)이 연결 된다.
        • AS2 = 1 : 외부클럭 (TOSC1) 비 동기모드, Timer/Counter2는 Timer Oscillator 1 (TOSC1) pin에 연결된 Crystal Oscillator에 의하여 clocked 된다.
      • Bit 4 – TCN2UB: Timer/Counter2 Update Busy
      • Bit 3 – OCR2AUB: Output Compare Register2 Update Busy
      • Bit 2 – OCR2BUB: Output Compare Register2 Update Busy
      • Bit 1 – OCR0UB: Output Compare Register0 Update Busy
      • Bit 1 – TCR2AUB: Timer/Counter Control Register2 Update Busy
      • Bit 0 – TCR2BUB: Timer/Counter Control Register2 Update Busy
    • TIMSK0,2 - Timer/Counter Interrupt Mask Register
    • Timer/Counter2의 Timer/Counter Interrupt Mask Register(TIMSK2)는 Timer/Counter0의 Interrupt Mask Register와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

      • Bits 7:3, 0 – Res: Reserved Bits
      • Bit 2 – OCIE0B: Timer/Counter Output Compare Match B Interrupt Enable
        • OCIE0B를 Set시키고, Status Register의 I-bit가 Set 되면 Output Compare Match B Interrupt가 활성화 된다.
        • 만약 Timer/Counter에서 Compare Match 가 발생 하면 TIFR0 Rg(Timer/Counter Interrupt Flag Register)의 OCF0B bit 가 Set 되고 대응 하는 Interrupt 가 실행 된다.
      • Bit 1 – OCIE0A: Timer/Counter0 Output Compare Match A Interrupt Enable
        • OCIE0A를 Set시키고, Status Register의 I-bit가 Set 되면 Output Compare Match A Interrupt가 활성화 된다.
        • 만약 Timer/Counter에서 Compare Match 가 발생 하면 TIFR0 Rg(Timer/Counter Interrupt Flag Register)의 OCF0A bit 가 Set 되고 대응 하는 Interrupt 가 실행 된다.
      • Bit 0 – TOIE0: Timer/Counter0 Overflow Interrupt Enable
        • TOIE0를 Set시키고, Status Register의 I-bit가 Set 되면 Overflow Interrupt가 활성화 된다.
        • 만약 Timer/Counter에서 Overflow 가 발생 하면 TIFR0 Rg(Timer/Counter Interrupt Flag Register)의 TOV0 bit 가 Set 되고 대응 하는 Interrupt 가 실행 된다.
    • TIFR0,2 - Timer/Counter Interrupt Flag Register
    • Timer/Counter2의 Timer/Counter Interrupt Flag Register(TIFR2)는 Timer/Counter0의 Interrupt Flag Register와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

      • Timer/Counter0 Interrupt Flag Bit
        • Bit 2 – OCF0B: Timer/Counter 0 Output Compare B Match Flag
          • TCNT0값과 OCR0B 값을 비교하여 이것이 같으면 이 비트가 1로 Set되면서, Output Compare Interrupt가 요청 된다. 이 비트는 인터럽트 처리의 시작과 함께 0으로 Clear된다.
          • 이 Bit에 1을 Write 하면 이 Bit는 Clear 된다.
          • SREG Rg의 I-bit와 OCIE0B(Timer/Counter Compare B Match Interrupt Enable) Bit 가 Set 된 상태에서 OCF0B Flag 가 Set 되면 대응 하는 Timer/Counter Compare Match Interrupt 가 실행 된다.
        • Bit 1 – OCF0A: Timer/Counter 0 Output Compare A Match Flag
          • TCNT0값과 OCR0A 값을 비교하여 이것이 같으면 이 비트가 1로 Set되면서, Output Compare Interrupt가 요청 된다. 이 비트는 인터럽트 처리의 시작과 함께 0으로 Clear된다.
          • 이 Bit에 1을 Write 하면 이 Bit는 Clear 된다.
          • SREG Rg의 I-bit와 OCIE0A(Timer/Counter Compare A Match Interrupt Enable) Bit 가 Set 된 상태에서 OCF0A Flag 가 Set 되면 대응 하는 Timer/Counter Compare Match Interrupt 가 실행 된다.
        • Bit 0 – TOV0: Timer/Counter0 Overflow Flag
          • Timer/Counter0에서 Overflow가 발생되면 이 비트가 1로 Set되면서 Output Compare Interrupt가 요청된다. 이 비트는 인터럽트 처리의 시작과 함께 0으로 Clear된다.
          • 이 Bit에 1을 Write 하면 이 Bit는 Clear 된다.
          • SREG Rg의 I-bit와 TOIE0 (Timer/Counter0 Overflow Interrupt Enable) Bit 가 Set 된 상태에서 TOV0 Flag 가 Set 되면 대응 하는 Timer/Counter Compare Match Interrupt 가 실행 된다.
    • GTCCR – General Timer/Counter Control Register
      • Bit 7 – TSM: Timer/Counter Synchronization Mode
        • 이 Bit 에 1 이 Writing 되면 Timer/Counter는 Synchronization 설정 Mode 가 된다.
        • 이 Mode가 설정 되면 PSRASY, PSRSYNC(Prescaler Reset) 상태가 유지 된다. 이 상태에서 대응하는 Timer/Counter는 멈추어서 안전하게 새로운 설정을 할 수 있게 된다.
        • 이 Bit에 0가 Write 되면 PSRASY, PSRSYNC가 Hardware에 의하여 Clear 되고 Timer/Counter는 Counting을 시작 하게 된다.
      • Bit 1 – PSRASY: Prescaler Reset Timer/Counter2
        • 이 Bit 에 1이 Writing 되면 Timer/Counter2 Prescaler 가 Reset 된다.
        • 그리고 이 Bit는 Hardware에 의하여 Clear 된다. (TSM Bit가 Set 된 경우에는 Clear 되지 않는다.)
  • Timer/Counter1,3,4,5의 Register
    • Timer/Counter1,3,4,5의 Control Rg는 자료의 양이 많기 때문에 이곳에서는 요약된 자료만을 제공 한다. 정확한 코딩을 위하여 ATmega-2560_datasheet.pdf에서 해당 Timer의 자료를 확인 하는 것이 좋다.

      Timer/Counter1,3,4,5의 Rg는 기능이 같기 때문에 여기서는 Timer/Counter1 Rg 만 설명 한다.

      Control Bit의 기능이 동일 하고 Timer/Counter 번호만 다른 경우Timer/Counter3,4,5의 설명은 생략 한다. 이 경우 Timer/Counter3,4,5의 Control Bit 이름은 Timer/Counter1의 Control Bit 이름에서 Timer 번호만 3,4,5번으로 변경 하면 돤다. 예: Timer1의 WGM11은 Timer3에서는 WGM31 이 된다.

    • 16-bit Registers의 Read/Write 동작
      • TCNTn, OCRnA/B/C, ICRn register는 16-bit registers 이다. 이 프로세서는 8-bit data bus를 사용 하기 때문에 16-bit registers는 2번 Read/Write 동작을 실행 하여야 한다.
      • 16-bit registers는 High와 Low 두 Byte로 구성 되어 있고 High Byte를 읽기 위하여 Temporary Register를 이용 한다. Temporary Register는 모든 16 Bit Rg가 공통으로 사용 하기 때문에 주의를 요 한다.
      • 16 Bit Rg의 Read Operation: Low Byte를 먼저 읽고(Low Byte를 읽을 때 High Byte가 Temporary Rg에 복사 됨) High Byte를 읽는다.
      • 16 Bit Rg의 Write Operation: High Byte를 먼저 Write 하고(High Byte는 Temporary Rg에 임시로 저장되고, Low Byte를 Write 할 때 16 bit Rg에 복사 된다.) Low Byte를 Write 한다.
      • c 프로그램에서는 16Bit 정수를 사용 하여 16 Bit Rg에 Read/Write 한다.
    • Timer/Counter1,3,4,5 Control Register
      • TCCR1A - Timer/Counter1 Control Register A
      • TCCR3A, TCCR4A, TCCR5A - Timer/Counter3,4,5 Control Register A는 TCCR1A와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        • Bit 1:0 – WGMn1:0: Waveform Generation Mode
        • Waveform Generation Mode Bit Description(Timer3,4,5는 Timer 번호(n)만 다르다.)

          WGMn1:0과 WGMn3:2(TCCRnB Register에 있음)에 의하여 아래 Table과 같이 동작 모드(Waveform Generation Mode)가 결정 된다.


        • Compare Output Mode 설정
          • Bit 7:6 – COMnA1:0: Compare Output Mode for Channel A
          • Bit 5:4 – COMnB1:0: Compare Output Mode for Channel B
          • Bit 3:2 – COMnC1:0: Compare Output Mode for Channel C
          • COMnA1:0, COMnB1:0, COMnC1:0는 Output compare pins(OCnA, OCnB, OCnC)의 동작(출력 모드)을 제어 하는 Bit이다.

            Output compare pins에 Compare Output 신호가 출력 되기 위하여는 대응 하는 Data Direction Register(DDR) bit 가 1로 Set(Output Port) 되어야 한다.

            Normal port operation(0:0) 인 경우 OCnA/OCnB/OCnC은 Disconnected 되어 해당 Pin은 일반 I/O Port로 사용(I/O Port에서 Alternate Functions를 참고 할 것)할 수 있다.

            아래 Table(3개)은 동작 모드(WGMn3:0 에 의하여 설정됨)에 따른 Compare Output Mode에 대한 설명 이다.

          • non-PWM Mode에서 Compare Output Mode 설정에 따른 출력
          • Fast PWM Mode에서 Compare Output Mode 설정에 따른 출력
          • Phase Correct PWM Mode에서 Compare Output Mode 설정에 따른 출력

      • TCCR1B - Timer/Counter1 Control Register B
      • TCCR3B, TCCR4B, TCCR5B - Timer/Counter3,4,5 Control Register B는 TCCR1B와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        • Bit 7 – ICNCn: Input Capture Noise Canceler
          • 이 Bit가 1로 Set되면 Input Capture Noise Canceler가 동작 하게 된다.
          • Noise Canceler가 동작 하게 되면 Input Capture Pin (ICPn)의 입력이 Filtering 된다.
          • Filtering 동작에 4개의 Oscillator cycle이 필요 하기 때문에 Input Capture는 4개의 Oscillator cycle 만큼 지연 된다.
        • Bit 6 – ICESn: Input Capture Edge Select
          • 이 Bit는 Input Capture Pin에 입력 되는 Capture event(Trigger)의 Edge를 선택 한다.
          • 이 Bit가 Zero인 경우 Falling edge에서 Capture 동작(Triggering)이 실행 된다.
          • 이 Bit가 One인 경우 Rising edge에서 Capture 동작(Triggering)이 실행 된다.
          • Capture 동작(Triggering)이 실행되면 Counter Rg의 값이 Input Capture Register (ICRn)에 복사 된고, Capture Flag (ICFn)가 Set 된다.

          • 만약 Input Capture Interrupt이 Enable 된 상태에서 Capture Flag (ICFn)가 Set 되면 Interrupt 가 발생 하게 된다.
          • ICRn 이 TOP value로 사용(WGMn3:0 bits에 의하여 설정 됨) 되면 ICPn Pin은 Disconnected 되고, Input capture function은 Disable 된다.
        • Bit 5 – Reserved Bit
        • Bit 4:3 – WGMn3:2: Waveform Generation Mode
        • 이 Bit(WGMn3:2)와 WGMn1:0(TCCRnA Register에 있음)에 의하여 동작 모드(Waveform Generation Mode)가 결정(TCCRnA Register 참고 바람) 된다.

        • Bit 2:0 – CSn2:0: Clock Select
        • 이 3 Bits는 아래 Table과 같이 Clock source를 결정 한다.

          만약 external pin mode 가 선택 되고, Tn pin이 Output으로 설정 되면 Tn pin에 입력 되는 Pulse가 Counter의 Clock이 된다. 이 경우 이 Counter를 Event Counter로 사용 할 수 있다. 또한 이 경우 Software control에 의한 Counting 이 가능 하다.

      • TCCR1C - Timer/Counter1 Control Register
      • TCCR3C, TCCR4C, TCCR5C - Timer/Counter3,4,5 Control Register C는 TCCR1C와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        • Bit 7 – FOCnA: Force Output Compare for Channel A
        • Bit 6 – FOCnB: Force Output Compare for Channel B
        • Bit 5 – FOCnC: Force Output Compare for Channel C
          • FOCnA/FOCnB/FOCnC는 Non-PWM mode 에서만 동작 한다.
          • 이 Bit에 1을 Write 하면 Compare Match 가 발생 한 것과 같은 신호를 COMnx1:0 bits의 설정에 따라 OCnA/OCnB/OCnC 단자에 즉시(강제로) 출력 한다.
          • 이 Bit의 제어에 의하여 발생된 신호는 Interrupt를 발생 시키지 않는다.
          • Clear Timer on Compare Match (CTC) mode에서 이 신호는 Timer를 Clear 하지 않는다.
        • Bit 4:0 – Reserved Bits
    • Timer/Counter1,3,4,5의 Counter Register
      • TCNT1H and TCNT1L - Timer/Counter1
      • TCNT3, TCNT4, TCNT5 - Timer/Counter3,4,5의 Counter Register는 TCNT1과 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        • Timer/Counter Register는 Count(Clock 또는 Event를 Counting) 값을 저장하는 16비트(TCNTnH and TCNTnL, combined TCNTn) Register로 Read/Write 가 가능 하다.
        • 16-bit Rg의 Read/Write 동작 시 High Byte Rg는 Temporary Register를 이용 한다. Temporary Register는 모든 16-bit Rg 가 공동으로 이용 하기 때문에 주의를 요 한다.
        • Timer/Counter Register 가 동작 하는 중에 Counter 값을 변경 하는 것은 TCNTn 와 OCRnx Register의 Compare match를 missing 할 위험이 있다.
    • Output Compare Register
      • OCR1AH and OCR1AL - Output Compare Register 1 A
      • OCR1BH and OCR1BL - Output Compare Register 1 B
      • OCR1CH and OCR1CL - Output Compare Register 1 C
      • OCR3A,B,C, OCR4A,B,C, OCR5A,B,C - Timer/Counter3,4,5의 Output Compare Register는 OCR1A,B,C와 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        Counter TCNT1(TCNTn)과 비교하여 OC1x(OCRnx) 단자에 출력신호를 발생하기 위한 16비트 값을 저장하는 Register 이다.

    • Input Capture Register
      • ICR1H and ICR1L - Input Capture Register 1
      • ICR3, ICR4, ICR5 - Timer/Counter3,4,5의 Input Capture Register는 ICR1과 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

      • Input Capture는 ICPn pin에 Event가 발생 하는 순간의 Counter(TCNTn) 값을 저장 한다. 이 값을 이용 하여 Enent 신호의 발생 시간을 측정 할 수 있기 때문에 펄스 폭 측정 등 여러가지 시간에 관련된 측정에 이용 된다.
      • Input Capture Rg의 값은 Waveform Generation Mode 중 일부의 Counter TOP value로 사용 된다.
    • Interrupt Mask Register
      • TIMSK1 - Timer/Counter1 Interrupt Mask Register
      • TIMSK3, TIMSK4, TIMSK5 - Timer/Counter3,4,5의 Interrupt Mask Register는 TIMSK1과 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        • Bit 5 – ICIEn: Timer/Countern, Input Capture Interrupt Enable
          • 이 Bit가 Set 되고 Status Register의 I-flag 가 Set 되면 Timer/Counter1의 Input Capture interrupt 가 Enable 된다.
          • 이 Interrupt 가 Enable된 상태에서 TIFR Rg의 ICF1 flag가 Set 되면 Timer/Counter1의 Input Capture interrupt Service Routine 이 실행 된다.
        • Bit 3 – OCIE1C: Timer/Counter1, Output Compare C Match Interrupt Enable
          • 이 Bit가 Set 되고 Status Register의 I-flag 가 Set 되면 Timer/Counter1의 Output Compare C Match Interrupt 가 Enable 된다.
          • 이 Interrupt 가 Enable된 상태에서 TIFR Rg의 OCF1C flag가 Set 되면 Timer/Counter1의 Output Compare C Match Interrupt Service Routine 이 실행 된다.
        • Bit 2 – OCIE1B: Timer/Counter1, Output Compare B Match Interrupt Enable
          • 이 Bit가 Set 되고 Status Register의 I-flag 가 Set 되면 Timer/Counter1의 Output Compare B Match Interrupt 가 Enable 된다.
          • 이 Interrupt 가 Enable된 상태에서 TIFR Rg의 OCF1B flag가 Set 되면 Timer/Counter1의 Output Compare B Match Interrupt Service Routine 이 실행 된다.
        • Bit 1 – OCIE1A: Timer/Counter1, Output Compare A Match Interrupt Enable
          • 이 Bit가 Set 되고 Status Register의 I-flag 가 Set 되면 Timer/Counter1의 Output Compare A Match Interrupt 가 Enable 된다.
          • 이 Interrupt 가 Enable된 상태에서 TIFR Rg의 OCF1A flag가 Set 되면 Timer/Counter1의 Output Compare A Match Interrupt Service Routine 이 실행 된다.
        • Bit 0 – TOIE1: Timer/Counter1, Overflow Interrupt Enable
          • 이 Bit가 Set 되고 Status Register의 I-flag 가 Set 되면 Timer/Counter1의 Overflow Interrupt 가 Enable 된다.
          • 이 Interrupt 가 Enable된 상태에서 TIFR Rg의 TOV1 flag가 Set 되면 Timer/Counter1의 Overflow Interrupt Service Routine 이 실행 된다.
    • Interrupt Flag Register
      • TIFR1 - Timer/Counter1 Interrupt Flag Register
      • TIFR3, TIFR4, TIFR5 - Timer/Counter3,4,5의 Interrupt Flag Register는 TIFR1과 기능이 동일 하고 번호만 다르기 때문에 설명을 생략 한다.

        • Bit 5 – ICF1: Timer/Counter1, Input Capture Flag
          • 이 Flag는 ICP1 pin에 Event 가 발생 하였을 때 Set 된다.
          • Input Capture Register(ICR1) 가 WGMn3:0 에서 Top value로 시용 되는 경우 Counter 값이 Top에 도달 하면 Set 된다.
          • 이 Flag는 Input Capture Interrupt vector가 실행 되거나, 이 Bit에 1을 Write 하면 Clear 된다.
        • Bit 3 – OCF1C: Timer/Counter1, Output Compare C Match Flag
          • 이 Flag는 Counter(TCNT1) 값이 Output Compare Register C(OCR1C) 값과 Matche 되었을 때 Set 된다.
          • 이 Flag는 Output Compare Match C interrupt vector가 실행 되거나, 이 Bit에 1을 Write 하면 Clear 된다.
          • Forced output compare (FOC1C) strobe에 의하여는 Set 되지 않는다.
        • Bit 2 – OCF1B: Timer/Counter1, Output Compare B Match Flag
          • 이 Flag는 Counter(TCNT1) 값이 Output Compare Register B(OCR1B) 값과 Matche 되었을 때 Set 된다.
          • 이 Flag는 Output Compare Match B interrupt vector가 실행 되거나, 이 Bit에 1을 Write 하면 Clear 된다.
          • Forced output compare (FOC1B) strobe에 의하여는 Set 되지 않는다.
        • Bit 1 – OCF1A: Timer/Counter1, Output Compare A Match Flag
          • 이 Flag는 Counter(TCNT1) 값이 Output Compare Register A(OCR1A) 값과 Matche 되었을 때 Set 된다.
          • 이 Flag는 Output Compare Match A interrupt vector가 실행 되거나, 이 Bit에 1을 Write 하면 Clear 된다.
          • Forced output compare (FOC1A) strobe에 의하여는 Set 되지 않는다.
        • Bit 0 – TOV1: Timer/Counter1, Overflow Flag
          • 이 Flag는 Normal mode와 CTC mode(WGMn3:0 bits에 의하여 설정 됨)에서 timer overflow가 발생 할 때 Set 된다.
          • 이 Flag는 Timer/Counter1 Overflow interrupt vector가 실행 되거나, 이 Bit에 1을 Write 하면 Clear 된다.

  • Time Delay 구현 하기
    • Embedded system은 실시간으로 장치를 제어하기 위한 목적으로 자주 사용하기 때문에 시간에 관련한 함수(일정한 주기(Time period)를 필요로 하는 경우, 일정한 시간 지연(Time dealy) 후에 장치를 제어 하는 경우)를 자주 필요로 한다.

    • Software time delay
      • 프로그램의 다른 부분에 영향을 미치지 않고 오직 시간 지연 만을 갖는 명령을 실행 하도록 하여 Time delay 기능을 구현 한다.

      • 장점
        • 이해 하기 쉽다. Timer, Interrupt등의 이해를 필요로 하지 않는다.
        • Delay function 실행 중에도 다른 Interrupt routine의 실행이 가능 하다.
      • 단점
        • Delay time이 부정확 하다.
        • Delay function 실행 중 다른 Task의 실행이 불가 하다.
          • Delay function 실행 중 다른 Interrupt routine이 실행되는 경우 Delay time이 변동 된다.

        위와 같은 이유 때문에 처음 Embedded system을 배우는 사람이 쉽고 간단하게 Delay function를 구현 하는데 적합 하다.

      • Software time delay를 사용 하는 프로그램 예:
    • External interrupt와 Timer를 이용한 Time delay
      • External interrupt 가 발생 하면 Time delay timer가 Start 되고 설정된 Time delay 후에 Timer interrupt 가 발생 되도록 한다.

      • 장점
        • Timer에 의하여 정확한 Delay time이 구현 된다.
        • Time delay가 Hardware(Timer)에 의하여 구현되기 때문에 Time delay 동작이 실현 되는 동안 다른 Routine의 실행이 용이 하다.
      • 단점
        • Embedded processor에 대한 이해(External interrupt, Timer에 대한 이해)가 필요 한다.
        • Time delay에 사용 하는 Timer를 다른 목적으로 사용 하기 어렵다.
      • External interrupt와 Timer를 이용한 Time delay 프로그램 예:
    • Software Counter와 Hadware Timer를 이용한 Time delay
      • 넓은 범위의 Delay time 설정을 가능 하게 하기 위하여 Software Counter와 Hadware Timer(기본 Delay time 설정)을 결합하여 Delay time을 결정 한다.

      • 장점
        • 비교적 정확한 Delay time, 넓은 범위의 Delay time을 구현 할 수 있다.
        • Delay time 함수 실행 중 External interrupt이 실행 되어도 비교적 정확한 Delay time을 구현 할 수 있다.
      • 단점
        • Embedded processor에 대한 이해(External interrupt, Timer에 대한 이해)가 필요 한다.
        • Time delay에 사용 하는 Timer를 다른 목적으로 사용 하기 어렵다.
      • Keypad Debouncing에 Timer(Timer2를 이용)를 이용한 Delay 함수를 이용 하는 예
    • Real time clock(Timer를 이용)를 이용한 Time delay
      • Arduino에서 사용하는 방법(wiring.c)으로 timer0를 이용하여 Time delay 와 Real time clock를 구현 한다.

      • 장점
        • 하나의 Timer(Timer0)를 사용하여 넓은 범위의 Time delay(mSec와 uSec Time delay)와 Real time clock를 구현 할 수 있다.
        • Delay time 함수 실행 중 External interrupt이 실행 되어도 정확한 Delay time을 구현 할 수 있다.
      • 단점
        • 넓은 범위의 Time delay(mSec와 uSec Time delay)와 Real time clock이 필요 없는 경우 프로그램이 크고 초보자는 이 함수를 이해(변경) 하기 어렵다.
      • Arduino(wiring.c) timer0를 이용 하여 Time delay(mSec Time delay, uSec Time delay) 와 clock를 구현 하는 프로그램이다. 이 예는 wiring.c를 ATmega2560과 ATmega128에 적합 하도록 단순화 하고 초보자도 이해 하기 쉽도록 프로그램 설명을 추가 하였다.

  • Timer/Counter 응용 프로그램 예
    • Push button switch와 LED array를 사용하는 실험을 위한 회로 구성 예

    • Overflow Interrupt를 이용하여 일정한 주기를 발생 시키는 프로그램 예: cho_timer1_TOIE1_int_clk_LED_2560.zip
      • Timer1의 Overflow Interrupt를 이용하여 일정한 주기의 Interrupt(Clock)을 발생시키는 프로그램의 일부로 Timer 초기화와 Interrupt Service Routine의 예 이다.

        timer1_overflow_int_clock_gen_c.txt

      • 실험을 위한 준비
      • 실험 방법
        • cho_timer1_TOIE1_int_clk_LED_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_timer1_TOIE1_int_clk_LED_2560.hex를 개발 보드에 Upload 한다.
        • 실험:
          • 개발 보드의 Reset SW를 누르면 LED가 1SEC 간격으로 점멸한다.
          • UART1 통신선이 연결되고 모니터 프로그램이 실행 중인 경우 모니터에 "Timer 1 Overflow Interrupt(Clock Gen.)" 메세지가 출력된다. 이 실험은 UART1 통신선을 연결하지 않아도 문제가 발생하지 않는다. 그러나 프로그램 개발 단계에 Debugging을 위하여 UART1 통신선을 연결하고 실험하는 것이 좋다.

    • Compare Match Interrupt를 이용하여 일정한 주기를 발생 시키는 프로그램 예: cho_timer1_OCIE1_int_clk_LED_2560.zip
      • Timer1의 Compare Match Interrupt를 이용하여 일정한 주기의 Interrupt(Clock)을 발생시키는 프로그램의 Timer 초기화와 Interrupt Service Routine 예 이다.

        timer1_COMPA_int_clock_gen_c.txt

      • 실험을 위한 준비와 실험 방법은 위 "Overflow Interrupt를 이용하여 일정한 주기를 발생 시키는 프로그램 예"를 참고 바람.
    • Arduino의 wiring.c를 응용(timer0 사용) 하여 mSec clock를 구현 하고 이를 이용 하여 LED의 회전 방향을 제어(SW 이용) 하는 C++ 프로그램 예: cho_led_rotate_timer0_cpp_2560.zip
      • 실험을 위한 준비
      • 실험 방법
        • cho_led_rotate_timer0_cpp_2560.zip 파일을 Download하여 압축을 해제한다.
        • cho_led_rotate_timer0_cpp_2560.hex를 개발 보드에 Upload 한다.
        • 실험: Push button switch(PD0)를 누르면 LED가 Left로 회전 하고,Push button switch(PD1)를 누르면 LED가 Right로 회전 한다.
    • Timer를 이용한 Event Couting 프로그램 예: cho_event_counter_timer1_2560.zip
      • Timer1의 TCNT1 Register를 이용 하여 Event를 Counting 하는 예 이다.

      • event_counter_c.txt
      • Event Counting 프로그램 설명
        • Timer5의 TCNT5 Register를 Event Counting 목적으로 사용 한다.
        • Timer5의 Input Capture Register는 Event Counting(TCNT5)을 Capture 하기 위한 Rg로 사용 한다.
        • Timer3A의 Output Compare(OC3A)를 측정 주기(0.25Sec) 발생 목적으로 사용 한다.
        • Timer2의 Output Compare(OC2A)를 피 측정 Event 발생 장치로 사용 한다.
        • LCD를 출력 장치로 사용 한다.
      • 실험에 필요한 신호 연결
        • Event 신호 연결 : Event 신호 출력단자(OC2A(Digital Pin 10)) --> Timer5 Counter 신호 입력(T5(Digital Pin 47))에 연결 한다.
        • Input Capture 신호 연결 : 측정 주기 신호(OC3A(Digital Pin 5)) --> Timer5의 Input Capture 입력 단자(ICP5(Digital Pin 48))에 연결 한다.
      • 실험 방법
        • Keypad에서 입력된 제어 문자를 이용하여 Event 발생 주기를 변경 한다.

        • * Key: Event Speed Up: Event 발생 주기를 빠르게 한다.
        • # Key: Event Speed Dpwn: Event 발생 주기를 느리게 한다.
    • Input Capture Mode를 이용한 Pulse Width 측정 프로그램 예: cho_input_capture_pulse_width_ms_2560.zip
      • Timer1A의 Input Capture Register를 이용 하여 펄스 폭을 측정 하는 예 이다.

      • Pulse Width 측정 프로그램 설명
        • Timer5의 Input Capture Register는 펄스 폭을 측정 하기 위한 Rg로 사용 한다.
        • Timer5A의 Output Compare Register(OCR5A)는 피 측정 펄스를 발생 시키기 위하여 사용 한다.
      • 실험에 필요한 신호 연결
        • 측정 신호 연결 : 펄스폭 측정을 위한 신호(OC5A(PL3:Digital pin 46)) --> Timer5의 Input Capture 입력 단자(ICP5(PL1: Digital pin 48))에 연결 한다.
      • 실험 방법
        • Keypad에서 입력된 제어 문자를 이용하여 피 측정 신호의 Pulse 폭을 변경 한다. 측정 결과는 LCD에 PWM Duty로 표시 됨.

        • * Key: Keypad의 * Key를 누르면 Pulse 폭이 넓어 진다.
        • # Key: Keypad의 # Key를 누르면 Pulse 폭이 좁아 진다.
    • PWM를 이용한 전력제어 프로그램 예: cho_led_PWM_bright_contorl_2560.zip
      • PWM(Timer1)를 이용하여 LED 의 밝기(실효 전력) 제어)를 제어하는 예 이다.

      • PWM를 이용한 전력제어 프로그램 설명
        • PWM(Timer1)를 이용하여 LED 의 밝기(실효 전력)를 제어 한다.
        • External Interrupt(PD0,PD1)를 이용하여 PWM의 Duty를 변경 한다.
          • PD0 SW를 누르고 있으면 LED가 점점 밝아 진다. LCD 상단에 PWM Duty가 표시 됨.
          • PD1 SW를 누르고 있으면 LED가 점점 어두워 진다.
        • Timer3 Overflow Interrupt는 PWM의 Duty를 Update 하는 주기(100mSec) 신호를 발생(SW를 계속 누르고 있는 경우 밝기가 점점 밝아 지거나 어두어 지도록 제어) 시킨다.
      • 실험 방법
        • PD0 SW를 누르고 있으면 LED가 점점 밝아 지고,
        • PD1 SW를 누르고 있으면 LED가 점점 어두워 진다.
    • DC Motor를 이용한 Event counting과 Pulse width 측정
      • 실험에서 기대하는 목표
        • External interrupt 와 Timer를 이용한 Time delay(Debouncing) 기술
        • PWM을 이용한 전력제어(이 예에서는 DC Motor의 속도 제어에 이용 함)
        • DC Motor의 속도에 비례한 Event(Pulse) 신호 발생
        • 모터 속도 측정은 아래와 같이 Event(Pulse) 신호를 Counting 하는 방법과 신호의 Pulse width 측정하는 두가지 방법으로 실행한다.
          • Event(Pulse) 신호 Counting: 일정한 시간 동안 발생한 Event를 counting
          • Event(Pulse) 신호의 Pulse width 측정: 현재 센서에서 다음 센서 까지 도달하는 시간이 펄스 폭으로 측정 된다.

        Event counting과 Pulse width 측정을 위한 시스텀 구성

        Motor speed detector 회로 예(LED는 Hall sensor의 동작을 확인하기 위한 것임. LED를 사용하지 않는 경우에는 LED를 제거하고 330Ω 저항을 VCC에 따라 2K - 5K 사이의 저항으로 변경한다.)

      • DC Motor를 이용한 Event counting(Motor 속도 측정) 예: cho_dc_motor_speed_event_counter_2560.zip
        • 실험을 위한 회로 구성
          • AVR 보드 OC1A(PB5) <-> DC Motor Driver 모듈 Enable 단자
          • AVR 보드 PG0(모터 회전 방향 제어) <-> DC Motor Driver 모듈 Dir 단자
          • AVR 보드 T5(PL2: Digital pin 47) <-> Motor speed detector 회로의 Event 신호
        • 실험 방법
          • Console 프로그램을 실행 한다. Baud rate: 19200, Port 번호는 PC의 제어판 -> 하드웨어 및 소리 -> 장치 관리자 -> 포트(COM & LPT)에서 확인 할 것.
          • PD0(Speed up) Switch를 누르면 모터의 속도가 빨라 진다. PWM Duty와 1 Sec 간 발생한 Event 수가 Console에 출력 된다.
          • PD1(Speed down) Switch를 누르면 모터의 속도가 느려 진다. PWM Duty와 1 Sec 간 발생한 Event 수가 Console에 출력 된다.
      • DC Motor를 이용한 Pulse width 측정(Motor 속도 측정) 예: cho_dc_motor_speed_pulse_width_2560.zip
        • 실험을 위한 회로 구성
          • AVR 보드 OC1A(PB5) <-> DC Motor Driver 모듈 Enable 단자
          • AVR 보드 PG0(모터 회전 방향 제어) <-> DC Motor Driver 모듈 Dir 단자
          • AVR 보드 ICP4(PL0: Digital pin 49) <-> Motor speed detector 회로의 Event 신호
        • 실험 방법
          • Console 프로그램을 실행 한다. Baud rate: 19200, Port 번호는 PC의 제어판 -> 하드웨어 및 소리 -> 장치 관리자 -> 포트(COM & LPT)에서 확인 할 것.
          • PD0(Speed up) Switch를 누르면 모터의 속도가 빨라 진다. PWM Duty와 1 Sec 간 발생한 Event 값(Event 수 x 32)이 Console에 출력 된다.
          • PD1(Speed down) Switch를 누르면 모터의 속도가 느려 진다. PWM Duty와 1 Sec 간 발생한 Event 값이 Console에 출력 된다.
      • Pulse width 측정 기술을 이용한 초음파 거리 센서(HC-SR04) 예