AVR(Atmega128)-Timer/Counter_1(Non-PWM)

공이지·2024년 6월 2일

Timer/Counter

AVR의 타이머/카운터가 가진 특징

  • 타이머/카운터가 4개이며, 관련된 레지스터가 40여 개 정도가 있다. (AVR에서 제일 많다.)
  • 인터럽트 또한 각각 타이머/카운터마다 다르며, 그 종류 (오버플로우, 아웃풋 컴페어) 등 또한 많다.
  • 시스템의 클럭의 계산 및 분주 비의 개념을 정확하게 알고 있어야 한다.
  • 타이머/카운터는 인터럽트에 시간이 더해진 형태라고 보시면 됩니다.
  • 타이머가 일정 주기로 신호를 주면 카운터가 그것을 셈 하여서 (8비트의 경우) 256 (최댓값)을 넘어가면 넘침 (오버플로우) 가 발생하게 되는데, 이 때 인터럽트가 발생되어 원하는 명령을 처리하는 방식입니다!

참조 : Timer/Counter

Atmega1288비트(Timer/Counter 0,2), 16비트(Timer/Counter 1,3) Timer/Counter 2개를 제공합니다

  • Timer/Counter는 기본적으로 입력 펄스를 센다. 펄스를 세기 위해서는 입력 펄스가 존재해야하는데 이는 마이크로컨트롤러의 시스템 클록이나 외부에서 주어지는 클록 중에서 선택하여 사용할 수 있다.
  • 기본적으로 8비트 Timer/Counter는 0~255까지 셀 수 있다. Atmega128의 내부 클록은 16MHz속도로 동작ㅇ하므로 0에서 다시 0으로 돌아오기까지의 시간, 즉 256번 카운트하는 시간은 256/16M = 0.016ms에 지나지 않습니다. 8비트 카운터로는 0.016ms보다 긴 시간을 측정할 수 없으므로 분주기(Prescaler)를 사용하요 사용된 클록에 비해 주기가 긴 클록을 생성하여 긴 시간을 측정할 수 있습니다.
  • 카운터로 센 펄스의 수는 TCNTn 레지스터에 저장됩니다. 펄스의 개수가 셀수 있는 최댓값을 넘어가면 오버플로가 발생합니다. 이 때 오버플로가 발생하는 시간은 Clock과 분주비(Prescaler)로 결정할 수 있습니다. 보다 정확한 시간을 측정하려면 Compare Match Interrupt를 사용하여 정확한 시간을 측정할 수 있습니다.
  • Compare Match Interrupt(비교일치 인터럽트)TCNTn 레지스터에 저장된 현재까지의 펄스 개수가 미리 설정된 값과 동일 할 때 발생합니다. "미리 설정된 값"OCRn이라는 OutPut Compare Register에 저장됩니다. Compare Match Interrupt와는 별도로 OutPut Compare가 발생하면 OCn 핀을 통해 지정된 파형을 출력합니다. Timer/Counter의 세부 동작들 즉! 어떤모드로 동작하고 몇 비트로 Timer/Counter를 사용할 것이고, 어떤 클록을 선택할 것인지 TCCRn 레지스터로 정할 수 있다.

TCCRn

  • TCCRn 레지스터로 사용가능한 여러가지모드




  • 위 표들의 정보로 설계하고자하는 Timer/Counter를 TCCRn레지스터로 설정할 수 있다. 먼저 알아 볼 것은 OverFlow Interrupt이다.

1. OverFlow Interrupt,



  • 위에서 소개한 TCCrnCS0n비트들로 우리는 클록을 선택할 수 있었다. 이를 활용해 TiMSKTIFR레지스터로 인터럽트(2가지 Compare Match interrupt, OverFlow interrupt)를 활성화 시킬 수 있다.
  • TIMSK레지스터 중 Timer/Counter 0번 과 관련 있는 비트는 OCEI0TOIE0이다 OCEI0비트는 Compare Match interrupt활성화를 위해 사용하고 TOIE0 비트는 OverFlow interrupt 활성화를 위해 사용된다.
  • Interrupt가 해당하는 조건을 만족하면 TIFR 레지스터의 해당 비트가 먼저 세트된다. TIFR레지스터는 해당 비트가 세트 되었을 때 TIMSK레지스터의 해당 비트 역시 세트된 상태라면 실제로 Interrupt가 발생한다.

2.Compare Match

  • Compare Match Interrupt 를 사용하기 위해서는 OCR0(OutPut Compare Register)에 값을 설정해줘야한다.
  • 위 코드를 보면 OCR0에 249라는 값을 설정하여 TCNT0레지스터의 값과 비교하여 TIFR 레지스터의 2번째 비트를 활용해 OCR0 레지스터와 일치하는지 비교하는 코드입니다. 기본적으로 CTC모드 를 사용하고 있습니다. CTC모드일 경우 TOP값은 OCR0 이므로 일치하지 않을경우 while문에 갇히게 되고 일치하면 TIFR레지스터의 OCF0비트가 세트되면서 OC0핀의 상태가 토글 됩니다. 즉 타이머값과 OCR0값이 일치하면 OC0핀의 상태가 토글되는 PWM신호를 생성합니다.

3.파형생성

위의 코드는 CTC모드를 사용해 파형을 생성했습니다. 몇개의 파형 생성 모드가 있는지 알아봅시다.

  • 위 그림에서 WGM0n 비트 설정으로 파형 생성모드를 결정할 수 있습니다.
    8비트 Timer/Counter에서는 (Timer/Counter 0,2) CTC모드와 정상모드일때만 설명하겠다. 정상모드일때는 Interrupt가 발생할 때TCNT0 레지스터값을 0으로 설정해줘야 하지만 CTC모드일 때는 자동으로 0으로 설정된다.
  • 위의 코드를 보면 우리는 1<<COM00를 하여 OC0핀의 상태를 반전시켰다. 즉, Compare Match가 발생하면 OC0핀이 반전된다는 의미이다.

  • 위는 노말모드의 카운터입니다. CTC모드와 다르게 TCNT0레지스터를 초기화 시켜줍니다. 그리고 직접 출력핀(PORTD5)를 반전시켜주고 있습니다. TCNT0 = 6인 이유는 분주비를 계산하였을때 나온 값과 TCNT0의 값을 더해서 오버플로우가 발생할 때 TIFR레지스터의 TOV0를 세트시켜 출력핀의 파형을 반전시키기 위함입니다.

#ASSR레지스터는 비동기상태의 동작을 사용할 경우 사용되는 레지스터이다.(다음에 공부하여 정리하겠습니다.)

profile
화이팅..!

0개의 댓글